1

我有一个简单的 DLL,我将它注入到记事本中,仅用于测试目的。我的注射器代码是这样的:

uses
  Windows;

var
  BytesWritten:  cardinal;
  PID, Process, Thread, ThreadId, hKernel: dword;
  pLoadLibrary, Paramaters: pointer;
    DLL: AnsiString;

    begin
      DLL := 'C:\test.dll'; // Must be full path name.
      PID := 3160;
      Process := OpenProcess(PROCESS_ALL_ACCESS,
                             False,
                             PID);

      Paramaters := VirtualAllocEx(Process,
                                 nil,
                                   Length(DLL),
                                   MEM_COMMIT,
                                 PAGE_EXECUTE_READWRITE);

      WriteProcessMemory(Process,
                         Paramaters,
                         PAnsiChar(DLL),
                         Length(DLL),
                         BytesWritten);

      hKernel := GetModuleHandle('KERNEL32.DLL');

      pLoadLibrary := GetProcAddress(hKernel,
                                     'LoadLibraryA');

      Thread := CreateRemoteThread(Process,
                                   nil,
                                   0,
                                   pLoadLibrary,
                                   Paramaters,
                                   0,
                                   ThreadId);

      WaitForSingleObject(Thread, INFINITE);

      VirtualFreeEx(Process,
                    Paramaters,
                    0,
                    MEM_RELEASE);

      CloseHandle(Thread);
      CloseHandle(Process);
end.

我的 DLL 代码很简单,如下所示:

uses
  SysUtils,
  Classes,
  Windows;

{$R *.res}


procedure EntryPoint(Reason: dword); stdcall;
begin
  if Reason = DLL_PROCESS_ATTACH then
  begin
    MessageBox(0, 'DLL Injected', 'DLL Injected', 0);
  end;
end;


begin
  DLLProc:= @EntryPoint;
  EntryPoint(DLL_PROCESS_ATTACH);
end.

当我在记事本进程中注入 dll 时,我得到 MessageBox 说 DLL Injected,但几秒钟后它崩溃说: 00FFE102 模块 test.dll 中的异常 EAccessViolation。地址 00FFF102 的访问冲突。写入地址 00FFF102。 我使用的是 Delphi 2010,Windows 7 x64,管理员权限,没有 UAC,记事本和 dll 都是 x32...

4

1 回答 1

6

您的 EntryPoint 函数声明不正确。它不应该使用 stdcall。正确的声明是:

procedure EntryPoint(Reason: Integer);

检查 TDLLProc 声明的 RTL 源代码,或参考文档,以确认这是准确的。

如果您在分配给 DLLProc 时没有使用 @ 运算符,编译器将能够告诉您这一点。

正如 Sertac 所说,您还应该在写入目标进程的文件名中包含一个空终止符。

于 2013-08-22T05:23:34.240 回答