浅谈反汇编分析,某软件为例
先废话不多说,上软件演示下现在显示的是未授权,点下激活按钮试试
要我们登录邮箱,我暂时就不登陆,可以点否。
啊哟,显示注册码并不正确{:6_218:}
现在这啰嗦几句,如果你不会,把软件载入OD 或者 查下软件有没有壳 还有啥其他的细节 请在下方回帖,我知道可能一个细节让你找很多天或者让你困惑很久,知识不能有残缺或者盲点,如果你不会,请一定回帖!!!
先来查下壳
VC++6.0后面还带个括号,先不管,反正是没壳
那就载入OD查一下字符串吧,选择智能搜索。
Ctrl+F
输入 “ 授权码 ”
发现找不到。。。。
那就换种方法吧
单机箭头所指的选项。
把钩都点上,然后点确定。
为什么要钩上这几个?我钩别的不行吗?钩上了有什么用?
刚才在点激活的时候,软件不是弹出一个页面说授权码错误吗?
在windows中那叫MessageBoxAPI函数,至于上面钩上面后面都带了A W 或者EXA EXW 那暂时先不管,嘿嘿
有什么用我们再去激活软件试试{:5_121:}
发现软件暂停了,而右边寄存器窗口显示的,就是提示我们没有登录,好暂时先不管,按下键盘的F9 或者点那个三角形的图标那个按钮运行起来。(三角形按钮就在暂停的右边)
可能会出现点一下运行他还没有出来提示你登录邮箱的界面这时候多点几次运行就行了。
接下来它就提示你 登录不登录邮箱,点否!
然后发现软件又暂停了。
看见没,右边的寄存器窗口的字符串就是等下要出来提示你错误的信息。
这时候在右下角的CALL到什么什么的那个位置先单击选中,然后右键选择反汇编窗口跟随
此时有个问题为什么要那个地方右键 反汇编跟随呢?
先说一下MessageBox是一个API函数对吧,函数是由一些基本命令来组成的,那么在汇编中怎么表示是个什么样的呢?
它是call 加上一个地址 比如 call 0x00123456 call就是程序调用的函数,说了这么多跟反汇编窗口跟随有什么关系啊!?
其实不然,call 的原理是 esp 会减去4 然后 esp的内存会存储着当前EIP+当前指令的长度,相加的结果就等于下一个指令的长度,然后EIP就会=00123456 也就是call 后面的那个地址,此时ESP存着的就是下一个指令的地址。
eip就是程序当前执行的位置。
我知道此时可能有人懵了,没关系没关系。我来举个例子!
今天早上我要去找朋友去外面玩 (有顺序的行走暂时还没有倒退)然后我看到前面有一家肯德基,口馋了想去吃(这就好比程序遇到了call ),结果我摸了摸口袋没钱,(这就好比我不知道注册码,但是我想体验正版的功能)
万般无奈之下,看见前面墙角有个绿色的纸,于是我过去一看,啊50块,有钱吃了!我先把自行车停到外面(这就好比 esp-4 然后 esp=我下次要出来的地方) 我兴高采烈拿着钱去了肯德基里面(这就好比程序进了call了 这次call上的是肯德基)我高高兴兴的吃了一顿之后我出来了(call走完了该出来了),于是我骑上自行车继续去找朋友去玩.
说了这么多聪明的你应该懂了吧大致的意思吧{:5_121:}
然后呢在返回的地方下个断点,怎么下断点 双击一下箭头所指的地方就行了或者F2
然后点这个b
为什么要点这个啊? break 断点的意思
把7开头的全部删除,因为我们找到更近的断点了。
什么更近 啥意思?为什么要删除7开头的 ???
就目前楼主就见过 6 7 开头的地址 而 大多数程序也这样的
67开头的都是系统领空那个MessageBox 不就是调用系统的API吗 执行MessageBox也就执行到了系统领空去了,windows自带的。
更近 也就是说我们当前找到的地址位置离 程序判断注册是否正确 很近 意思是说系统领空不近咯?
我自己给自己出问题纠结死了{:6_221:}
好了,然后再点运行或者按F9 再次尝试激活
然后点击确定!
发现暂停下来了,仔细一想好像不对啊,是不是应该让错误提示弹出来之前就让程序暂停下来啊,想这样的话程序已经判断完了啊,所以现在应该出这个call不吃了肯德基了我要走了嘿嘿{:5_121:}
按F8单步 一直执行到ret这个指令这儿来
然后在 ret 这个指令上再按一次F8出call
ret 是 返回的意思 返回到哪儿? 返回到内存esp里的地址里 然后esp会自加 加多少啊 一般都是加4,所以call和ret是一起出现的,再复习下 进call的时候 esp会存储存下一条指令的地址然后自己减去4 此时eip就等于 肯德基
吃完了要返回该走了这时候eip=(自行车) 括号代表内存的意思,好了应该明白了吧。
出call了以后向上面看,看有没有能过跳过当前自己位置的指令,我看不懂英文但是会知道一点套路吧,判断有错误也就会有正确,现在我们执行的是注册错误的代码,那么肯定就有正确的咯,正确与错误不久是判断吗,判断啥?判断你输入的是不是和程序它自己运算出来的一样,所以我们向上找找看有没有判断 !
果然找到了看见左边红线了没有,那就代表跳转。
好双击或者F2下个断点
再次去注册
发现程序暂停了,线成了灰色的
好F8单步向下走。
执行到这个跳转来发现 eax=0 跳转成立,而已上面还有个 test al almov eax,dword ptr ds: 还有个call 为什么只看这几个不看其他的 ? 因为它离判断最近!!!
好,那么问题来了,这几个有什么用啊?这几个指令影响条件是否成立,一定有用。
那它先call 什么的 再 mov什么的 然后再test什么的 都是什么意思啊?
call 这里面就是命令之间的运算
mov eax,dword ptr ds:[0x855C34] 这个命令什么意思啊??
mov 移动的意思 eax 寄存器(存放数据的容器就叫寄存器) ptr 取地址 ds 数据段段寄存器 0x855c34 常量
dword 4个字节的意思
连起来就是说 把长度为4字节的0x855c34这个地址的数据移动给eax
打个比方,有10个仓库分别编号是 1~10
现在把1号仓库里面的东西给2号就是相当于mov 2号仓库, dword ptr ds:
如果不加 ptr ds 这样 mov 2号仓库,1号仓库
就代表把1号仓库的名字给2号仓库!
聪明的你懂了吧。
最后一个比较 test al al 虽然我不懂test具体用处但是知道大慨,就是比较两个数 如果都等于0结果就是0 如果一个是1一个是0 计算的结果为1 都是1运算的结果也为1。
al 是8 位寄存器中的第一个寄存器
字节是什么东西啊?那 eax 后面不是有8位数 那又是什么意思呢?
计算机的运算机制为2进制 设计者为了容易看懂就用8个二进制数代表一个字节,为什么用8位代表一个字节?
问老外吧,我也不知道为什么。{:6_221:}
在反汇编中大多数都是用16进制来表示的,1个十六进制数 就是 4个二进制数组成的 那么两个十六进制数就是一个字节了
al是占后两位也就是一个字节
现在程序拿它来作比较了,现在eax=0 比较肯定对我们不利!!!
eax为什么会是等于0??
不就是 Mov dword ptr ds:[0x855c34] 这个常量数据地址的值给eax的吗?
好,我们找下 这个常量地址的数据到底是多少!!!!
来到左下角这个窗口,按下ctrl+G
把常量粘贴到上面去,然后回车
看见没有数值为0,接下来选中这一行右键
选择 word 好像byte也行嘿嘿。
word 就是两个字节 byte就是一个字节 dword 就是 双字 两个 word 也就是4个字节
先点b 删除所有断点,放心硬件断点不会消失
好了F9运行程序,再次激活
运行过后发现
看见没有
程序要给这个常量一个0 能让他给0吗?嘿嘿
改成1
然后点汇编
再复制到可执行文件
选择所有修改
好了程序到这里就结束了,下次再见!
上面如果有讲的不好的地方请回复指出来
在另外啰嗦几句
只要看得懂26个英文字母 有一定的逻辑能力(不要求很高),会乘法口诀表 会-999999999999~999999999的加减乘除运算,看得懂中文,知道意思,就可以学得会了啊,嘿嘿。{:5_121:}
{:5_188:}沙发先带着 板凳我的.{:5_122:} 本帖最后由 lwh15524868334 于 2016-2-16 15:08 编辑
esp会减去4 eip等于 肯德基 ,完了要返回该走了这时候eip=(自行车) ,我看到前面有一家肯德基,口馋了想去吃,,,,,,
我一共吃了三次肯德基
喜欢这种教学方式,不说了我去吃肯德基
能看出楼主真的是用心在教大家,我代表全体成员感谢楼主!祝2016一切顺利!{:5_121:} 楼主讲的还是蛮详细的支持下! 先留个名先。 很好,喜欢这种讲得事无具细的教程,适合新手学习 楼主牛X,这教程适合我这样的新手学习 太刁了!然而很多都不懂。。。。