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」というメッセージが表示されますが、数秒後に「 Exception EAccessViolation in module test.dll at 00FFE102」と言ってクラッシュします。アドレス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 に答える