-7

我想SHFileOperation使用代码注入来调用。我的代码在调用MessageBoxfrom等简单函数时工作正常user32.dll,但在调用ShFileOperationfrom时不会shell32.dll

我将发布我认为有问题的代码部分。我知道问题出在结构实现中。

这是 RemoteInfo 值的图像:

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

//结构
类型
  LPSHFILEOPSTRUCT = ^SHFILEOPSTRUCT;
  SHFILEOPSTRUCT = 打包记录
    Wnd:HWND;
    wFunc:UINT;
    p来自:PAnsiChar;
    pTo:PAnsiChar;
    fFlags:FILEOP_FLAGS;
    fAnyOperationsAborted: BOOL;
    hNameMappings:指针;
    lpszProgressTitle:PAnsiChar;
  结尾;

//远程信息
类型
  TRemoteInfo = 记录
    LoadLibrary:函数(lpLibFileName:PChar):HMODULE;标准调用;
    GetProcAddress:函数(hModule:HMODULE;
      lpProcName:LPCSTR):FARPROC;标准调用;
    shf: SHFILEOPSTRUCT; ;
    Kernel32:Char数组[0..20];
    shell32: 数组 [0..20] 的字符;
    SHFileOperationA: 数组[0..20] 的字符;
    Fromlpbuff:char数组[0..20];//源路径
    Tolpbuff:Char的array[0..20];//Des路径
  结尾;

//初始化                      
                      ……
ZeroMemory(@RemoteInfo, SizeOf(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 链接器和操作系统加载器将确保它们都可以在运行时调用。您也不需要用VirtualAllocEx;分配所有变量。您可以在 DLL 函数中使用普通的局部变量。

您将CreateRemoteThread在整个程序过程中使用 3 次。第一次是注入调用以LoadLibrary将您的 DLL 放入目标进程的地址空间。第二次是调用你注入的函数,第三次是FreeLibrary在你完成后调用。棘手的部分是在目标进程中找到注入函数的地址。Alexey Kurakin 关于代码项目的文章演示了如何通过在您自己的进程中查找函数的相对地址来做到这一点,并将该偏移量应用于远程进程以确定传递给您的第二次调用的参数CreateRemoteThread

Finally, there's no need to declare the support records for ShFileOperation yourself. Delphi already declares them for you in the ShellAPI unit. There you'll also find the named constants for the various flags you need, like fo_Copy instead of $0002.

于 2010-07-12T14:42:37.840 回答