Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.42.168] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток!
Подскажите пожалуйста как перехватить API функции на в компоненте (GetProcAddress, LoadLibrary, etc.) - требуется написать компонент для перехвата API функций. Или подскажите как можно решить проблемму с вложенными функциями - из вложенной функции нет доступа к функциям-членам класса при подобном обьявлении: procedure TSomeClass.SomeFunction(...); function SomeSubFunction : SomeType; begin end; begin end; |
Сообщ.
#2
,
|
|
|
По второму вопросу. Я бы переписал функцию вот так
procedure TSomeClass.SomeFunction(...); function SomeSubFunction(Self: TSomeClass) : SomeType; begin with Self do begin end; end; begin // А вот так её вызываем SomeSubFunction(Self); end; По первому вопросу. 1. С помощью GetProcAddress находим местоположение интересующих нас функций. 2. Патчим начало перехватываемой функции таким образом, чтобы управление переходило к функции её заменяющей. То есть записываем в начало функции конструкцию вида jmp OurFunction ; Переход на OurFunction, 5 байт В принципе, этого достаточно при условии, что вся логика, реализованная в перехватываемой функции, реализуется функцией её заменяющей. Если же необходимо, чтобы управление возвращалось в итоге в перехватываемую функцию, нужно в конец заменяющей функции добавить первые несколько байт из заменяемой функции, которые мы заменяем на jmp OurFunction (эти байты обычно называеют stollen bytes - украденные байты), таким образом, чтобы не нарушалась логика её работы. Допустим в начале заменяемой функции идет такая конструкиция: push ebp mov ebp, esp push -1 Это как раз и будет 5 байт, значит нужно добавить в конец заменяющей функции следующую конструкцию. push ebp mov ebp, esp push -1 jmp OldFunction+5 ; Переход на адрес OldFunction+5 Вот в таком вот ключе. То, что я здесь написал, только общее описание процесса. Для более подробной информации можно почитать статьи на http://wasm32.ru |
Сообщ.
#3
,
|
|
|
Цитата Karbazol @ 2. Патчим начало перехватываемой функции ... Немного дополню Можно обойтись без изменений самих API, достаточно в процессе-жертве произвести поиск нужного нам адреса нашей API. Точнее если LoadLibrary имеет адрес 12345678, то мы должны пробороздить всю память (для первого раза сойдет) в поисках этого значения ... и для ускорения поиска (по моей наблюдательности) мы должны смещаться по 4 байта ... я это раньше практиковал. Ну а сейчас, сейчас запускаю нужный процесс и патчу LdrGetProcAddress, а при помощи него "подставляю" свои API ... без всякого пропатчивания и сканировании памяти ps. И немного посмотри этот сайт http://ms-rem.dot-link.net/ ... |