【问题标题】:Dll injection in x64 process don't workx64进程中的dll注入不起作用
【发布时间】:2016-02-02 04:09:18
【问题描述】:

我已经制作了一个 dll(32 位平台),现在我想注入任何 x64 进程。

在 Delphi 的源代码网络上找到了几个承诺这样做的示例,但是在测试时,没有任何 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 位进程下工作正常。

Source

【问题讨论】:

  • 您不能在一个进程中混合使用 32 位和 64 位代码,既不能使用 DLL 注入,也不能使用常规 DLL 加载。由于显着的架构差异,这根本行不通。因此,您确实需要 64 位 DLL 才能注入 64 位进程。现在,您的示例可能向您保证的是,您实际上并不需要 64 位应用程序来开始将 DLL 注入 64 位进程。但他们肯定不会承诺 32 位 DLL 可以与 64 位进程一起使用,因为这根本不可能。
  • 我相信您误解了那些“源代码网络上的示例”所做的承诺。如果说一段代码同时在 32 位和 64 位下工作,这意味着您可以按原样编译它,适用于这两种架构。

标签: delphi dll-injection


【解决方案1】:

64 位进程只能加载 64 位模块。 32 位进程只能加载 32 位模块。

因此应该清楚的是,您不能将 32 位 DLL 注入 64 位进程。为了注入 64 位进程,您需要将 DLL 重新编译为 64 位模块。

一旦你这样做了,你就必须改变你的 DLL。你不能在DllMain 中做很多事情,正如 MSDN 文档中所详述的那样。当然,显示对话完全违反了规则。从您的DllMain 拨打CreateThread 并在那里完成工作。

【讨论】:

  • 好的,那么,为什么上面的代码甚至为 x64 编译(注入器和 dll 一起)仍然不适用于例如 notepad.exe (x64)? PS:在 Windows 7 Ultimate x64 中测试。
  • 这是一个不同的问题。
  • 我在上面谈到了notepad.exe,见。
  • 您询问了将 32 位 DLL 注入 64 位主机的问题。你说,我已经制作了一个 dll(32 位平台),现在我想注入任何 x64 进程。这就是我回答的问题。你现在似乎想要另一个问题的答案,这是相当不公平的。
  • 那么,我创建一个新问题只是为了了解这一点?请在这里帮助我解决同样的问题:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 2015-07-27
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
相关资源
最近更新 更多