吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2109|回复: 50
收起左侧

[原创] 新手学破解记录贴【160个CrackMe】之004

  [复制链接]
15788888 发表于 2024-11-23 20:22
本人刚刚入门汇编逆向破解分析,本帖将记录我对160个CrackMe程序中的第004程序的分析过程。在学习的过程中,我会边学边记录。如果有不正确之处,还请各位指正。


因为003程序我这里并不能正常运行 所以直接跳过003来分析一下004程序。

程序查壳是无壳的 Delphi语言编写的 。输入假码之后没有任何错误提示   只知道如果破解成功 下面的图片框会显示一幅图片。
image.png


首先还是查找字符串 看一下有没有什么有用的字符提示
image.png

字符串这里找到了一个注册成功 上面0x0045803B地址是关键跳转 会跳过注册成功的代码 我们把它nop掉,然后输入完用户名和密码点击图片框 就会直接爆破成功
image.png


已经爆破成功了 继续来研究一下他的注册码算法, 现在这个代码的头部下一个断点 然后来看一下汇编代码。
下图这串汇编代码 相当于 就把用户名的长度加0x5 得出来的十进制数值在和 用户名 和ebx寄存器值进行拼接,和下面的关键比较完全没有关系啊!!!
cmp dword ptr ds:[esi+30C],85      这行代码就是 esi+30的地址数值 如果等于0x85就注册成功,上面的汇编代码完全没有改变esi+30C里面的数值啊!!
image.png

关键点在于esi+30C的数值等于0x85 才可以,是哪里访问的esi+30C这个位置呢  我们下一个硬件访问断点在重新注册试一下看。
image.png
image.png

下完这个断点之后我们发现 只要在注册码的文本框输入一个新的字符 就会断下来。


image.png

断下来之后我们发现了一个 字符串 “黑头Sun Bird15dseloffc-012-OKa123456789” 我测试了一下是正确的注册码 经过测试发发现 输入完激活码需要双击才能注册成功 爆破的时候只需要单击就可以
除了这个正确的激活码我们还发现了 有一个跳转 如果不成立就会给刚才注册的关键比较esi+0x30C的位置赋值,但是赋的值是0x3E 并不是0x85 (跟上面的双击有关 作者留的一个小坑 一会说)

现在已经知道了正确的注册码了 我们向上看 分析一下汇编代码。

第一部分 这部分代码实现了注册码的生成方式 首先 取用户名长度 然后加上0x5 得出来一个数值转成十进制 然后 进行拼接: 黑头Sun Bird&用户名长度&dseloffc-012-OK&用户名
拼接后的值为 黑头Sun Bird15dseloffc-012-OKa123456789  这个也就是正确的注册码。


