加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

将DLL注入的代码从Delphi 7转换为Delphi XE2

发布时间:2020-12-14 02:09:39 所属栏目:Windows 来源:网络整理
导读:我有一个旧的注射器,由我在Delphi 7中制造,我试图以这种方式改变它,它仍然可以在XE2中工作,但我失败了.-新的测试dll适用于我的旧注射器没有任何问题所以即时确定我的注射器有虫子. 这是我制作的代码: procedure TForm1.InjectDLL(const ADLLName: String; t
我有一个旧的注射器,由我在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,length(dllname) + 1,MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);

  WriteProcessMemory(hProcess,pDLLname,Pointer(dllname),bw);

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

我只需要将hProcess和hRemoteThread更改为THandle并将bw更改为NativeUInt. showmessage告诉我一切正常.由于String类型从d7更改为XE2,因此必须存在细微差别.我也尝试将dll名称转换为PAnsiChar,但它对我没有任何改变.

希望我能为您发布足够的信息.

解决方法

在Unicode Delphi下,代码的最终结果是将UTF-16文本传递给LoadLibraryA.当然,这需要8位ANSI文本.您有两种方法可以解决此问题:

>坚持使用ANSI文本,只需在代码片段中用AnsiString替换字符串即可.>切换到Unicode文本.使用LoadLibraryW并应用Arnaud建议的更改以正确处理16位文本的长度.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读