【发布时间】:2016-02-13 17:09:17
【问题描述】:
inject dll in another process已经出现了,但是还需要调用这个dll中的函数,如何实现呢? 但更具体地说,在进程中注入后,我需要调用 setHWND 函数来发送值,从我的应用程序到注入的进程......
切片 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;
谢谢
【问题讨论】:
-
不在 DllMain 中显示 UI。调用 CreateThread 并在那里完成工作。
-
我,我需要从主应用调用 setHWND
-
好吧,就这样吧。但不是来自 DllMain。正如文档所涵盖的那样。在 DllMain 中调用 CreateThread 来完成这项工作。