相信大家都知道以为程序的入口为main函数,但是程序的真正的入口不是main而是mainCRTStartup,那么我们如何找到他的地址呢?
先用第一种方法,就是直接代码显示
#include<stdio.h> #include<stdlib.h> int main() { int ary[5] = {1, 2, 3, 4, 5}; int nOffset= ary[(0x0040003C - (int)ary) / sizeof(ary[0])]; //0x00400000 = (int)ary + sizeof(type) * n //n = (0x00400000 - (int)ary) / sizeof(ary[0]) printf("%p\r\n", ary[(0x00400000 - (int)ary) / sizeof(ary[0])]); printf("%p\r\n", ary[(0x00400000 + 0x3C - (int)ary) / sizeof(ary[0])]); printf("%p\r\n", ary[(0x00400000 + nOffset - (int)ary) / sizeof(ary[0])]); printf("%p\r\n", ary[(0x00400000 + nOffset + 0x28 - (int)ary) / sizeof(ary[0])]); printf("%p\r\n", ary[(0x00400000 + nOffset + 0x28 - (int)ary) / sizeof(ary[0])] + 0x00400000); system("pause"); return 0; }
再说一种思路就是直接在内存中查找
我用的vc++6.0编译器
首先直接定位0x00400000,可以看到内存中显示00905A4D。通过观察右边窗口有MZ可以得知找正确了
从00905A4D这里往下找4行空4个字节即000000E0
在地址栏输入0x00400000+E0 找到00004550。在右边出现PE则说明找对了
在从00004550向下找行半即000012B0(这就是程序的真正入口地址)
接下来我们再来验证验证
首先找到mainCRTStartup, 在这里下断点,然后打开反汇编
反汇编中得到004012B0即为入口地址,验证正确