如何找到程序的真正入口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即為入口地址,驗證正確

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM