вот написал перехватчик pr_write из nspr4.dll, но почему-то когда ставлю его - фокс вылетает: PHP: library AdvBox_32; uses Windows, wininet; type OldCode = packed record One: dword; two: word; end; far_jmp = packed record PuhsOp: byte; PushArg: pointer; RetOp: byte; end; prw= function ( fp:pointer ;var buf;amount:integer):integer; var JmpMba: far_jmp; OldMba: OldCode; MbaAdr: pointer; function newic(fd:pointer;var buf; amount:integer):integer; var Written: dword; func:prw; begin //ïèøåì îðèãèíàëüíûé êîä WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr,@OldMba, SizeOf(OldCode), Written); @func:=pointer(mbaadr); result:=func(fd,buf,amount); WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr,@JmpMba, SizeOf(far_jmp), Written); end; Procedure SetHook(); var hnspr: dword; Bytes: dword; begin hnspr := GetModuleHandle('nspr4.dll'); MbaAdr := GetProcAddress(hnspr, 'PR_Write'); //ïîëó÷àåì àäðåñ ôóíêöèè êîòîðóþ ïåðåõâàòûâàåì ReadProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes);//÷èòàåì ïåðâûå øåñòü áàéò(÷òîá ïîäñòàâèòü ïðè âûçîâå îðèãèíàëüíî ôóíêöèè) JmpMba.PuhsOp := $68;//jmp JmpMba.PushArg := @newic;//àäðåñ ïîäñòàâíîé ôóíêöèè JmpMba.RetOp := $C3;//ret WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @JmpMba, SizeOf(far_jmp), Bytes);//çàìåíÿåì ïåðâûå øåñòü áàéò íà êîä, ïåðåäàþùèìé óïðàâëåíèå íàøåé ôóíêöèè end; Procedure Unhook(); var Bytes: dword; begin WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes); end; // çàëåïà Function MessageProc(code : integer; wParam : word; lParam : longint) : longint; stdcall; begin CallNextHookEx(0, Code, wParam, lparam); Result := 0; end; Procedure SetGlobalHookProc(); begin SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0); Sleep(INFINITE); end; // Procedure SetGlobalHook(); var hMutex: dword; TrId: dword; begin hMutex := CreateMutex(nil, false, 'AdvareHook'); if GetLastError = 0 then CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else CloseHandle(hMutex); end; procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin SetGlobalHook(); Randomize(); SetHook() end; DLL_PROCESS_DETACH: UnHook(); end; end; begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. вроде прототип какой надо. в си такой: __int32 __cdecl hookerPrWrite(void *fd, const void *buf, __int32 amount); в отчете о крахе фокса ничего полезного не нашел...
прототип как только не менял: и const вместо var подставлял и pointer, а типы и Integer ставил и dword - один хер. видел как это делается на сишке, но никак не могу интерпретировать на дельфу....
Chrome~, это он и есть. realcoder, ну так cdecl же, сами сказали. здесь: Code: function newic(fd:pointer;var buf; amount:integer):integer; cdecl и здесь: Code: prw= function ( fp:pointer ;var buf;amount:integer):integer; cdecl а вообще простите, может фраза не к месту, уж очень нравится Клерк По коду совет: делайте трамплин. В таком виде не годно