Перехват API-функций

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Перехват API-функций

Сообщение karlex » 10.07.2009 (Пт) 22:59

Почитал статью: Перехват API-функций в Windows NT/2000/XP
Решил реализовать перехват самым первым способом: в начало API-функции записать ассемблерную вставку (далее "прыжок"), которая будет передавать управление моей процедуре.
Принцип такой же как и в статье, только не используется DLL, все делаю в обычном проекте VB6. Пока результат нулевой :? .
Прыжок представил в виде структуры:
Код: Выделить всё
Type TJump
    Push As Byte
    Address As Long
    Ret As Byte
End Type

Заполняю таким образом: (FakeProcedureAddress -- хранит адрес "фальшивой" процедуры, полученный через AddressOf)
Код: Выделить всё
Dim Jump As TJump
With Jump
    .Push = &H68
    .Address = FakeProcedureAddress
    .Ret = &HC3
End With

Запись прыжка проходит нормально, т.е. WriteProcessMemory выполняется без ошибок.
Но после вызова API-функции управление моей процедуре не передается, т.е. API-функция как и положено выполняет свои действия.
На ум приходят следующие мысли:
- "Кривой" прыжок;
- Прыжок записывается не в начало API-функции, т.е. возможно я не учитываю каких-то особенностей адресации.

Подскажите, пожалуйста, что я упустил при реализации перехвата?
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 10.07.2009 (Пт) 23:11

Почему WriteProcessMemory а не CopyMemory?
Если перехвата нет и функция работает нормально, значит интерцептор не записался.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 10.07.2009 (Пт) 23:37

Хакер писал(а):Почему WriteProcessMemory а не CopyMemory?

Хм... Думал в этом есть какой-то особый смысл.
Хакер писал(а):Если перехвата нет и функция работает нормально, значит интерцептор не записался.

Похоже на то, но WriteProcessMemory возвращает 1 и через последний параметр возвращается 6, т.е. было записано 6 байт.
Вот я и подумал, что может дело в адресах.
Попробую еще CopyMemory, но, судя по всему, это особой погоды не сделает.
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 10.07.2009 (Пт) 23:40

А что передаётся первым параметром?
А куда ведёт FakeAddress?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 11.07.2009 (Сб) 7:37

Первый параметр: GetCurrentProcess.
FakeAddress: AddressOf FakeProcedure

Я понял в чем была проблема! Черт, такую глупую ошибку допустил:
В объявлении WriteProcessMemory второй параметр это адрес, куда нужно записать.
Я взял объявление из API Viewer'а, там второй параметр передается по ссылки как Any, я просто заменил на Long, а вот указать чтобы передавалось само значение, а не указатель на него, я не сообразил сразу же :( .
Теперь исправил.

При выполнению получаю ошибку:
Инструкция по адресу "0x7c97b1a0" обратилась к памяти по адресу "0x7e3686c7". Память не может быть "written".

Проверил адрес WriteProcessMemory, он равен 0х7c802213, т.е. близко к 0x7c97b1a0.
Потом проверил значение InterceptedProcedureAddress, оно равно 0x7e3686c7 один-в-один.
Соответственно вывод: нужно открыть процесс с соответствующими правами, чем я сейчас и займусь, потом отпишу удалось мне все таки совершить перехват или нет.
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 11.07.2009 (Сб) 9:32

По ходу дела еще одна проблема возникла.
Запись уже точно срабатывала, но после вызова API-функции происходила ошибка, и адрес злополучной инструкции находился поблизости к адресу самой функции и при этом как раз там, где должен был быть код оператора RET.
Я долго не мог сообразить в чем дело.
Потом взял ArtMoney :alien: и поглядел в начало функции, т.е. решил проверить что же там записалось.
Оказалось, что структура Jump реально в памяти занимает больше места, т.к. размер каждого члена должен быть кратен 4-ем, поэтому между Push и Address образовался пробел в 3 байта и естественно, записывая только 6 байт от начала структуры, я записывал не весь код. :eye:
Теперь я все осознал и понял.
Спасибо за внимание, проблема решена. :)

