目标程序
程序下载:CRACKME
解压密码:9unk
任务目标:分析程序算法部分,并写出注册机程序。
观察程序
算法分析
首先加载程序到入口点
“Ctrl+N” 查看程序的 API,并对 GetDlgItemTextA 设置断点
我们继续运行程序,此时程序停在断点处
我们再回头回顾一下,GetDlgItemTextA 函数的参数值和返回值。
“Ctrl+F9” 运行程序到返回,看到此时程序获取了 name “9unk”。我们可以注意到 eax 的返回值是 4
“F8” 单步步过,查看程序对 name 是如何处理的。
1 | cmp eax,1 // eax - 1 |
很明显上面这段就是在判断你有没有输入 Name,如果没有就跳转报错。
我们继续按 “F9” 运行到下一个断点,然后再按 “Ctrl+F9” 运行到返回。此时可以看到这里获取了 password,eax 返回值为 6
从程序的角度出发,程序会获取用户输入的错误的序列号与正确的序列号进行比较,所以我们可以对错误的序列号设置内存访问断点,看看程序哪些地方使用了。
继续 “F9” 运行程序,此时程序停在了如下位置
我们开始分析程序
1 | mov al, byte ptr ds:[esi] // 把 esi 的第一个字节传给 al |
1 | test al, al // 逻辑 and 运算,判断 al 是否等于零。也就是判断输入值是否为空 |
可以看到如值为空,程序就会跳转到如下 call 指令处
1 | cmp al, 0x41 // al的值 和 0x41(字母 A)进行比较 |
可以看到值小于字母 A 就会跳转到如下位置。可以看到这是一个 MessageBox 错误弹窗
如果值大于等于字母 Z 就会跳到如下位置。可以看到这是一个正常的循环。
从上面的这两个跳转可以判断,我们输入的 name 必须是小写的字母。
这里可以看到我输入的 9(0x39)肯定小于 0x41,所以会跳转报错,如下图示所示
我们重新输入,再进行测试。按照之前的步骤,单步步过到 call 指令处
按 “F7” 步入 call 指令,可以看到这个 call 指令只进行了两个操作。
1 | cmp al,20 // al - 20 |
可以看到 al 寄存器的值变成了 0x4A(字母 J)
1 | mov byte ptr ds:[esi], al // 把原来 al 的值替换成 0x4A |
可以看到这里把小写字母 j,转换成大写字母 J
我们继续执行,可以看到这里第一个 name 字符已经结束循环了
我们继续运行直到所有字符循环结束,跳到如下位置
继续 “F7” 步入,查看 call 指令
1 | xor edi, edi // edi 置零 |
1 | mov bl, byte ptr ds:[esi] // 将 esi 存入 bl 中 |
可以看到此时的 bl 肯定不会等于零,所以就不会跳转
1 | add edi, ebx // edi = ebx + edi,此时 edi = 0x4A |
继续单步执行,可以看到 esi 存储着 “JUNK” 的累积值 0x138
把上面的 call 指令运行结束后,我们继续运行程序
1 | xor edi, 0x5678 // edi 异或 0x5678 |
我们继续运行程序到入如下位置
继续步入到 call 指令
1 | // 置零操作 |
1 | mov esi, dword ptr ss:[esp+0x4] // 将错误的序列号传到 esi |
1 | sub bl, 0x30 // bl - 30 |
1 | // 结束第一个循环 |
我们继续第二次循环查看结果
1 | // 原 edi=1,eax 为固定值 A |
循环结束后查看 edi 的值
概括来说上面的计算就是:把十六进制 “123456” 序列号转换成十进制 “123456”
下一条指令是 EDI 异或 1234,然后再传给 ebx
可以看到下面有个比较和跳转指令,这里是把 name xor 5678 和 serial xor 1234 的值进行比较。
所以我们现在以 junk 这个 name 先计算出它的 serial
1 | 5740 = serial xor 1234 // 这是十六进制运算 |
注册机编写
- name - 0x20;然后再一次把每个字符串的值相加;最后再 xor 0x5678
- serial = name xor 0x1234
1 | /* |
编程比较烂,就先这样,能用就行。
reference
- 本文标题:x64dbg-算法分析一
- 本文作者:9unk
- 创建时间:2020-12-27 15:26:28
- 本文链接:https://9unkk.github.io/2020/12/27/x64dbg-suan-fa-fen-xi-yi/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!