相信大家都知道以為程序的入口為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即為入口地址,驗證正確