Еще хочу попросить совета, разумно ли использовать этот способ для перехвата такой функции как GetDC?
Или лучше сделать перехват через таблицу импорта?
Ведь GetDC может быть вызвана асинхронно и тогда получится что-то непредсказуемое.
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 11.07.2009 (Сб) 13:37

Черт, такую глупую ошибку допустил:

Как я и сказал в первом же ответе.

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

1) Зачем тебе её перехватывать вообще? Цель?
2) Все предложенные в статье методы далеко не совершенны. Глупо подправлять адрес в таблице импорта, оставляя нетронутым адрес в таблице экспорта. Потому что все вызовы из DLL-шек, загрузишвихся после установки перехвата, все вызовы не использующие родную таблицу импорта (то есть вызовы через GetProcAddress, а значит и все Declare-вызовы VB) пройдут мимо перехвата.

Метод с переписыванием начала функции потоко-небезопасен. Автор статьи сам об это написал, но забыл сказать, что функция может не только не перехватиться, а может перехватиться дважды.
Не стоит думать, что в VB-приложении работает только один поток. Практика показала, что их может быть несколько. Когда программа отлаживается под IDE: их точно несколько. Когда программа работает как отдельный процесс: их может быть несколько. Во-первых, они там могут быть сами по себе (например юзается GSerg'овский Waiter), во-вторых, дополнительные потоки вполне могут создаваться какой-нибудь API-шкой (например InternetOpen с флагом INTERNET_FLAG_ASYNC создаёт доп. поток), в-третьих, их в твоём процессе может создать какой-нибудь другой процесс с помощью CreateRemoteThread.

Так что самым правильным будет способ с записью интерцептора, который ведёт на Fake-функцию. При этом, те инструкции (а не байты!), котороые затрагиваются интерцептором, должны быть перенесены (со всеми поправками на относительные адреса) в другое место. И Fake-функция должна не восстанавливать оригинальный блок, а передавать управление на перенесённые в другео место оригинальные инструкции.

И даже этот подход в некоторых случаях может привести к ошибке.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 11.07.2009 (Сб) 14:12

Хакер писал(а):Зачем тебе её перехватывать вообще? Цель?

Вообще ради интереса и саморазвития, но так же я хотел перехватом решить одну задачку: заставить окно отрисовать содержимое в совместимый контекст устройства, чтобы получить перекрытые или вообще скрытые за границами экрана области.
Предполагаю, что есть и другое более верное решение, например какие-то манипуляции с областями отсечения, но пока я не смог добиться нужного результата, тем более, если окно находится за границами экрана.
Знаю про существование сообщения WM_PRINT, но нет гарантий, что оконная процедура обработает его так, что я получу полное точное содержимое окна.

Хакер писал(а):Так что самым правильным будет способ с записью интерцептора, который ведёт на Fake-функцию. При этом, те инструкции (а не байты!), котороые затрагиваются интерцептором, должны быть перенесены (со всеми поправками на относительные адреса) в другое место. И Fake-функция должна не восстанавливать оригинальный блок, а передавать управление на перенесённые в другео место оригинальные инструкции.

Да, это пожалуй более грамотный способ.

Хакер писал(а):инструкции (а не байты!), котороые затрагиваются интерцептором, должны быть перенесены (со всеми поправками на относительные адреса) в другое место

А в конце этих инструкций сделать JMP на оставшиеся инструкции идущие после интерцептора?
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 11.07.2009 (Сб) 14:29

karlex писал(а):Знаю про существование сообщения WM_PRINT, но нет гарантий, что оконная процедура обработает его так, что я получу полное точное содержимое окна.

Если область скрыта, перекраты, закрыта, в общем, если она невидна, то нигде нет, нигде не хранится и не содержится графика, которая в этой области должна быть.
WM_PRINT по идее должен обработаться DefWindowProc'ом, если его не обработает оригинальный WP. Но всегда есть WM_PAINT.

Хакер писал(а):инструкции (а не байты!), котороые затрагиваются интерцептором, должны быть перенесены (со всеми поправками на относительные адреса) в другое место

А в конце этих инструкций сделать JMP на оставшиеся инструкции идущие после интерцептора?[/quote]
На оставшуюся от переноса часть. Не исключено, что запись 6-байтного интерцептора приведёт к необходимости переносить в новое место половину функции. Например, если интерцептор перепишет начало цикла внутри функции, то мало перенести затронутую часть, надо переносить в новое место весь цикл. Можно перенести только начала цикла, но пофиксить все относительные безусловные и условные джампы внутри функции: но велик риск что их однобайтового относительного адреса не хватит, чтобы дотянуть до новой локализации перенесённого блока.

Есть ещё такой момент: в начале большинства WinAPI функций идёт двухбайтная бесполезная инструкция mov edi, edi. Поверх неё можно записть двухбайтный (а не шести! чуствуешь разницу?) джамп, «отпрыгивающий» на несколько байт назад. Перед процедурой как правило есть пустое место (заполненнное nop-ами или int 3), потому что начало процедур выравнивается по 16-байтной границе. Вот в этом пустом месте можно разместить 5-6 байтный интерцептор. Т.е. идея состоит в том, чтобы минимизировать количество оригинальных инструкций, затрагиваемых записью интерцептора: записать интерцептор не поверх функции, а перед ней, а в начало вставить крохотный джамп на интерцептор.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 11.07.2009 (Сб) 14:44

Хакер писал(а):Если область скрыта, перекраты, закрыта, в общем, если она невидна, то нигде нет, нигде не хранится и не содержится графика, которая в этой области должна быть.

О том то я и твержу. Но эту информацию может вывести WM_PAINT на мой контекст устройства, по крайней мере я на это надеюсь.

Хакер писал(а):WM_PRINT по идее должен обработаться DefWindowProc'ом, если его не обработает оригинальный WP. Но всегда есть WM_PAINT.

Ну DefWindowProc не известно то, что известно текущей WP, поэтому он если и отрисует что-то, то пользы от этого будет не много.
На счет WM_PAINT, не понял.

Хакер писал(а):Есть ещё такой момент: в начале большинства WinAPI функций идёт двухбайтная бесполезная инструкция mov edi, edi. Поверх неё можно записть двухбайтный (а не шести! чуствуешь разницу?) джамп, «отпрыгивающий» на несколько байт назад. Перед процедурой как правило есть пустое место (заполненнное nop-ами или int 3), потому что начало процедур выравнивается по 16-байтной границе. Вот в этом пустом месте можно разместить 5-6 байтный интерцептор. Т.е. идея состоит в том, чтобы минимизировать количество оригинальных инструкций, затрагиваемых записью интерцептора: записать интерцептор не поверх функции, а перед ней, а в начало вставить крохотный джамп на интерцептор.

Гениально! Благодарю за информацию!
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 11.07.2009 (Сб) 14:48

На счет WM_PAINT, не понял.

Обработка WM_PAINT всегла реализована.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 11.07.2009 (Сб) 15:05

Хакер писал(а):Обработка WM_PAINT всегла реализована.

Угу, вот я и думаю как бы ему подсунуть свой DC, ведь по уму -- обработчик должен брать DC, возвращаемый через BeginPaint.
Т.е. видимо кроме как перехватить BeginPaint и подсунуть свой DC ни чего не остается.
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 11.07.2009 (Сб) 15:39

Не надо обманывать, ничего хорошего в этом нет как в плане принципа, так и в плане надёжности.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 11.07.2009 (Сб) 15:56

Да, я знаю. Но просто интересно попробовать хоть каким-то способом решить задачу.
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 11.07.2009 (Сб) 23:01

В OllyDbg поглядел на код API-функций, действительно начинаются с MOV EDI, EDI и действительно занимает эта команда 2 байта.
Так же перед API-функцией, как и было сказано, есть NOP'ы, 5 штук -- на инструкцию перехода 1 байт и 4 байта для адреса :? .
Поглядел различные инструкции перехода: дальний JMP занимает не менее 2 байт; RET с предварительным PUSH тоже в 2 байта выходит; CALL вроде как 1 байт, но при его вызове в стек попадает адрес возврата, который будет указывать на API-функцию, а вернее на интерцептора.
Т.е. после выхода из Fake-функции управление все равно вернется к ней -- бесконечный цикл. :eye:
Значит нужно в начале Fake-функции выполнить POP, для этого придется зарезервировать немного места, я правильно мыслю?
А может просто в описание Fake-функции добавить лишний параметр...
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 12.07.2009 (Вс) 0:14

Ты ошибаешься насчёт размера инструкций.

И в чём проблема-то?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 12.07.2009 (Вс) 0:32

Проблема в том, что нужно выполнить переход на Fake-функцию, имея 5 байт.
Изучив вызовы функций других модулей с помощью CALL, я все таки пришел к выводу, что CALL тоже займет 2 байта.

Где именно я ошибся в размерах инструкций? Размеры не от балды, а из того что видел собственными глазами.
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 12.07.2009 (Вс) 1:58

Как call может занимать два байта, если один только операнд там занимает 4?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 12.07.2009 (Вс) 8:33

Я говорил только лишь про размер инструкции без операндов, неужели это было сложно понять? :)
Я так понимаю, что инструкция + операнды = операция.

