Форум: "Прочее";
Текущий архив: 2013.06.16;
Скачать: [xml.tar.bz2];
ВнизПерехват АПИ Найти похожие ветки
← →
Rouse_ © (2013-01-27 02:04) [0]Ффух, добил таки статейку которую на новогодние хотел выложить, можно, так сказать попинать :)
http://alexander-bagel.blogspot.ru/2013/01/intercept.html
В принципе для разбирающихся в теме там ну чуть-чуть наверное новых нюансов будет, но для тех кто не сталкивался, я так думаю хорошая стартовая площадка.
ЗЫ: Керк, я свое закончил - ты там про вызов библиотек из приложений другой разрядности обещал обзорку сделать, когда будет, то? :)
← →
Германн © (2013-01-27 02:25) [1]Удалено модератором
← →
Rouse_ © (2013-01-27 02:29) [2]Удалено модератором
← →
Германн © (2013-01-27 02:42) [3]Удалено модератором
← →
Rouse_ © (2013-01-27 02:56) [4]Готово.
Кстати по статье - это практически полная выжимка моих знаний по перехвату в третьем кольце, из не рассмотренного если честно там только трюкачество осталось, которое обычно не применяется в нормальных программах :) А вот народу, думаю будет интересно (ну по крайней мере я лет эдак 14 назад точно бы заинтересовался :)
← →
Дмитрий С © (2013-01-27 03:54) [5]"Не" с прилагательными пишется слитно, если нет противопоставления:)
P.S. про HotPatch было полезно узнать, спасибо.
У меня была как-то идея:
1. Запоминаем начало функции, которую перехватываем (от 6 до N байт).
N определяется границей инструкций.
2. Заменяем первые 6 байт на PUSH xxx; RET.
3. Выделяем запускаемую память, копируем туда N байт и дополняем еще одним PUSH yyy; RET, где yyy - адрес начала перехваченной функции + N.
При таком подходе пропадает проблема вызова оригинальной функции при работе в многопоточном приложении. Но задача определения границы инструкции показалась для меня "нестоящей свеч".
← →
Дмитрий С © (2013-01-27 04:19) [6]Еще посмотрел
function InjectLib(ProcessID: Integer): Boolean;
// Выделяем в нем память под строку
DllPath := AnsiString(ExtractFilePath(ParamStr(0)) + DLLName);
RemoteDll := VirtualAllocEx(Process, nil, Length(DllPath),
MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if RemoteDll = nil then Exit;
try
// Пишем путь к длл в его адресное пространство
if not WriteProcessMemory(Process, RemoteDll, PChar(DllPath),
Length(DllPath), BytesWriten) then Exit;
if BytesWriten <> DWORD(Length(DllPath)) then Exit;
Не совсем по теме, но кажется, что для RemoteDll нужен еще 1 байт для #0.
← →
Rouse_ © (2013-01-28 11:38) [7]
> Дмитрий С © (27.01.13 04:19) [6]
Угу, прошляпил при правке кода под семерку, спасибо, обновил.
← →
Kerk © (2013-01-29 13:44) [8]
> ЗЫ: Керк, я свое закончил - ты там про вызов библиотек из
> приложений другой разрядности обещал обзорку сделать, когда
> будет, то? :)
Да я все еще не уверен надо ли. Я ж народ поспрашивал, 64бита вообще никого не интересуют.
← →
O'ShinW © (2013-02-12 13:49) [9]Спасибо, Розыч!
← →
Rouse_ © (2013-02-12 15:33) [10]Та незачто, главное чтоб на пользу пошло :)
← →
Rouse_ © (2013-02-12 16:24) [11]
> Kerk © (29.01.13 13:44) [8]
> Да я все еще не уверен надо ли. Я ж народ поспрашивал, 64бита
> вообще никого не интересуют.
ЗЫ: Ром, обещал - делай. Пусть через хостпроцесс, но все равно идея-то рабочая. Тем более, если мне (или кому еще) потребуется на скорую руку что сварганить, я тупо твой код в виде рыбы возьму и с минимальными переделками прикручу, всяко полезно будет :)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.06.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c