[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
00457C43 | 51                        | push ecx                          |
00457C44 | B9 05000000               | mov ecx,5                         |
00457C49 | 6A 00                     | push 0                            |
00457C4B | 6A 00                     | push 0                            |
00457C4D | 49                        | dec ecx                           |
00457C4E | 75 F9                     | jne ckme.457C49                   | 循环5次push 0
00457C50 | 51                        | push ecx                          |
00457C51 | 874D FC                   | xchg dword ptr ss:[ebp-4],ecx     | [ebp-4]:"13a1234567890"
00457C54 | 53                        | push ebx                          | ebx:&"鵀B"
00457C55 | 56                        | push esi                          |
00457C56 | 8BD8                      | mov ebx,eax                       | ebx:&"鵀B"
00457C58 | 33C0                      | xor eax,eax                       |
00457C5A | 55                        | push ebp                          |
00457C5B | 68 3D7E4500               | push ckme.457E3D                  |
00457C60 | 64:FF30                   | push dword ptr fs:[eax]           |
00457C63 | 64:8920                   | mov dword ptr fs:[eax],esp        |
00457C66 | 8BB3 F8020000             | mov esi,dword ptr ds:[ebx+2F8]    | 用户名长度
00457C6C | 83C6 05                   | add esi,5                         | 用户名长度+0x5
00457C6F | FFB3 10030000             | push dword ptr ds:[ebx+310]       | [ebx+310]:"黑头Sun Bird"
00457C75 | 8D55 F8                   | lea edx,dword ptr ss:[ebp-8]      | [ebp-8]:"15"
00457C78 | 8BC6                      | mov eax,esi                       |
00457C7A | E8 85FEFAFF               | call ckme.407B04                  | 用户名长度加0x5之后转成10进制字符
00457C7F | FF75 F8                   | push dword ptr ss:[ebp-8]         | [ebp-8]:"15"
00457C82 | FFB3 14030000             | push dword ptr ds:[ebx+314]       | [ebx+314]:"dseloffc-012-OK"
00457C88 | 8D55 F4                   | lea edx,dword ptr ss:[ebp-C]      | [ebp-C]:"a123456789"
00457C8B | 8B83 D4020000             | mov eax,dword ptr ds:[ebx+2D4]    | [ebx+2D4]:&"鵀B"
00457C91 | E8 B2B6FCFF               | call ckme.423348                  |
00457C96 | FF75 F4                   | push dword ptr ss:[ebp-C]         | [ebp-C]:"a123456789"
00457C99 | 8D83 18030000             | lea eax,dword ptr ds:[ebx+318]    | [ebx+318]:"黑头Sun Bird15dseloffc-012-OKa123456789"
00457C9F | BA 04000000               | mov edx,4                         |
00457CA4 | E8 93BFFAFF               | call ckme.403C3C                  | 拼接字符串 黑头Sun Bird&用户名长度&dseloffc-012-OK&用户名



第二部分:跟之前分析的基本一样 只不过是把用户名的长度加0x3 得出来的十进制数值在和 用户名 和esi寄存器值进行拼接循环19次,之前的和这部分汇编代码好像没什么作用。
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
00457CC9 | 8D55 EC                   | lea edx,dword ptr ss:[ebp-14]     | [ebp-14]:"a123456789"
00457CCC | 8B83 D4020000             | mov eax,dword ptr ds:[ebx+2D4]    | [ebx+2D4]:&"鵀B"
00457CD2 | E8 71B6FCFF               | call ckme.423348                  |
00457CD7 | 8B45 EC                   | mov eax,dword ptr ss:[ebp-14]     | [ebp-14]:"a123456789"
00457CDA | E8 9DBEFAFF               | call ckme.403B7C                  |
00457CDF | 83C0 03                   | add eax,3                         |
00457CE2 | 8D55 F0                   | lea edx,dword ptr ss:[ebp-10]     | [ebp-10]:"13"
00457CE5 | E8 1AFEFAFF               | call ckme.407B04                  |
00457CEA | FF75 F0                   | push dword ptr ss:[ebp-10]        | [ebp-10]:"13"
00457CED | 8D55 E8                   | lea edx,dword ptr ss:[ebp-18]     | [ebp-18]:"a123456789"
00457CF0 | 8B83 D4020000             | mov eax,dword ptr ds:[ebx+2D4]    | [ebx+2D4]:&"鵀B"
00457CF6 | E8 4DB6FCFF               | call ckme.423348                  |
00457CFB | FF75 E8                   | push dword ptr ss:[ebp-18]        | [ebp-18]:"a123456789"
00457CFE | 8D55 E4                   | lea edx,dword ptr ss:[ebp-1C]     |
00457D01 | 8BC6                      | mov eax,esi                       |
00457D03 | E8 FCFDFAFF               | call ckme.407B04                  |
00457D08 | FF75 E4                   | push dword ptr ss:[ebp-1C]        |
00457D0B | 8D45 FC                   | lea eax,dword ptr ss:[ebp-4]      | [ebp-4]:"13a1234567890"
00457D0E | BA 03000000               | mov edx,3                         |
00457D13 | E8 24BFFAFF               | call ckme.403C3C                  |
00457D18 | 46                        | inc esi                           |
00457D19 | 83FE 13                   | cmp esi,13                        |
00457D1C | 75 AB                     | jne ckme.457CC9                   | 循环19次


第三部分: 这部分代码主要就是看输入的激活码和生成的一致不一致,如果一致就会把 注册成功的关键地址esi+30C赋值0x3E。


[Asm] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
00457D1E | 8D55 E0                   | lea edx,dword ptr ss:[ebp-20]     |
00457D21 | 8B83 D8020000             | mov eax,dword ptr ds:[ebx+2D8]    | [ebx+2D8]:&"鵀B"
00457D27 | E8 1CB6FCFF               | call ckme.423348                  |
00457D2C | 8B45 E0                   | mov eax,dword ptr ss:[ebp-20]     |
00457D2F | 8B93 18030000             | mov edx,dword ptr ds:[ebx+318]    | [ebx+318]:"黑头Sun Bird15dseloffc-012-OKa123456789"
00457D35 | E8 52BFFAFF               | call ckme.403C8C                  | 生成的激活码和输入的进行对比 然后决定下面的跳转是否赋值0x3E
00457D3A | 75 0A                     | jne ckme.457D46                   |
00457D3C | C783 0C030000 3E000000    | mov dword ptr ds:[ebx+30C],3E     | 如果跳转不成立给注册成功关键对比的内存地址赋值3E
00457D46 | 8B83 0C030000             | mov eax,dword ptr ds:[ebx+30C]    |


通过上面这些代码有存在一个问题 就是激活码都已经一致了不应该赋值0x85注册才能成功吗 为什么赋值0x3E呢 这样赋值即便激活码输入对了那注册不还是不成功吗?
确实是这样的,这个也就是作者留的一个小小的坑,之前有说过 如果直接爆破 在图片框单击一下就可以注册成功, 如果输入正确的激活码那要双击才能成功,那由此就可以推断出来
点击图片框只会进行一个 ebx+0x30C 是否等于0x85的判断 相等就注册成功否则就不成功 所以直接爆破 把这个判断nop掉就会直接成功,如果要输入活码要双击才能成功 那就是在双击的时候 会触发一个把ebx+0x30C的值改变成0x85的一个动作,
既然要改变成0x85 那肯定在双击的时候还会访问这个内存地址,我们接着下一个硬件访问断点 然后输入正确的激活码双击看一下。


双击后断在了这个位置 结果很明显了, 如果 这个 ebx+0x30C = 0x3E 那就赋值0x85。

71c282c890d3cd5d594dc5636bf2bb97.png

总结:注册码算法就是     “黑头Sun Bird”+用户名长度+ 0x5  +“dseloffc-012-OK”+用户名   ,只要在文本输入框按下字符 就会检测一次激活码 如果激活码正确就会直接给esi+0x30c地址赋值0x3E 双击图片框后会 判断esi+0x30c地址的值是否为0x3E 如果是 在赋值0x85 这个时候在点击图片框 会判断这个地址的值是否是0x85 如果是那就注册成功。




注册机编写:
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
using namespace std;
  
  
int main()
{
    //获取输入字符串
    string str;
    cout << "请输入账号:" << endl;
    cin >> str;
    int len = str.length();
    int num = len + 0x5 ;
  
    string key = "黑头Sun Bird"+ to_string(num)+"dseloffc-012-OK"+ str;
    cout<< "您的注册key:" << key << endl;
    return 0;
}


注册机.png

免费评分

参与人数 8吾爱币 +11 热心值 +7 收起 理由
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Carinx + 1 + 1 用心讨论,共获提升!
molucky + 1 + 1 希望多出分析教程,感谢。
stilt6642 + 1 + 1 用心讨论,共获提升!
ZbyEMM + 1 热心回复!
linqiu431 + 1 热心回复!
9ilk + 1 热心回复!
G4732246 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zhang0201 发表于 2024-11-24 00:38
感谢分享
chx1126 发表于 2024-11-24 01:22
abandoncs 发表于 2024-11-24 03:10
asmprofan 发表于 2024-11-24 05:30
一起开启学习之路。
dysunb 发表于 2024-11-24 08:14
一步一个脚印,脚踏实地,你会成功的
wxd007 发表于 2024-11-24 08:47
想学,但是动不起来,上班牛马感觉累
xtkj 发表于 2024-11-24 08:59
学习了。多看看这些不错。
Wilson305f 发表于 2024-11-24 09:32
加油,多出些新手教程
xuanhfu 发表于 2024-11-24 10:24
电脑软件的破解好少看到
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-1 10:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表