Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Перехват WinAPI и UPX


Автор: DelDev 6.9.2013, 14:17
Подскажите, пожалуйста, какие есть способы перехвата функций Windows API (например, MessageBox) в сжатом (UPX) исполняемом файле.

P.S. Исполняемый файл подгружает мою Dll.

Автор: bems 6.9.2013, 15:13
попробуй хук реализации функции сплайсингом

Автор: DelDev 6.9.2013, 18:01
Как получить адрес функции в исполняемом модуле из DLL?

Автор: bems 6.9.2013, 19:21
я говорю реализацию хукай, которая в user32.dll

Автор: DelDev 6.9.2013, 19:28
Можно, пожалуйста, как-то поподробнее.

Автор: bems 6.9.2013, 19:44
можно.
берешь адрес MessageBox. Если он указывает на какой-то из вариантов инструкции jmp, то берешь адрес куда эта инструкция джампает. проверяешь нет ли там в свою очередь еще одного джампа. и так до тех пор, пока не найдешь адрес собственно кода функции.
сохраняешь куда-то первые инструкции функции, записываешь на их место джамп на твой хук. когда нужно выполнить оригинальную функцию, ты вызываешь сохранённое начало, а потом джампаешь на код, который шел в оригинале сразу после него.
Как вариант можно вместо записи джампа в начало функции записать туда int3 или еще какую-то однобайтовую инструкцию, вызывающую исключение, а в векторном обработчике исключения вызывать хук. Это позволяет сохранять только первую инструкцию похуканной функции

Автор: DelDev 6.9.2013, 20:20
А пример есть?

Автор: bems 6.9.2013, 20:26
гуглится несложно по слову "сплайсинг"

Автор: DelDev 6.9.2013, 21:03
Можно ли заменить функцию через таблицу импорта?

Автор: bems 6.9.2013, 21:28
импорт же вроде upx скрывает. тогда уже правь таблицу экспорта дллки, но сделать это нужно до того как начнет работать экзешник. например запустить процесс замороженным, похукать и запустить.

Автор: DelDev 6.9.2013, 21:56
А это можно сделать в моем случае, когда зажатый исполняемый файл сам загружает мою DLL. Это что типа нада ставит глобальный хук в другой dll?

И еще вопрос: UPX сокращает таблицу импорта до нескольких функций, но он, наверное, после запуска должен ее восстановить? Если это так, то можно к ней как-то обратиться и пропатчить нужный адрес функции?

Автор: Чучмек 7.9.2013, 16:12
Цитата(DelDev @  6.9.2013,  18:01 Найти цитируемый пост)
Как получить адрес функции

Код

  h:=GetModuleHandle('dllName');
  if h=0 then h:=LoadLibrary('dllName');
  p:=GetProcAddress(h,'functionName');

Автор: DelDev 7.9.2013, 18:18
Цитата
 
Цитата
Как получить адрес функции

Код

  h:=GetModuleHandle('dllName');
  if h=0 then h:=LoadLibrary('dllName');
  p:=GetProcAddress(h,'functionName');
 

Спасибо, но я спрашивал немного о другом.

Автор: Чучмек 8.9.2013, 18:39
Цитата(DelDev @  7.9.2013,  18:18 Найти цитируемый пост)
я спрашивал немного о другом

Этого достаточно, чтобы перехватить любую функцию импортируемую приложением из любой dll. Неважно как приложение ее импортирует - через таблицу импорта, или через  LoadLibrary.
Ковырять таблицу импорта нужно только тогда, когда нужно перехватить ВСЕ используемые приложением функции. И то - необходимо только чтение таблицы импорта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)