注入DLL調用過程已翻了出來,但仍需要調用函數在此DLL中,如何實現呢? 但更特別的,在這個過程中注入後,我要打電話去送價值setHWND功能,從我的應用程序注入的工藝......進樣DLL,並從另一個進程這個dll
片DLL
procedure Init(Reason: integer);
begin
Dll_reason := Reason;
HookPoint_Address := 0;
if (Reason = DLL_PROCESS_ATTACH) then
begin
ShowMessage('Прикрепились');
InitHook;
end;
end;
procedure setHWND(hwnd: Cardinal);
begin
hwnd_param:=hwnd;
end;
exports
setHWND;
begin
DLLProc := Init;
Init(DLL_PROCESS_ATTACH);
片注入
function InjectDLL(dwPID: DWORD; DLLPath: PWideChar): integer;
var
dwThreadID: Cardinal;
hProc, hThread, hKernel: THandle;
BytesToWrite, BytesWritten: SIZE_T;
pRemoteBuffer, pLoadLibrary: Pointer;
begin
hProc := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or
PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ, False, dwPID);
if hProc = 0 then
exit(0);
try
BytesToWrite := SizeOf(WideChar) * (Length(DLLPath) + 1);
pRemoteBuffer := VirtualAllocEx(hProc, nil, BytesToWrite, MEM_COMMIT,
PAGE_READWRITE);
if pRemoteBuffer = nil then
exit(0);
try
if not WriteProcessMemory(hProc, pRemoteBuffer, DLLPath, BytesToWrite,
BytesWritten) then
exit(0);
hKernel := GetModuleHandle('kernel32.dll');
pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryW');
hThread := CreateRemoteThread(hProc, nil, 0, pLoadLibrary, pRemoteBuffer,
0, dwThreadID);
try
WaitForSingleObject(hThread, INFINITE);
finally
CloseHandle(hThread);
end;
finally
VirtualFreeEx(hProc, pRemoteBuffer, 0, MEM_RELEASE);
end;
finally
CloseHandle(hProc);
end;
exit(1);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
PID: DWORD;
dir: string;
begin
SetSeDebugPrivilege;
PID := GetPID('zorron.exe');
if (PID > 0) then
begin
dir := GetCurrentDir;
InjectDLL(PID, PWideChar(dir + '\trans.dll'));
end;
end;
Thx
不要在DllMain中顯示UI。調用CreateThread並在那裏完成工作。 –
我,米需要從主應用程序呼叫setHWND – SEModer
那麼,那樣做。但不是來自DllMain。正如文檔所涵蓋。在DllMain中調用CreateThread來完成這項工作。 –