动态加载win32可执行文件

技术细节: 01c/;B windows环境下,创建进程的时候我们可以指定为suspend模式,也就是在CreateProcess函数调用的时候指定参数为CREATE_SUSPENDED,则该创建的进程将保持suspend模式,只是把该exe文件导入到内存中而不运行,直到调用函数ResumeThead恢复该进程运行.而在suspend模式下,可以对该exe进程内存空间进行读写操作(用ReadProcessMemory 和 WriteProcessMemory函数).这样的话,想想,就可以对该空间进行改写,比如可以用另一个进程的镜像覆盖掉该进程,则恢复运行状态的时候,第一个进程空间里面运行的其实是第二个进程.这样我们看到的名字是第一个进程的名字,其实运行的实际上就是第一个进程. i 5>> j=P I)$ L 步骤可以如下: 83&^{jqB4j 1.调用CretaeProcess函数创建第一个进程,该进程处于suspend模式(记得参数CREATE_SUSPENDED ). Iu0 nu[_Mr 2.调用GetThreadContext函数获取第一个进程的各个寄存器值.其中EBX的值指向的就是该进程的PEB,EAX寄存器保存了该进程的入口点 (entry point) qs,rtvLvmj 3.从PEB中获取该进程的 base_address, [ebx+8]的值 =WuOT- ] 4.把第二个进程读入到内存中,用ReadFile函数调用即可,注意如果文件对齐和内存对齐不一样的话,必须做必要的对齐操作. T26 26 @"e 5.如果第二个进程和第一个进程有相同的基地址(base-address),并且第二个进程的大小小于第一个进程,则只要简单的调用WriteProcessMemory函数覆盖掉第一个进程的进程空间,然后恢复运行即可. 6r$7~I?d 6.否则的话,先调用ZwUnmapViewOfSection把第一个进程的镜像映射去掉,该函数由ntdll.dll导出.然后调用VertualAllocEX函数在第一个进程内存空间里面申请足够大的内存.然后拷贝第二个进程的镜像到该空间(利用WriteProcessMemory函数) z?]t +($@ 7.假如调用ZwUnmapViewOfSection操作失败,但是第二个exe是可重定位的.则可以在第一个进程空间里面的任何位置开始申请足够大的空间,在该分配的空间对第二个进程进行重定位.然后拷贝重定位后的exe到第一个进程空间里,开始位置就是申请的空间位置. XNW{! 78~ 8.用第二个进程的base-address修正PEB中相应的值,位置是[ebx+8] ( 04^ d 9.用EAX设置第二个进程的入口点地址 }a81 Tkq 10.调用SetThreadContext函数修正 U v~Ck. N 11.调用ResumeThread函数恢复该进程运行. 8<_S#x ( mequ iKh6q

你可能感兴趣的:(动态加载win32可执行文件)