А что скажешь на счет реализации перехода имея 5 байт?
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 12.07.2009 (Вс) 8:36

karlex писал(а):Я так понимаю, что инструкция + операнды = операция.

Нет. Прификсы + Опкод + операнды = инструкция.

А что скажешь на счет реализации перехода имея 5 байт?

Ничего не скажу. Какие-то проблемы с ней или что?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 12.07.2009 (Вс) 9:42

Хакер писал(а):Нет. Прификсы + Опкод + операнды = инструкция.

Понятно. Буду знать.

Хакер писал(а):
А что скажешь на счет реализации перехода имея 5 байт?

Ничего не скажу. Какие-то проблемы с ней или что?

Проблемы. Я не знаю какую инструкцию использовать для перехода, чтобы она уместилась в 5 байт. Можешь подсказать?
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 12.07.2009 (Вс) 10:24

Можешь подсказать?

А у тебя есть особый выбор?
Подсказываю: CALL или JMP.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 12.07.2009 (Вс) 10:54

Но они же будут занимать 6 байт для дальнего перехода или чего-то недопонимаю?
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 12.07.2009 (Вс) 10:55

Скорее всего.
Что ты имеешь в виду под дальним?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 12.07.2009 (Вс) 11:49

Ну, например прыжок примерно через 2113194535 байт.
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 12.07.2009 (Вс) 11:52

