首页
社区
课程
招聘
[求助]关于线程注入的奇怪问题
发表于: 2008-4-2 11:32 4766

[求助]关于线程注入的奇怪问题

2008-4-2 11:32
4766
网上到处都有的一篇关于线程注入的源代码,但是遇到下面的问题,在代码中有注释(红色部分),请Delphi大侠们指点指点。

program Project1;

{$IMAGEBASE $13140000}

uses
Windows, shellapi;

var
ProcessHandle, PID: longword;
ExeFile:string = '这是一段测试字符串';
{问题出现在如果ExeFile不是在这里初始化,而是在主体begin .. End 过程中
赋值时,会出现注入失败,即Explorer.exe出错??}


procedure Main;
begin
MessageBox(0, PChar(ExeFile),'测试',0);
{如果这里换 Showmessage(Exefile)也会导致注入Explorer.exe失败,为什么?是不是一定要WinAPI函数才行?}
end;

procedure Inject(ProcessHandle: longword; EntryPoint: Pointer);
var
Module, NewModule: Pointer;
Size, BytesWritten, TID: longword;
begin
Module := Pointer(GetModuleHandle(nil));
Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);
CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID);
end;

begin
//ExeFile:= '这是一段测试字符串';
{如果加上上面这一句会导致注入失败,即Explorer.exe出错,为什么???}GetWindowThreadProcessId(FindWindow('Shell_TrayWnd', nil), @PID); //获取explorer的PID
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID); //打开进程
Inject(ProcessHandle, @Main); //插入代码
CloseHandle(ProcessHandle); //关闭线程句柄
end.

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
注意main的参数
2008-4-3 16:36
0
雪    币: 241
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
是不是参数的传递出错了?
那么如何让 ExeFile 的值正确传入 main过程中???
2008-4-3 18:55
0
雪    币: 241
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
procedure Main;
begin
MessageBox(0, PChar(ExeFile),'测试',0);
{如果这里换 Showmessage(Exefile)也会导致注入Explorer.exe失败,为什么?是不是一定要WinAPI函数才行?}
end;

如果ExeFile不在声明时初始化它的值而在其它过程中赋值,则 MessageBox 显示出来的则是乱码,不知为什么?
2008-4-3 18:58
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
我对你的代码能弹出MessageBox感到怀疑
2008-4-4 15:41
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
6
procedure Main;
begin
MessageBox(0, PChar(ExeFile),'测试',0);
{如果这里换 Showmessage(Exefile)也会导致注入Explorer.exe失败,为什么?是不是一定要WinAPI函数才行?}
end;

  老弟, 如果不是DLL注入最好用动态获取地址的方式。因为ShowMessage是vcl类的库函数,Explorer.exe并没有加载相应的vcl的运行库。所以失败。 因为MessageBox是在user32.dll所以Explorer.exe默认加载了user32.dll,因为api函数的调用方式最终调用的是通过call iat地址表成员。所以注射后的函数会是这样的。 call [MessageBoxA]  ,故而跳到真正的MessageBoxA的内存地址去执行。
2008-4-4 17:59
0
雪    币: 241
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
感谢Xfish的解释,实在是高!!明白了,学习了!谢谢
2008-4-5 09:36
0
游客
登录 | 注册 方可回帖
返回
//