如何找到程序的真正入口mainCRTStartup

相信大家都知道以为程序的入口为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即为入口地址,验证正确

 

posted on 2017-12-11 22:47  秋雨丶梧桐  阅读(4336)  评论(0编辑  收藏  举报

导航