组成: 1.引导程序:由vc6 win32 dll工程 2.主程序:MFC工程 引导程序与主程序一起开发,使用时引导程序作为资源放到主程序中。
主程序执行流程: 1. 载入待加壳程序与引导程序,保存待加壳程序入口点与基址。 [cpp] view plaincopy
2.在待加壳程序中加入引导段并重定位引导段。 1.先在待加壳程序上添加区段,用来保存引导代码 [cpp] view plaincopy
2.然后以待加壳程序的基址和区段虚拟地址重定位引导段的代码(重定位引导段代码:因为将引导段的代码添加到待加壳文件中的时候,本来代码的RVA值也是变了的,重定位数据本来是只更正加载基址的,但是现在RVA变了,所以现在就需要重定位rva,就需要得到一个差值,这个差值是需要重定位数据-引导段的基址-引导程序.text段的rva,这样得到的是需要重定位数据的相对于.text节的偏移,然后根据这个偏移+待加壳程序的基址+添加新区段的虚拟地址rva,这样就得到了重定位后的数据。相当于对RVA也进行了重定位,不只是重定位的基址)(这里重定位的时候对引导段需要重定位的数据按照带加壳文件进行了重定位,会不会保存,从而影响对以后程序加壳的操作?答:不会,傻逼,那是程序自己内存空间的数据,又不是内存映射文件的数据!)。 3.写入重定位后的数据 4.改变程序的入口点(关于现在入口点RVA的计算跟上面重定位RVA差不多)。 3.加入导入表并修复导入表
引导程序的固定位置保存着待加壳程序一些信息的结构体,在主程序中会帮引导程序填充好这一块的内容。借助这个,引导程序主要做的就是模拟PE加载器填充加壳程序的IAT,填充的时候注意,要在之前修改下目标文件的rdata区段的属性使其可写,并且因为我们在主程序中对目标程序OEP开始处0x100大小的代码进行异或加密了,这里还要给异或回来,要异或回来的话就要使目标程序代码段可写。最后跳到原程序OEP去执行。
有了框架就可以自己添加任何处理代码了。 http://download.csdn.net/detail/evi10r/4109644 http://download.csdn.net/detail/evi10r/4109643 我上传的这个程序代码加壳后OD中单步走几步就脱掉了。 只是MARK点东西 -----------------------------------------华丽的分割线--------------------------------------------------------- 遇到的问题记录: c移位函数 右移是否一定补0? 答:正数无论左移右移都是补0,负数都是补1
ZeroMemory和memset的区别: 2、ZeroMemory是一个宏,只是用于把一段内存的内容置零,内部其实是用 memset实现的,而memset除了对内存进行清零操作,还可以将内存置成别的字符。 3、如果程序是Win32程序而且不想连接c运行时库,就用ZeroMemory;如果需要跨平台,就用memset。 所以,如果ZeroMemory和memset用于清零操作,其本质是一样的。 2、一个struct有构造函数或虚函数时,ZeroMemory可以编译通过,而“={0}”会产生编译错误。其中,“={0}”的编译错误起到了一定的保护作用,因为对一个有虚函数的对象使用ZeroMemory时,会将其虚函数的指针置0,这是非常危险的(调用虚函数时,空指针很可能引起程序崩溃)。
区段控制
FARPROC WINAPI GetProcAddress( 实际代码中是这样调用的 [cpp] view plaincopy
PE加载EXE的具体过程!这个重点重新开贴再写。
在vs08中会将未使用到的全局变量给优化掉,本来我用vs08写引导段的时候,却发现他不生成.data段,原来是那个全局结构体变量没使用他就直接给优化没了,这样的话我们为了方便预留一个地方让主程序填充这个与目标程序信息有关的结构体,就使用VC6来写引导段程序。 |
|