Бог с этим примером, вот метод сплайсинг
| Код | [size=6]DLL:[/size]
const THREAD_ALL_ACCESS = $001F03FF; THREAD_SUSPEND_RESUME = $00000002;
type PFunctionRestoreData = ^ TFunctionRestoreData; TFunctionRestoreData = packed record Address:Pointer; val1:Byte; val2:DWORD; end;
var SystemFunctionBridge:TFunctionRestoreData;
procedure MyFunction; begin showmessage('Ôóíêöèÿ ïåðåõâà÷åíà'); end;
function SetCodeHook(ProcAddress, NewProcAddress: pointer; RestoreDATA:PFunctionRestoreData):boolean; var OldProtect, JMPValue:DWORD; begin Result:=False; if not VirtualProtect(ProcAddress,5,PAGE_EXECUTE_READWRITE,OldProtect) then exit; JMPValue := DWORD (NewProcAddress) - DWORD (ProcAddress) - 5; RestoreDATA^.val1:= Byte(ProcAddress^); RestoreDATA^.val2:= DWORD(Pointer(DWORD(ProcAddress)+1)^); RestoreDATA^.Address:=ProcAddress; byte(ProcAddress^):=$E9; DWORD(Pointer(DWORD(ProcAddress)+1)^):=JMPValue; Result:=VirtualProtect(ProcAddress,5,OldProtect,OldProtect); end;
function SetProcedureHook(ModuleHandle: HMODULE; ProcedureName : PChar; NewProcedureAddress :Pointer;RestoreDATA : PFunctionRestoreData) :Boolean; var ProcAddress:Pointer; begin ProcAddress:=GetProcAddress(ModuleHandle,ProcedureName); Result:=SetCodeHook(ProcAddress,NewProcedureAddress,RestoreDATA); end;
function LoadLibrary_Ex(ProcessID:DWORD;LibName:PChar):boolean; var pLL,pDLLPath:Pointer; hProcess,hThr:THandle; LibPathLen,_WR,ThrID:DWORD; begin Result:=False; LibPathLen:=Length(string(LibName)); hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID); if hProcess=0 then exit; pDLLPath:=VirtualAllocEx(hProcess,0,LibPathLen+1,MEM_COMMIT,PAGE_READWRITE); if DWORD(pDLLPath)=0 then exit; pLL:=GetProcAddress(GetModuleHandle(kernel32),'LoadLibraryA'); WriteProcessMemory(hProcess,pDLLPath,LibName,LibPathLen+1,_WR); hThr:=CreateRemoteThread(hProcess,0,0,pLL,pDLLPath,0,ThrID); if hThr=0 then exit; Result:=CloseHandle(hProcess); end;
function UnHookCodeHook(RestoreDATA:PFunctionRestoreData):Boolean; var ProcAddress:Pointer; OldProtect,JMPValue:DWORD; begin Result:=False; ProcAddress:=RestoreDATA^.Address; if not VirtualProtect(ProcAddress,5,PAGE_EXECUTE_READWRITE,OldProtect) then exit; Byte(ProcAddress^):=RestoreDATA^.val1; DWORD(Pointer(DWORD(ProcAddress)+1)^):=RestoreDATA^.val2; Result:=VirtualProtect(ProcAddress,5,OldProtect,OldProtect); end;
procedure DLLEntryPoint(dwReason:DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin SetProcedureHook(GetModuleHandle('user32.dll'),'MessageBoxA',@MyFunction,@SystemFunctionBridge); end; DLL_PROCESS_DETACH: begin UnHookCodeHook(@SystemFunctionBridge); end; end; end;
begin DllProc:= @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end.
[size=6]EXE:[/size]
procedure TForm1.Button1Click(Sender: TObject); begin LoadLibrary(pchar(ExtractFileDir(Application.ExeName)+'\'+'ИМЯ.dll')); end;
procedure TForm1.Button2Click(Sender: TObject); begin messagebox(0,'123','321',mb_ok); end;
|
Вроде перехватывает, НО почемуто вылазит 2 раза showmessage, может это из-за того что это относится к классу messageBox ? посмотрите плз еще код может где ошибка? |