Win32 EXE的动态分叉

Dynamic Forking of Win32 EXE

本文关键字:分叉 动态 EXE Win32      更新时间:2023-10-16

http://www.security.org.sg/code/loadexe.html

http://pastebin.com/QFHASx75

我已经编译了这个,但无法使其正常工作,它运行良好,在控制台中没有显示错误

控制台输出:

C:~~DocumentsVisual Studio 2010ProjectsloadEXEDebug>loadEXE.exe AcceleratedC++Exe_2-0.exe
Original EXE loaded (PID = 4068).
Original Base Addr = 110000, Size = 29000
Unmapped and Allocated Mem for New EXE at 400000
EIP = 772501C4
EAX = 12141F
EBX = 7EFDE000
ECX = 0
EDX = 0
New EXE Image Size = 25000
New EXE image injected into process.
********> EIP = 772501C4
********> EAX = 411307
Process resumed (PID = 4068).

但是我收到了这个应用程序错误。

"应用程序无法正确启动(0xc0000005(。单击"确定"关闭应用程序。">

我是PE格式的新手,不知道为什么会发生这种情况,这篇文章很旧,所以我不确定它是否适用于64b,但我没有备用的32b CD来测试。根据我对PE格式的了解,32b的代码应该在64b上工作。

有人能确认这是否适用于32b吗?或者知道我为什么会犯这个错误吗?

代码修改新进程的入口点,如下所示:

ctx.Eax = (DWORD)v + inpeXH->addressOfEntryPoint;

在Windows x64(64位和wow64(上,这已经不起作用了,我真的很惊讶这个技巧能用这么长时间。

为了快速解决这个问题,您需要编写一个小的示例项目,启动一个挂起的进程,从ctx读取所有寄存器,并检查哪个寄存器是入口点。在你现有的Windows版本上尽可能多地尝试前任。

这充其量只是一种未定义的行为,一旦这个小把戏不再奏效,就会开始发生奇怪的访问违规行为(它迟早会再次停止工作(。我建议您寻找一种更好的方法将代码注入流程,但我不知道您到底想做什么…

确保安装了适当的VC运行时可再发行程序。正确方式:

  • 如果应用程序是32位,则为32位(如果操作系统是64位,则无所谓(
  • 如果应用程序为64位,则为64位
  • 适当的VC运行时版本(VC8/2005、VC9/2008、VC10/2010(
  • VC++redist的正确服务包