CRACK ME
实验原理
OllyDbg:动态追踪工具
四个窗口分别为:反汇编窗口,寄存器窗口,堆栈窗口,数据窗口。
基本调试方法:F2断点,F9执行,F12暂停,双击代码可以修改。
实验要求
算出自己名字对应的序列号。分析序列号生成算法。
实验过程
#####crackme
-
打开OllyDbg,载入CrackMe
-
在反汇编窗口右键,点击search for-name,找到GetDlgItemTextA,是接收输入name和序列号的函数
-
给会进入这个函数的地址加断点
-
运行程序,输入name=“jiran“,serial=”1234“ (随便输的),点击OK
-
先停在了第一个断点,是接受name的,再次点击运行,停在第2个断点。
查看此时的数据窗口,参数String 即为待接收数据。
-
在String处右键,选择Follow in Dump,在左侧定位到了存放这段数据的地址的数据。现在都是空的
-
主菜单中,选择Debug-Execute till return。执行完GetDigItemTextA 。
发现此时数据不再为空,而是1234的ascii值31,32,33,34
-
选中这些数据,右键,Breakpoint-Memory,添加断点
-
运行,进入一段处理数据的函数
这段循环意义:
- 判断字符(存在BL中)是否为0,若为0,将EDI寄存器内容异或0x1234,RET.
- 若不为0,字符减30(即从ascii码转为整型数)
- EDI=EDI*EAX (EAX=0xA)
- EDI=EDI+EBX (EBX即处理的字符)
- ESI+1,再次开始循环(即处理下一个字符)
即将字符串每个字符转为数字后存到EDI,再将EDI*10+下一个数字。
即将字符串转为10进制的整型。如“1234”经过这一函数,转为1234(整型)。
转成数字后,将其异或0x1234,将结果存到EBX中,返回。
-
查看循环执行到最后一个字符时,此时EDI=0x4D2=1234
-
循环结束返回后,比较EAX,EBX。EAX为系统生成的序列号,EBX为自己输入的序列号经过上面循环处理的.若EAX=EBX,输出“good luck”,否则失败
可见现在EAX=0x570C,EBX=0x16E6.
-
0x16E6 XOR 0x1234=0x4D2=1234.符合推理。
于是将系统生成的EAX xor 0x1234 所得的即是输入name ”jiran“对应的序列号。
计算0x570C XOR 0x1234=0x4538=17720
-
则17720即为所求。
-
重新进入crackme,输入”jiran“和”17720“
-
成功。
-
求出自己名字的序列号后,来分析序列号生成算法。
回到前面,处理输入的错序列号的函数返回后,比较了系统生成的序列号EAX和错序列号EBX.
在CMP EAX,EBX 之前,有 CALL 0040137E ; PUSH EAX
所以0040137E所在的函数即为系统生成序列号的函数
-
0040137E
分析此函数:
-
读取字符
-
若字符的ascii码小于41(即不是字母),报错
-
若字符的ascii码大于5A(是小写字母),减0x20(变为大写字母)
-
循环,将字符串保存到ESI中
-
若字符串结束,call 004013C2(根据步骤18分析,此函数将字符串加起来放到了EDI中)
-
将EDI 异或 0x5678
-
EAX=EDI
-
返回
由此得到了序列号生成的算法:将字符串转为大写字母后,ASCII码相加,然后异或0x5678得到EAX,最后异或0x1234得到序列号。
-
-
004013C2
分析:
-
读取字符(到BL中)
-
若字符串结束,返回
-
将字符都加到EDI
-
-
得到算法,验算。
17步中得到了算法:将字符串转为大写字母后,ASCII码相加,然后异或0x5678.
下用“jiran”计算。之前的步骤已经得到,“jiran”对应的正确序列号为17720.
- “jiran"转为”JIRAN"
- "JIRAN"的ascii码相加:4A+49+52+41+4E=174
- 174 XOR 5678 = 0x570C
- 570C XOR 1234 = 0x4538 = 17720
- 成功。
附加题:crack1
-
进入OllyDbg,载入CRACK1.exe
-
在汇编代码中找到了输出成功或失败的一段代码。发现它是在call 004028D0后,比较结果,进入输出成功或失败
-
在call004028D0处设断点,运行
-
到断点处后,按F7单步进入,发现这段代码比较了EAX和EDX的值。
而EAX=输入的serial“jiran”,EBX=Benadryl.
则猜测Benadryl即为正确序列号
-
重新输入序列号,成功。
实验总结
通过本次实验,更加深入掌握了OllyDbg的操作,了解到了软件序列号生成的一种方法,体会到了破解软件的感受。