示例程序 链接: http://pan.baidu.com/s/1pL6hHRP 密码: x83g

工作方式:
栈是一种数据结构,特性:先进后出

下面通过分析Stack.exe进行讲解(实例均来自《逆向工程核心原理》一书)。
首先用ollydbg载入stack.exe。如图1所示:

如图1所示:

我们需要着重观察的是CPU窗口和堆栈窗口,此时我们观察到CPU窗口中地址00401000第一条指令为
00401000 >/$ 68 00010000 push 0x100
此时堆栈窗口的内容是:
0012FFC4 7C817067 返回到 kernel32.7C817067
0012FFC4就是囧存期ESP保存的值。地址0012FFC4 中保存的数值为 7C817067,,也就是此函数执行完以后要返回的地址

接下来按快捷键F7/F8都可以 执行本条指令,此时我们仍然着重观察堆栈窗口的变化,如图2所示:

由于图2的涉及内容较多,现在暂且讲一下涉及到的寄存器:

寄存器:
esp: 栈顶指针寄存器(始终保存着栈顶指针,大小为四个字节)
如图二中的堆栈窗口,esp中保存的就是栈顶的地址,图中的 0012FFC0即为栈顶地址
eip: 指令指针寄存器(保存着CPU要执行的指令的地址,此寄存器大小为四个字节)
如图二所示EIP 为00401005,而此程序执行流就在此地址处(也就是下一步CPU 要执行的是地址00401005地址处的内容)

我们首先观察图2发现寄存器窗口中ESP,EIP寄存器中的值颜色发生变化为红色。这表明在CPU中从地址00401000到00401005
过程中这两个寄存器中的值发生啦变化,
此时我们观看堆栈窗口中的变化和图1中的堆栈窗口比较,栈顶指针向上移动四个字节,即:0012FFC4->0012FFC0,也就是执行啦 00401000 >/$ 68 00010000 push 0x100 变化后的结果,因为esp 是四字节寄存器,所以地址从 c4->c0
此时我们可以观看到地址 0012FFC0处的值为 0x100

接下来继续执行程序 按快捷键F7/F8来到如图3所示:

首先我们观察寄存器窗口三个寄存器发生变化:eax esp eip 。

esp 恢复图一中的值

eip 保存下一条指令的地址

eax 为 0x100

eax寄存器的常见作用是:针对操作数和结果的累加器(通常用于保存函数执行结果,变量的操作结果等。。。)

我们同时看到啦堆栈窗口的变化->同样是恢复啦如图一所示的情形,同时地址变化始终未四个字节

关于栈的部分总结

向栈内压数据,站顶指针减小,当向栈外弹出数据,栈顶指针增大,当栈内没数据时,栈顶指针指向栈低

栈是一种从高地址向低地址生长的数据结构

二:实例分析crackme

首先简介分析样本的一般方法:

(1)拿到一个样本,不管是什么,先弄清它是什么文件格式,这里就要求你要对不同的文件格式有所了解了:window(PE),linux(ELF),android(dex,ELF),ios/mac(mach-o)

(2)然后看样本有没有壳或加密,如果有壳就脱壳,有加密就看能不能解密

(3)脱完壳,解完密,后面就是动+静态分析了

动态调试:window(od,windbg),linux(gdb,edb),android(jeb,ida),ios/mac(lldb)

静态调试: ida,010Editor,readelf,objdump,string等

(4)网络抓包工具

wireshark,tcpdump,Charles,BrupSuite

(5)当分析一个样本,有可能程序很大,我们要有快速定位问题的能力,针对不同的样本,要分析不同的功能点,真正工作过程中分析一个样本,是需要一个快速响应,解决问题的能力的,同时在最快的时间内输出相应的分析报告,这个就要靠平时多锻炼了,有一种“阅片无数”的感觉

(6)分析系统级的样本的时候,我们还需要对相应的系统有一个大致的了解,了解相应系统的启动过程,每种系统的自启动方式以及注入方式都不同,我们要对这些不同的系统都比较了解。

(7)有了上面的一些基础,就是多实战了,可以从各个渠道下载不同类型的样本进行练习,积累经验。

当然这个crackme不会用到很高深的技术上面说的只是让大家以后分析样本有一个思路而已。
一般的crackme 无非集中类型
1.序列号
2.解密
3.警告窗口
4.时间限制
5.CD-Check
6.广告去除
7.水印去除
信息收集:
首先我们点击这个可执行文件,看看能够从中获取到多少对我们调试有利的信息如图4,5所示:

从以上两张图中我们知道这个可执行 内部调用到啦MessageBox函数。别的并不能获取到什么。
调试
现在用od打开abexcm1-voiees.exe
我们发现程序很思路很清晰,如图6所示:

从此图可以看出:可执行文件分别调用啦
MessageBox()
GetDrivceType()
MessageBox()
MessageBox()
ExitProcess()
因此根据刚才图四图五所示,我们只要让程序执行最后一个MessageBox()既可以视为crack成功。
程序的大致流程是

如图7就是 本程序的流程相信到这里已经很一幕了然啦吧《

首先程序调用MessageBox()函数进行如图4说明

接下来执行GetDrivceType() 判断本地的驱动器类型是不是HDD 类型(大部分都是返回HDD类型)。

最后就是两个经过判断后的两个MessageBox(),本次是需要使程序调用cd-rom类型的MessageBox()即可

如图6所示中的 当我们选中地址 00401026地址处的时候,如图8:

此处显示一个跳转(也就是关键跳转)

00401026 |. /74 15 je short abexcm1-.0040103D

je (jmp if equal) 通常上面会有一个、cmp指令,通过cmp指令改变寄存器窗口中的ZF标志位,ZF标志位有控制着

je 跳转是否能够实现

if zf=1 je实现跳转

else 接着向下运行

而此处我们只需要让此跳转实现即可:

实现方法:

1.当程序运行到00401026地址处的时候,如果ZF为0 只需选中ZF寄存器将其修改为1即可

2.修改地址00401026处的汇编指令,修改为无条件跳转即可

方法一

如图9 10 11 所示:

修改前如图9:

修改后如图10

最终结果如图11

方法二
如图12 达到效果

小结
1.了解常用寄存器的作用(没必要刻意的去记)
2.由于this 可执行文件使用汇编语言编写的所以没有启动函数上来就是我们要的这点要个其他高级语言作区分
3.掌握ollydbg基本调试快捷键,分析样本基本思路
总结
1.虽然篇幅很小但是每次都会着重讲一个知识点
2.掌握栈的原理
3.掌握分析样本的基本思路

打赏