前几天在论坛上问了个问题,就是关于ollydbg中Debugging options->Events->Make first pause at : System breakpoint,Entry point of main module和WiNMain 的区别,幸得forgot老大的指点,学到了不少东西,同时也感觉到自己基础知识的严重匮乏。于是开始查看一些相关的资料。
经过几天的查阅,误解了(之所以是误解,等会儿看到结论就晓得啦)一些东西:
(1) 操作系统运行程序时,先调用CreateProcessA函数,然后把eip设置为PE文件头中的AddressOfEntryPoint,这时才转入用户代码执行。
(2) 当我们写了一个程序,然后通过编译连接器生成PE文件时,这个文件的代码部分看起来像这样:
_start_up
...
call WinMain
...
exit
有了以上三点知识,我觉得应该可以了哈,于是找来了一个没有加过壳的PE可执行文件,用PE Explorer查看了其文件头信息,得知其AddressOfEntryPoint=00401638h,然后设置ollydbg的Make first pause at : Entry point of main module并载入,程序停在了00401638h处,然后再设置Make first pause at : WiNMain再重新载入,程序还是停在了00401638h处,这个应该是可以理解的,毕竟程序没有运行,所以他只能停在AddressOfEntryPoint处。
有了这个初试牛刀,我觉得还可以嘛,好像懂了耶。满心欢喜的从本版置顶的kanxue老大的那基础教学文章中下载了那个附件--notepad.upx.exe来分析,用PE Explorer得知其AddressOfEntryPoint=004010CC,可是我设置Make first pause at : Entry point of main module并载入却停在了0040E8C0处,我再设置Make first pause at : System breakpoint并载入,断在了系统空间,然后我一直F8回到了用户空间的第一条指令也是在0040E8C0处,这个是为何,难道PE文件头部中的这个AddressOfEntryPoint在加壳后的文件中无用?那么系统是怎么知道我该从用户空间的哪一条指令开始执行?
呵呵,罗嗦了这么多,到后头看来我这几天万全是白费阿,还是没有搞懂啊。看来还得请各位帮帮我咯,这到底是怎么回事哦。