4

Delphi 7 で作成した古いインジェクターを入手し、その方法で彼を変更しようとしましたが、XE2 でも動作しますが、失敗しました-.- 新しいテスト dll は古いインジェクターで問題なく動作するので、かなり私のインジェクターにバグがあることを確認してください。

ここに私が作ったコードがあります:

procedure TForm1.InjectDLL(const ADLLName: String; targetproc: Cardinal);
var
  dllname: String;
  pDLLname, pStartAddr: Pointer;
  bw: NativeUInt;
  hProcess, hRemoteThread: THandle;
  TID: Cardinal;
begin
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, targetproc);
  pDLLname := VirtualAllocEx(hProcess, 0, length(dllname) + 1,
    MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);

  WriteProcessMemory(hProcess, pDLLname, Pointer(dllname),
    length(dllname) + 1, bw);

  pStartAddr := GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA');
  hRemoteThread := CreateRemoteThread(hProcess, nil, 0, pStartAddr,
    pDLLname, 0, TID);
  WaitForSingleObject(hRemoteThread, INFINITE);
  showmessage('Fehler ' + IntToStr(GetLastError) + ': ' +
    SysErrorMessage(GetLastError));
  CloseHandle(hProcess);
end;

hProcess と hRemoteThread を THandle に、bw を NativeUInt に変更する必要がありました。showmessage は、すべてが機能していることを示しています。String 型が d7 から XE2 に変更されたため、小さな違いがあるはずです。また、dll 名を PAnsiChar としてキャストしようとしましたが、何も変わりませんでした。

十分な情報を投稿したことを願っています。

4

2 に答える 2

7

Unicode Delphi の下でのコードの最終的な結果は、UTF-16 テキストを に渡すことLoadLibraryAです。そしてもちろん、それは 8 ビットの ANSI テキストを想定しています。この問題を解決するには、次の 2 つのオプションがあります。

  1. stringANSI テキストに固執しAnsiString、コード スニペット内で に置き換えるだけです。
  2. Unicode テキストに切り替えます。Arnaud が提案した変更を使用LoadLibraryWして適用し、16 ビット テキストの長さを正しく処理します。
于 2012-06-09T20:29:28.113 に答える
4

Delphi XE2 では、stringが で作られるようになりましWidecharchar=WideChar

だからあなたは書くべきです:(length(dllname)+1)*sizeof(char)あなたのコードに。Delphi 7 と XE2 の両方で動作します。

そして、Unicode パラメーターの「LoadLibraryW」。

于 2012-06-09T18:49:58.697 に答える