единица единицы 1; Интерфейс использует Windows, сообщения, Sysutils, варианты, классы, графику, элементы управления, формы, диалоги, STDCTRLS; введите tform1 = class (tform) button1: tbutton; Memo1: Tmemo; Button2: Tbutton; Button3: Tbutton; Процедура Button1click (отправитель: tobject); процедура Button2click (отправитель: tobject); процедура Button3click (отправитель: Tobject); процедура FormDestroy (отправитель: Tobject); Процедура FormCreate (отправитель: Tobject); Private {Private Declarations} Процедура Showmsg (s: String); public {public Declararions} end; var form1: tform1; реализация {$ r *.dfm} использует mlde32Unit; const despath = 'c:/program files/borland/delphi6/projects/adv apihook/test/vt.exe'; Func2hook = 'freeliabrary'; var // должна быть мрачная переменная ptrreal: pointer; Cbstolen: кардинал; Ntdllbase, ntdlllength: integer; П: Показатель; H: DWORD; Процедура tform1.showmsg (s: string); начинать memo1.lines.add (ы); конец; Процедура tform1.button1click (отправитель: tobject); метка FakeCode, RtnCode; var // si: startupinfo; // pi: process_information; OriginalBytes: Array [0..4] of Char; Hookjmp: pchar; RTN: кардинал; Байты: массив [0..4] char; TMP: кардинал; PEB, LDR, Flink: указатель; BS: DWORD; Begin ptrreal: = nil; Ntdlllength: = 0; Ntdllbase: = getModuleHandle ('ntdll.dll'); ASM MOV EAX, FS: [$ 30] MOV PEB, EAX END; ldr: = pointer (dword (pointer (dword (peb) +12)^)); Flink: = pointer (dword (pointer (dword (ldr) +12)^)); P: = Flink; Повторите BS: = dword (указатель (dword (p)+$ 18)^); Если bs = ntdllbase, то начните ntdlllength: = dword (pointer (dword (p)+$ 20)^); перерыв; конец; p: = pointer (dword (p^)); пока dword (Flink) = dword (p^); Если ntdlllength = 0, то Showmsg ('не может получить ntdll.dll размер изображения!'); {Showmsg ('создание приостановленного процесса ...'); Zeromemory (@si, sizeof (startupinfo)); si.cb: = sizeof (startupinfo); CreateProcess (despath, nil, nil, nil, false, create_suspended, nil, nil, si, pi); } Showmsg ('подготовка крюка' + func2hook + '...'); Ptrreal: = getProcadDress (getModuleHandle ('kernel32.dll'), func2hook); Если назначено (ptrreal), то Showmsg ('real' + func2hook + 'addr:' + inttoHex (dword (ptrreal), 8)) else begin showmsg ('addr:' + func2hook + 'нечитаем! Выход!'); // resumethread (pi.hthread); Выход; конец; Readprocessmemory (getCurrentProcess, ptrreal, @bytes, 5, rtn); // readprocessmemory (pi.hprocess, ptrreal, @bytes, 5, rtn); Если байты [0] <> chr ($ e9), тогда начните Copymemory (@originalbytes, @bytes, 5); ShowMsg (func2hook + 'Havn't Croqued!'); end else begin showmsg (func2hook + 'был подключен! Выход!'); // resumethread (pi.hthread); Выход; конец; cbstolen: = 0; В то время как cbstolen <5 do cbstolen: = cbstolen + lde32 (pointer (dword (ptrreal) + cbstolen)); ShowMsg ('Let''s The Pleat первые' + inttoStr (cbstolen) + 'байты :)'); ShowMsg ('но сначала сделайте это для записи ...'); Если VirtualProtect (ptrreal, cbstolen, page_execute_readwrite, @tmp), затем Showmsg («Make ' + inttoHex (dword (ptrreal), 8) +« Записная запись! , 8) + 'Запись потерпел неудачу! // resumethread (pi.hthread); Выход; конец; Showmsg ('сборка кодов JMP & Hook' + func2hook + '...'); GetMem (HookJMP, 5); Попробуйте HookJMP [0]: = Chr ($ E9); ASM push eax lea eax, fakecode mov tmp, eax pop ex end; tmp: = tmp - dword (ptrreal) - 5; Copymemory (@hookjmp [1], @tmp, 4); ASM push eax lea eax, rtncode mov tmp, eax pop ex end; VirtualProtect (pointer (tmp), cbstolen, page_execute_readwrite, @rtn); Copymemory (указатель (TMP), Ptrreal, Cbstolen); WriteProcessMemory (GetCurrentProcess, Ptrreal, HookJMP, 5, RTN); // writeprocessmemory (pi.hprocess, ptrreal, krokjmp, 5, rtn); ShowMsg ('Hook' + func2hook + 'Успех! Резюме потока!'); Наконец Freemem (HookJMP); // resumethread (pi.hthread); конец; Выход; FakeCode: // нет строк с этого момента на ASM Int 3 End; ASM Push Eax Lea Eax, [ESP+4] MOV P, EAX POP EAX END; Если dword (p^) - ntdllbase <ntdlllength, то ASM pop p pop eax pop eax eax eax, 0 jmp p // push p // ret end; // MessageBox (0, pchar (P), '', 0); Rtncode: aSm nop nop nop nop nop nop nop nop nop nop nop move ax, ptrreal добавить eax, cbstolen jmp ex end; конец; var ptr, ppp: pointer; Процедура tform1.button2click (отправитель: tobject); начать {asm call ppp; конец; Выход; } Button3click (nil); Ptr: = virtualalloc (nil, 1024, mem_commit, page_execute_readwrite); Если не назначено (ptr), то memo1.lines.add ('fatal ошибка: virtualalloc не удастся!') else memo1.lines.add ('virtualalloc сдается! ptr =' + inttohex (dword (ptr), 8)); конец; Процедура tform1.formDestroy (отправитель: tobject); Begin Button3click (ноль); UnmapViewOffile (PPP); Близкий руск (H); конец; Процедура tform1.button3click (отправитель: tobject); начинать, если назначено (ptr), то VirtualFree (ptr, 0, mem_release); конец; Процедура tform1.formcreate (отправитель: tobject); Begin H: = createFileMapping ($ ffffffff, nil, page_readwrite или sec_commit, 0, 1, 'pe'); PPP: = mapViewOffile (h, file_map_all_access, 0,0,0); Подпись: = InttoHex (DWORD (PPP), 8); char (ppp^): = chr ($ c3); конец; конец. ====== Unit1 里有很多垃圾代码 , 因为这个防 Hook 的程序只是一个副产品。有用代码写成 dll 注入其他进程就可以防 Hook 了 , 已经试过没问题。代码风格比较差 , 不过不知道怎么改的更好 (fakeCode 部分放到单独过程中) 。如果你改好了希望能发给我一份。 mlde32Unit 代码来自 29a 第七期 , , 不好意思。