Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Flaker
2 / 2 / 0
Регистрация: 07.07.2012
Сообщений: 90
#1

Инъекция своего кода в функцию открытой программы - C++

29.08.2013, 17:18. Просмотров 688. Ответов 2
Метки нет (Все метки)

Пишу библиотеку, которая при ее присоединении к процессу подменяет функцию MessageBoxA на свою.

По сути, для подмены необходимо сделать jmp к адресу своей функции при вызове стандартной...

Так вот вопрос, как внедрить jmp в начало стандартной функции?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2013, 17:18     Инъекция своего кода в функцию открытой программы
Посмотрите здесь:
C++ Вставка своего кода в чужой процесс. *nix
C++ Интересная задача. (вывод своего кода на экран)
Вынести основную часть кода кода в отдельную функцию C++
C++ Вызвать функцию из внешнего (своего) процесса без окна
C++ Вылет программы с классом своего стека
C++ Нужно разработать функцию, которая выводит последние N строк из своего файла ввода
Использование своего объекта своего класса внутри другого C++
Сюръекция, инъекция, биекция.Функции C++
Из кода понять функцию C++
C++ Вынести часть кода в функцию
Создание кода программы с нуля!! создание кода C++ C++
C++ Правильность кода программы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.08.2013, 17:33     Инъекция своего кода в функцию открытой программы #2
Flaker, а зачем внедрять в начало стандартной функции? Не проще ли заменить вызов MessageBoxA на jmp или поставить перед ним?
Flaker
2 / 2 / 0
Регистрация: 07.07.2012
Сообщений: 90
29.08.2013, 19:05  [ТС]     Инъекция своего кода в функцию открытой программы #3
Вызовов может быть много же... Из разных мест...

Добавлено через 1 час 29 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void InterceptFunctions(void)
{
  DWORD op;
  //сначала получим абсолютный адрес функции для перехвата
  adr_MessageBoxA = (DWORD)GetProcAddress(GetModuleHandle( (LPCTSTR)"user32.dll" ),
                    "MessageBoxA");
  if(adr_MessageBoxA == 0)
  {
    MessageBox(NULL, (LPCTSTR)"Can`t get adr_MessageBoxA", (LPCTSTR)"Error!", 0);
    return;
  }
 
  // Зададим машинный код инструкции перехода, который затем впишем 
  // в начало полученного адреса:
  jump.instr_push = 0x68;
  jump.arg = (DWORD)&Intercept_MessageBoxA;
  jump.instr_ret = 0xC3;
 
  //Прочитаем и сохраним первые оригинальные 6 байт стандартной API функции
  ReadProcessMemory(GetCurrentProcess(),(void*) adr_MessageBoxA, 
                    (void*)&old, 6, &written);
 
    //Запишем команду перехода на нашу функцию поверх этих 6-ти байт
    WriteProcessMemory(GetCurrentProcess(), (void*)adr_MessageBoxA, 
    (void*)&jump, sizeof(jmp_far), &written);
}
Вот функция внедряет push и ret используя "машинный код инструкции перехода", но она не работает...

Может можно просто asm вставку внедрить?
Или например так, преобразовать asm вставку в машинный код, а затем этот машинный код внедрить, по тому же принципу, как здесь?
Yandex
Объявления
29.08.2013, 19:05     Инъекция своего кода в функцию открытой программы
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru