CRACK ME

CRACK ME

实验原理

OllyDbg:动态追踪工具

17

四个窗口分别为:反汇编窗口,寄存器窗口,堆栈窗口,数据窗口。

基本调试方法:F2断点,F9执行,F12暂停,双击代码可以修改。

实验要求

算出自己名字对应的序列号。分析序列号生成算法。

实验过程

#####crackme

  1. 打开OllyDbg,载入CrackMe

  2. 在反汇编窗口右键,点击search for-name,找到GetDlgItemTextA,是接收输入name和序列号的函数

    1

  3. 给会进入这个函数的地址加断点

    2断点

  4. 运行程序,输入name=“jiran“,serial=”1234“ (随便输的),点击OK

    3输入

  5. 先停在了第一个断点,是接受name的,再次点击运行,停在第2个断点。

    查看此时的数据窗口,参数String 即为待接收数据。

    4.缓冲区

  6. 在String处右键,选择Follow in Dump,在左侧定位到了存放这段数据的地址的数据。现在都是空的

    5.40217E数据

  7. 主菜单中,选择Debug-Execute till return。执行完GetDigItemTextA 。

    发现此时数据不再为空,而是1234的ascii值31,32,33,34

    6.返回

  8. 选中这些数据,右键,Breakpoint-Memory,添加断点

    7.数据断点

  9. 运行,进入一段处理数据的函数8.运行计算

    这段循环意义:

    1. 判断字符(存在BL中)是否为0,若为0,将EDI寄存器内容异或0x1234,RET.
    2. 若不为0,字符减30(即从ascii码转为整型数)
    3. EDI=EDI*EAX (EAX=0xA)
    4. EDI=EDI+EBX (EBX即处理的字符)
    5. ESI+1,再次开始循环(即处理下一个字符)

    即将字符串每个字符转为数字后存到EDI,再将EDI*10+下一个数字。

    即将字符串转为10进制的整型。如“1234”经过这一函数,转为1234(整型)。

    转成数字后,将其异或0x1234,将结果存到EBX中,返回。

  10. 查看循环执行到最后一个字符时,此时EDI=0x4D2=1234

9.结果

  1. 循环结束返回后,比较EAX,EBX。EAX为系统生成的序列号,EBX为自己输入的序列号经过上面循环处理的.若EAX=EBX,输出“good luck”,否则失败

    可见现在EAX=0x570C,EBX=0x16E6.

    10CMP

  2. 0x16E6 XOR 0x1234=0x4D2=1234.符合推理。

    于是将系统生成的EAX xor 0x1234 所得的即是输入name ”jiran“对应的序列号。

    计算0x570C XOR 0x1234=0x4538=17720

    11异或

  3. 则17720即为所求。

  4. 重新进入crackme,输入”jiran“和”17720“

    12

  5. 成功。

    13

  6. 求出自己名字的序列号后,来分析序列号生成算法。

    10CMP

    回到前面,处理输入的错序列号的函数返回后,比较了系统生成的序列号EAX和错序列号EBX.

    在CMP EAX,EBX 之前,有 CALL 0040137E ; PUSH EAX

    所以0040137E所在的函数即为系统生成序列号的函数

  7. 0040137E

    28生成

    分析此函数:

    1. 读取字符

    2. 若字符的ascii码小于41(即不是字母),报错

    3. 若字符的ascii码大于5A(是小写字母),减0x20(变为大写字母)

    4. 循环,将字符串保存到ESI中

    5. 若字符串结束,call 004013C2(根据步骤18分析,此函数将字符串加起来放到了EDI中)

    6. 将EDI 异或 0x5678

    7. EAX=EDI

    8. 返回

    由此得到了序列号生成的算法:将字符串转为大写字母后,ASCII码相加,然后异或0x5678得到EAX,最后异或0x1234得到序列号。
    
  8. 004013C2

    29生成2

    分析:

    1. 读取字符(到BL中)

    2. 若字符串结束,返回

    3. 将字符都加到EDI

  9. 得到算法,验算。

    17步中得到了算法:将字符串转为大写字母后,ASCII码相加,然后异或0x5678.

    下用“jiran”计算。之前的步骤已经得到,“jiran”对应的正确序列号为17720.

    1. “jiran"转为”JIRAN"
    2. "JIRAN"的ascii码相加:4A+49+52+41+4E=174
    3. 174 XOR 5678 = 0x570C
    4. 570C XOR 1234 = 0x4538 = 17720
    5. 成功。
附加题:crack1
  1. 进入OllyDbg,载入CRACK1.exe

  2. 在汇编代码中找到了输出成功或失败的一段代码。发现它是在call 004028D0后,比较结果,进入输出成功或失败23

  3. 在call004028D0处设断点,运行

    26

  4. 到断点处后,按F7单步进入,发现这段代码比较了EAX和EDX的值。

    而EAX=输入的serial“jiran”,EBX=Benadryl.

    则猜测Benadryl即为正确序列号

    24f7步入

  5. 重新输入序列号,成功。

    25成功

实验总结

通过本次实验,更加深入掌握了OllyDbg的操作,了解到了软件序列号生成的一种方法,体会到了破解软件的感受。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值