ユニットユニット1;インターフェイスは、ウィンドウ、メッセージ、sysutils、バリアント、クラス、グラフィックス、コントロール、フォーム、ダイアログ、stdctrlsを使用します。タイプtform1 = class(tform)button1:tbutton; MEMO1:TMEMO; Button2:tbutton; Button3:Tbutton;手順button1click(sender:tobject);手順button2click(sender:tobject);手順button3click(sender:tobject);手順formdestroy(送信者:tobject);手順formcreate(sender:tobject); private {private宣言}手順showmsg(s:string); public {public宣言}終了; var form1:tform1;実装{$ r *.dfm}はmlde32unitを使用します。 const despath = 'c:/program files/borland/delphi6/project/adv apihook/test/vt.exe'; func2hook = 'freelibrary'; var //は、Globle変数ptrreal:pointerでなければなりません。 cbstolen:枢機; ntdllbase、ntdlllength:integer; P:ポインター。 H:dword;手順tform1.showmsg(s:string); memo1.lines.add(s)を開始します。終わり;手順tform1.button1click(sender:tobject);ラベルFakeCode、rtncode; var // si:startupinfo; // pi:process_information; OriginalBytes:charの配列[0..4]; hookjmp:pchar; RTN:枢機inal;バイト:charの配列[0..4]; TMP:枢機inal; PEB、LDR、FLINK:ポインター。 BS:DWORD; Ptrrealを開始:= nil; ntdllLength:= 0; ntdllbase:= getModuleHandle( 'ntdll.dll'); ASM MOV EAX、FS:[$ 30] MOV PEB、EAX END; ldr:= pointer(dword(pointer(dword(peb)+12)^));フリンク:= pointer(dword(pointer(dword(ldr)+12)^)); p:=フリンク; bsを繰り返します:= dword(pointer(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_suspedended、nil、nil、si、pi); } showmsg( 'fook' + func2hook + '...'); ptrreal:= getProcAddress(getModuleHandle( 'kernel32.dll')、func2hook);割り当てられた場合(ptrreal)、showmsg( 'real' + func2hook + 'addr:' + inttohex(dword(ptrreal)、8)) // 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 hore fooked!'); end else begin showmsg(func2hook + 'fooked!exit!'); // resumethread(pi.hthread);出口;終わり; cbstolen:= 0; cbstolen <5 do cbstolen:= cbstolen + lde32(pointer(dword(ptrreal) + cbstolen)); showmsg( 'let'は最初の ' + inttostr(cbstolen) +' bytes :) '); showmsg( 'ただし、最初に作成できるようにします...'); VirtualProtect(PTRREAL、CBSTOLEN、PAGE_EXECUTE_READWRITE、@TMP)の場合、showmsg( 'make' + inttohex(dword(ptrreal)、8) + 'writable cuseed!') )、8) + 'writable failed !!'); // resumethread(pi.hthread);出口;終わり; showmsg( 'jmp codes&hook' + func2hook + '...'); getMem(hookjmp、5); hookjmp [0]:= chr($ e9)を試してください。 ASM Push Eax Lea Eax、Fakecode Mov TMP、EAX POP EAX END; TMP:= TMP -DWORD(PTRREAL)-5; Copymemory(@hookjmp [1]、@tmp、4); ASM Push Eax Lea Eax、rtncode mov tmp、eax pop eax end; virtualprotect(pointer(tmp)、cbstolen、page_execute_readwrite、@rtn); Copymemory(Pointer(TMP)、ptrreal、cbstolen); writeprocessmemory(getCurrentProcess、ptrreal、fookjmp、5、rtn); // writeprocessmemory(pi.hprocess、ptrreal、fookjmp、5、rtn); showmsg( 'hook' + func2hook + 'scude!resume thread!');最後に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 pop eax pop eax pop eax mov 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 nop nop nop nop nop nop nop nop nop nop add eax、cbstolen jmp eax end;終わり; var ptr、ppp:ポインター;手順tform1.button2click(sender:tobject); begin {asm call ppp;終わり;出口; } button3click(nil); ptr:= virtualAlloc(nil、1024、mem_commit、page_execute_readwrite);割り当てられていない場合(ptr)、memo1.lines.add( '致命的なエラー:virtualAlloc failed!')else memo1.lines.add( 'virtualAlloc sceed!ptr =' + inttohex(dword(ptr)、8));終わり;手順tform1.formdestroy(sender:tobject); button3click(nil); unmapviewoffile(ppp); CloseHandle(h);終わり;手順tform1.button3click(sender:tobject); assional(ptr)then virtualfree(ptr、0、mem_release)の場合は開始します。終わり;手順tform1.formcreate(sender: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里有很多垃圾代码、因为这个防フック的程序只是一个副产品。有用代码写成dll注入其他进程就可以防フック了、已经试过没问题。代码风格比较差、不过不知道怎么改的更好(如将 fakecode