Это Near-прыжок. Far это когда используется 48-битный указатель.
Прыжок на 0x7DF4CA27 байтов вперёд займёт пять байт (а именно: E9 27 CA F4 7D).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 12.07.2009 (Вс) 12:34

Вот оно что, просто я натыкался на информацию, что JMP Short занимает 1 байт, а Naer и Far от 2 до 4 байт (без операнда).

Ты мне очень помог. Большое спасибо!
Буду реализовывать.

Да, хотел еще спросить: возможно ли добиться универсальности в перехвате?
Например данный метод конечно хорош, но все же не универсален.
Мне казался универсальным метод подмена адреса в таблице импорта, но оказывается он далеко не идеален.
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 12.07.2009 (Вс) 12:39

Ты не понимаешь видимо одной вещи.

Чтобы написать потоко-безопасный перехватчик, который будет переносить часть кода функции в другое место, тебе сначала нужно написать дизассемблер/ассемблер. Чтобы написать дизассемлер/ассемблер нужно хорошо знать всё, что касается инструкций.

Как ты собрался «реализовывать» перехватчик, если у тебя не реализован дизассемблер/ассемблер, для реализации которого нужно знать некоторые вещи, которых ты, судя по вопросам, не знаешь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Перехват API-функций

Сообщение karlex » 12.07.2009 (Вс) 12:44

Хакер писал(а):Ты не понимаешь видимо одной вещи.

Чтобы написать потоко-безопасный перехватчик, который будет переносить часть кода функции в другое место, тебе сначала нужно написать дизассемблер/ассемблер. Чтобы написать дизассемлер/ассемблер нужно хорошо знать всё, что касается инструкций.

Я это понял сразу же как ты предложил этот вариант выше, но так же я понял, что на данный момент для меня это очень не тривиальный способ.

А разве последний вариант, предложенный тобой, не является потоко-безопасным?
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перехват API-функций

Сообщение Хакер » 12.07.2009 (Вс) 12:48

Какой?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 22

    TopList