Ollydbg中寻找main函数入口
本文最后更新于 345 天前,其中的信息可能已经有所发展或是发生改变。
内容目录

《C++反汇编与逆向分析技术》讲解如何查找main函数:

OllyDbg默认情况下将程序中断在PE装载器开始处,不是在main函数开始处,因为需要手工识别main函数的位置。

识别main函数如同识别一个人。要识别一个人,首先观察外观,识别身体和外貌特征,把这些特征和自己认识的人匹配,从而判断这个人的身份。

 

main函数特征:

1、有3个参数,分别是argc、argv、环境变量信息,而且main函数是启动函数中唯一具有3个参数的函数。同理WinMain函数是启动函数中唯一具有4个参数的函数。

2、main函数返回需要调用exit函数,结束程序根据main函数调用特征,找到入口代码第一次调用exit函数处,离exit最近的且有3个参数的函数通常就是main函数。

老钱这里只讲到了识别main函数啊,没有讲怎么找到main函数。

 
 
 

F8大法好(借鉴下,这个比较容易)

文章参考:https://blog.csdn.net/qingshenxue/article/details/6209788

=====================

先声明下:这个和脱壳没关系,不是找壳里面的程序入口哦,只是程序本身的入口,个别朋友不要误会哈。

一般用OllyDBG打开程序的时候,并不是直接定位到程序入口,而是还要先进行一系列的初始化工作,但做这些工作的反汇编代码我们是不需要的,所以我们要快速跳过,直接到程序入口。

我先把方法写出来,然后再简单分析一下初始化的时候都干了什么。

1. 一路F8下去,分别步过下列两个函数
call dword ptr ds:[<&KERNEL32.GetVersion>] ; kernel32.GetVersion
call dword ptr ds:[<&KERNEL32.GetCommandLineA>] ; kernel32.GetCommandLineA

2. GetCommandLineA下面会有好几个Call,从GetCommandLineA往下数(不包括GetCommandLineA本身),第5个Call一般就是程序入口点的Call,F7进去就可以了。

PS:如果是用IDA5反汇编的话,我们点一下“_main proc near”处,然后 Run to cursor(F4)一下基本会直接定位到入口处。

 
 

方法很简单,那来看看在进入程序入口之前,都干了些什么吧。

第一个Call是GetVersion,很好理解,就是获得Windows版本号。

看看我选定的0部分,其中有5个Call,最后一个就是我们前面所找的入口处,前面的四个Call的函数分别是:

__crtGetEnvironmentStringsA : 可能是GetEnvironmentStringsA()的宏定义名称( http://msdn.microsoft.com/en-us/library/ms683187(VS.85).aspx )

_setargv() : 处理命令行参数

_setenvp() :返回环境变量 (这两个函数的作用效果是把参数和环境变量保存到附近的可用“堆(heap)”里面,方便使用。)

_cinit() : 作用就是当检测到我们的参数覆盖了返回地址,能造成缓冲区溢出的时候报错并退出程序。平时我们遇到的讨厌的“遇到问题需要关闭”貌似就是这玩意搞的。

http://msdn.microsoft.com/en-us/library/ms924298.aspx

需要注意的是,很多反汇编代码里面,后面的这三个函数名都不会被直接显示出来,而是显示的函数地址。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