预备知识
1.关于调试器和反编译工具简介
OLLYDBG是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级32位调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目前最强大的调试工具。
IDA PRO简称IDA(Interactive Disassembler),是一个世界顶级的交互式反汇编工具,有两种可用版本。标准版(Standard)支持二十多种处理器。高级版(Advanced)支持50多种处理器。
UPX(the Ultimate Packer for eXecutables)是一款先进的可执行程序文件压缩器,压缩过的可执行文件体积缩小50%-70%,这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用。通过UPX压缩过的程序和程序库完全没有功能损失和压缩之前一样可正常地运行,对于支持的大多数格式没有运行时间或内存的不利后果。UPX支持许多不同的可执行文件格式包含Windows 95/98/ME/NT/2000/XP/CE程序和动态链接库、DOS程序、Linux可执行文件和核心。
WinHex是一个专门用来对付各种日常紧急情况的小工具。它可以用来检查和修复各种文件、恢复删除文件、硬盘损坏造成的数据丢失等。同时它还可以让你看到其他程序隐藏起来的文件和数据。总体来说是一款非常不错的16进制编辑器。得到ZDNetSoftwareLibrary五星级最高评价,拥有强大的系统效用。
Scylla是一款IAT转储修复工具。
2.PE查壳工具
PEiD(PE Identifier)是一款著名的查壳工具,其功能强大,几乎可以侦测出所有的壳,其数量已超过470种PE文档的加壳类型和签名。
ExEinfo PE是一款免费的Win32可执行程序检查器,它可以检查程序的打包方式,exe保护等,可以帮助开发人员对程序进行编译。
3.汇编指令
4.寄存器
EAX是“累加器”(accumulator),它是很多加法乘法指令的缺省寄存器。
EBX是“基地址”(base)寄存器,在内存寻址时存放基地址。
ECX是计数器(counter),是重复(REP)前缀指令和LOOP指令的内定计数器。
EDX则总是被用来放整数除法产生的余数。
ESI/EDI分别叫做“源/目标索引寄存器”(source/destination index),因为在很多字符串操作指令中,DS:ESI指向源串,而ES:EDI指向目标串。
EBP是“基址指针”(BASE POINTER),它最经常被用作高级语言函数调用的“框架指针”(frame pointer)。
5.Little-endian(小端序)
数据的高位字节存放在地址的高端,低位字节存放在地址低端。
实验目的
通过该实验了解调试工具和反编译工具的使用方法,能够通过分析样本中的详细信息,进行程序的爆破或者算法的还原突破程序的限制,本次实验主要针对Delphi编写的程序。
实验环境
服务器:Windows XP SP3,IP地址:随机分配
辅助工具:Ollydbg、PEiD 0.95、ExeinfoPE、IDA Pro v6.8、Delphi Decompiler、Scylla
破解程序:Brad Soblesky.1、Brad Soblesky.2、BuLLeT.8
实验步骤一
首先利用侦壳子、工具对样本(三个CrackMe)进行侦测分析,判断是否存在保护,然后对于存在暗桩的程序进行一部处理,最后对算法过程等分析回溯。
拿到一个程序,我们首先查壳分析:
哦!C++。我最喜欢C++写的东西了,VB的虚拟机有点烦人。
我们测试一下程序,找找有没有什么分析特征。
有弹窗什么的我最喜欢啦~
那么字符串参考先试试。
OK,双击Incorrect try again进去,找到函数的头部。
开始于00401512处。下断点,F9跑起来,随便输入一个字符串,ok成功断掉。开始单步分析。
首先判断用户输入的是否为空,也就是说是否是大于1,字符串长度,不然就跳飞。
继续单步。
分别看到内置的字符串与用户输入的11,然后使用lstrcmpA进行比较。那么注册码自然是第一个字符串咯。
注册码:<BrD-SoB>,验证一下。
OK。Got it。第一个手工。
实验步骤二
我们继续对第二个程序进行分析,还是使用查壳工具进行分析。
同样是无壳的程序,跑个程序,看看有没有特征。
咦,感觉还是老样子嘛……那么我们OD字符串分析吧。
可以看出,还有至少5字符的变化,那么这个程序算法是变了。
双击Incorrect!!, Try Again.
进去,向上找到函数开始,F2下断,F9跑起来。
函数的开始地址是004014DF。
获取用户的两次输入。
判断第一次输入的是否大于5,不大于5就报Error。
然后初始化i循环变量,循环次数等于Enter1的字符串长度。
取第一个Enter中的第i位,与0x81276345相加。Ebp-10是上文。
写死的,所以循环中每次的相加是固定的。
然后程序的大概算法就是这样的,我们转换成高级语言。
我们来测试一下。
实验步骤三
继续分析第三个,查壳。
咦,这次有壳子。
F8一次,对ESP下硬件读写断点,F9(ESP定律)。
删除断点,F8一次,到达OEP,Dump脱之。
别忘了点Get Eip as OEP哦~~
Fix Dump选择之前dump出的文件,用Scylla修复IAT。
再查壳。
Ok脱壳成功!
运行一下,发现没有弹窗。
那么使用DelphiDecompiler定位Spider地址。
由于最后答案是固定的3E74984B,那么必然注册码也是固定的。
可知按钮地址为0044A2E8。
OD打开,Ctrl+G跳转到,下断。
F9跑起来,随意输入注册码,F8单步分析。
我们发现,先获取了用户输入的字符串值,然后将其转换为Int类型的进行运算,再乘以3。
然后将运算完的转换为Hex值,与Label1上显示的比对是否正确。
由此我们可以推出来算法是Serial乘以3,然后将结果的HEX值与显示出来的3E74984B比较。那么我们反推之将3E74984B转换为10进制,除上3得到的整数值,即3E74984B转换为10进制1047828555然后除以3得349276185。
我们试试看。
Ok,奖杯出来了。