x64 进程中的 DLL 注入不起作用
Dll injection in x64 process don't work
我已经制作了一个 dll(32 位平台),现在我想在任何 x64 进程中注入。
在 Delphi 中的源代码网络上发现了几个承诺这样做的示例,但是在测试时,none dll 被注入到任何 x64 进程中,已经在使用 x86 进程测试时这些代码工作得很好!
我发现了一个独特的示例,它承诺在 x64 进程中注入一个 dll 文件,但在我的测试中,尝试在 notepad.exe 中注入一个 dll 时没有任何效果例如。
所以,这里有人有一个为 x64 处理器工作的 dll 注入器的例子,或者可以帮助我用下面的这个例子来做到这一点(如果可能的话)?
欢迎提出任何建议!
我最后一次尝试是:
喷油器
function InjectDLL(const dwPID: DWORD; {$IFDEF UNICODE} DLLPath: PWideChar
{$ELSE} DLLPath: PAnsiChar {$ENDIF} ): Integer;
const
Kernel32 = 'kernel32.dll';
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);
{$REGION 'Check for UNICODE'}
{$IFDEF UNICODE}
hKernel := GetModuleHandleW(Kernel32);
pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryW');
{$ELSE}
hKernel := GetModuleHandleA(Kernel32);
pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryA');
{$ENDIF}
{$ENDREGION}
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;
begin
if InjectDLL(4864, 'C:\SampleDLL') <> 0 then begin
ShowMessage('woO!');
end;
end.
Dll
uses
System.SysUtils,
System.Classes,
Variants,
Winapi.Windows;
Function StartThread(pFunction : TFNThreadStartRoutine; iPriority : Integer = Thread_Priority_Normal; iStartFlag : Integer = 0) : THandle;
var
ThreadID : DWORD;
begin
Result := CreateThread(nil, 0, pFunction, nil, iStartFlag, ThreadID);
if Result <> Null then
SetThreadPriority(Result, iPriority);
end;
Function CloseThread( ThreadHandle : THandle) : Boolean;
begin
Result := TerminateThread(ThreadHandle, 1);
CloseHandle(ThreadHandle);
end;
procedure ThisIsTheThread;
begin
MessageBoxW(0,'I am in your target : Dll file','woO!',0)
end;
procedure Run;
Var
hThread : THandle;
begin
hThread := StartThread(@ThisIsTheThread);
hThread := StartThread(@ThisIsTheThread,THREAD_PRIORITY_ERROR_RETURN);
CloseThread(hThread);
end;
procedure mydllproc(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH:
begin
Run;
end;
end;
end;
begin
DllProc := mydllproc;
mydllproc(DLL_PROCESS_ATTACH);
end.
PS:如上所述,在 32 位进程中工作正常。
64位进程只能加载64位模块。 32 位进程只能加载 32 位模块。
因此应该清楚,您不能将 32 位 DLL 注入 64 位进程。为了注入 64 位进程,您需要将 DLL 重新编译为 64 位模块。
完成后,您将不得不更改 DLL。您不能在 DllMain
中做很多事情,如 MSDN 文档中所述。当然,显示对话是完全违反规则的。从您的 DllMain
呼叫 CreateThread
并在那里完成工作。
我已经制作了一个 dll(32 位平台),现在我想在任何 x64 进程中注入。
在 Delphi 中的源代码网络上发现了几个承诺这样做的示例,但是在测试时,none dll 被注入到任何 x64 进程中,已经在使用 x86 进程测试时这些代码工作得很好!
我发现了一个独特的示例,它承诺在 x64 进程中注入一个 dll 文件,但在我的测试中,尝试在 notepad.exe 中注入一个 dll 时没有任何效果例如。
所以,这里有人有一个为 x64 处理器工作的 dll 注入器的例子,或者可以帮助我用下面的这个例子来做到这一点(如果可能的话)?
欢迎提出任何建议!
我最后一次尝试是:
喷油器
function InjectDLL(const dwPID: DWORD; {$IFDEF UNICODE} DLLPath: PWideChar
{$ELSE} DLLPath: PAnsiChar {$ENDIF} ): Integer;
const
Kernel32 = 'kernel32.dll';
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);
{$REGION 'Check for UNICODE'}
{$IFDEF UNICODE}
hKernel := GetModuleHandleW(Kernel32);
pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryW');
{$ELSE}
hKernel := GetModuleHandleA(Kernel32);
pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryA');
{$ENDIF}
{$ENDREGION}
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;
begin
if InjectDLL(4864, 'C:\SampleDLL') <> 0 then begin
ShowMessage('woO!');
end;
end.
Dll
uses
System.SysUtils,
System.Classes,
Variants,
Winapi.Windows;
Function StartThread(pFunction : TFNThreadStartRoutine; iPriority : Integer = Thread_Priority_Normal; iStartFlag : Integer = 0) : THandle;
var
ThreadID : DWORD;
begin
Result := CreateThread(nil, 0, pFunction, nil, iStartFlag, ThreadID);
if Result <> Null then
SetThreadPriority(Result, iPriority);
end;
Function CloseThread( ThreadHandle : THandle) : Boolean;
begin
Result := TerminateThread(ThreadHandle, 1);
CloseHandle(ThreadHandle);
end;
procedure ThisIsTheThread;
begin
MessageBoxW(0,'I am in your target : Dll file','woO!',0)
end;
procedure Run;
Var
hThread : THandle;
begin
hThread := StartThread(@ThisIsTheThread);
hThread := StartThread(@ThisIsTheThread,THREAD_PRIORITY_ERROR_RETURN);
CloseThread(hThread);
end;
procedure mydllproc(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH:
begin
Run;
end;
end;
end;
begin
DllProc := mydllproc;
mydllproc(DLL_PROCESS_ATTACH);
end.
PS:如上所述,在 32 位进程中工作正常。
64位进程只能加载64位模块。 32 位进程只能加载 32 位模块。
因此应该清楚,您不能将 32 位 DLL 注入 64 位进程。为了注入 64 位进程,您需要将 DLL 重新编译为 64 位模块。
完成后,您将不得不更改 DLL。您不能在 DllMain
中做很多事情,如 MSDN 文档中所述。当然,显示对话是完全违反规则的。从您的 DllMain
呼叫 CreateThread
并在那里完成工作。