Win32 EXE的动态分叉

时间:2011-08-25 14:54:09

标签: c++ exe portable-executable

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

http://pastebin.com/QFHASx75

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

控制台输出:

C:\~\~\Documents\Visual Studio 2010\Projects\loadEXE\Debug>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? 或者知道我为什么会收到这个错误?

2 个答案:

答案 0 :(得分:3)

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

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

在Windows x64(64位和wow64)上,这不再起作用,我真的很惊讶这个技巧可以使用很长时间。

要快速解决这个问题,您需要编写一个启动暂停进程的小型示例项目,并从ctx读取所有寄存器并检查哪一个是入口点。在尽可能多的Windows版本中尝试尽可能多的exes。

这真的是未定义的行为,一旦这个小技巧不再起作用,它就会发生奇怪的访问冲突之类的事情(它再次停止工作,迟早会发生)。 我建议你寻找一种更好的方法将代码注入流程,但后来我不知道你到底要做什么......

答案 1 :(得分:0)

确保安装了正确的VC运行时可再发行组件。正确的意思是:

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