-7

SHFileOperationコードインジェクションを使用して呼び出したい。私のコードは、 MessageBoxfromのような単純な関数を呼び出している間は正常に動作しますが、 fromuser32.dllを呼び出している間は動作しません。ShFileOperationshell32.dll

問題があると思われるコードの部分を投稿します。問題が構造体の実装にあることはわかっています。

以下は、RemoteInfo 値のイメージです。

http://www.freeimagehosting.net/uploads/219d79fc30.jpg

//構造
タイプ
  LPSHFILEOPSTRUCT = ^SHFILEOPSTRUCT;
  SHFILEOPSTRUCT = パックされたレコード
    ワインド: HWND;
    wFunc: UINT;
    pFrom: PAnsiChar;
    pTo: PAnsiChar;
    fFlags: FILEOP_FLAGS;
    fAnyOperationsAborted: BOOL;
    hNameMappings: ポインタ;
    lpszProgressTitle: PAnsiChar;
  終わり;

//リモート情報
タイプ
  TRemoteInfo = レコード
    LoadLibrary: 関数 (lpLibFileName: PChar): HMODULE; stdcall;
    GetProcAddress: 関数 (hModule: HMODULE;
      lpProcName: LPCSTR): FARPROC; stdcall;
    shf: SHFILEOPSTRUCT; ;
    Kernel32: Char の配列 [0..20]。
    shell32: Char の配列 [0..20];
    SHFileOperationA: Char の配列 [0..20]。
    Fromlpbuff: 文字の配列[0..20]; //ソースパス
    Tolpbuff: Char の配列 [0..20]; //指定パス
  終わり;

//初期化                      
                      ....
ZeroMemory(@RemoteInfo, SizeOf(RemoteInfo));
  RemoteInfo.shf.Wnd := 0;
  RemoteInfo.shf.wFunc := FO_COPY;
  RemoteInfo.shf.pFrom := @remoteInfo.Fromlpbuff;
  RemoteInfo.shf.pto := @remoteInfo.tolpbuff;
  lstrcpy(RemoteInfo.shf.pFrom, 'e:\1.jpg' + #0#0);
  lstrcpy(RemoteInfo.shf.pto, 'f:\1.jpg' + #0#0);
  RemoteInfo.shf.fFlags := FOF_ALLOWUNDO;
  RemoteInfo.shf.fAnyOperationsAborted := false;
                      ....
4

1 に答える 1

2

このコードの差し迫った問題は、文字列パラメーターへのポインターをレコードに格納していることです。これらのポインターは、メインプロセスのアドレスです。ターゲット プロセスでは無効です。モジュール名と関数名ですでに行っているように、これらの値をレコードの固定サイズの配列に格納する必要があります。次に、リモート関数内のポインター フィールドを初期化します。

しかし、実際には必要以上に複雑にしています。GetProcAddressリモート機能で使用する必要はまったくありません。関数全体を DLL に入れます。そこでは、必要な関数を呼び出すことができ、Delphi リンカと OS ローダーにより、実行時にすべての関数を呼び出すことができるようになります。VirtualAllocExまた、すべての変数を;で割り当てる必要もありません。DLL 関数で通常のローカル変数を使用できます。

CreateRemoteThreadプログラムの過程で 3 回使用します。LoadLibrary1 回目は、ターゲット プロセスのアドレス空間に DLL を取得するための呼び出しを挿入することです。2 回目は注入された関数を呼び出すことであり、3 回目はFreeLibrary終了後に呼び出すことです。トリッキーな部分は、ターゲット プロセスで注入された関数のアドレスを見つけることです。Code Project に関する Alexey Kurakin の記事では、独自のプロセスで関数の相対アドレスを見つけ、そのオフセットをリモート プロセスに適用して、2 番目の呼び出しに渡す引数を決定する方法を示していますCreateRemoteThread

ShFileOperation最後に、サポート レコードを自分で宣言する必要はありません。Delphi は、 ShellAPIユニットでそれらをすでに宣言しています。fo_Copyそこには、必要なさまざまなフラグの名前付き定数もあります$0002

于 2010-07-12T14:42:37.840 に答える