reBase Serie #1算法分析
发表于:
2006-7-22 11:27
6255
【破文标题】reBase Serie #1算法分析
【破文作者】逍遥风
【破解工具】OD 计算器
【破解平台】WINXP
【软件名称】redox's reBase Serie #
【软件大小】14K
【原版下载】http://www.crackmes.de/users/redox/rebase_serie_1/
【保护方式】
【软件简介】This is my first crackme (kgme).
It's not hard, neither easy.
Just Keygen it (no patching allowed, unless you can't do it the right way! ^_') and don't forget to write a tutorial of the whole approach. [ thanx a lot ]
This is a good practice for the advanced beginners.
Difficulty: 3 - Getting harder
Platform: Windows
Language: Assembler
----------------------------------------------------------------------
作者给的难度是3,分析后发现并没有那么难。不过还是比较典型的,很适合向我一样的菜鸟门学习的
断点很好下,不多说了
任意输入注册信息:
注册名:LOVETC
注册码:1234567890
确定后程序中断了
0040120D |. 68 FF000000 push 0FF ; /Count = FF (255.)
00401212 |. 68 98364000 push 00403698 ; |Buffer = base.00403698
00401217 |. 6A 1E push 1E ; |ControlID = 1E (30.)
00401219 |. FF75 08 push dword ptr [ebp+8] ; |hWnd
0040121C |. E8 8B030000 call <jmp.&user32.GetDlgItemTe>; \GetDlgItemTextA
00401221 |. 66:A3 A137400>mov [4037A1], ax ; 取注册名的位数。
00401227 |. 68 FF000000 push 0FF ; /Count = FF (255.)
0040122C |. 68 97374000 push 00403797 ; |Buffer = base.00403797
00401231 |. 6A 32 push 32 ; |ControlID = 32 (50.)
00401233 |. FF75 08 push dword ptr [ebp+8] ; |hWnd
00401236 |. E8 71030000 call <jmp.&user32.GetDlgItemTe>; \GetDlgItemTextA――-――|
0040123B |. E8 D7010000 call 00401417 ; 关键CALL,跟进 |
|
跟进关键CALL 取注册码的位数
----------------------------------------------------------------------
00401417 /$ 66:833D A9374>cmp word ptr [4037A9], 0 ; 到这个地址看一下,看看程序在比较什么
0040141F |. 75 72 jnz short 00401493 ; 如果不等于0就跳向失败
在命令行输入命令:d 4037a9 结果(如图1)
这里放着的正是输入的注册码,重新来一次。这次输入的注册码1234567890123,中断后在单步运行到这里。
看看又什么变化。输入命令:d 4037a9 结果(如图2)
不错这个地址就是放输入的注册码的地方。
注意上面的代码如果4037a9处的值不等于0就会跳向失败。也就是说地址4037a9处不能有任何内容。
现在明白了,注册码的长度是有限制的。按这个要求,如果注册码大于等于19位,例如:1234567890123456789
那么:地址4037a9处的内容就不为0了(如图3)。
所以注册码长度不能超过19位。
00401421 |. 66:833D A7374>cmp word ptr [4037A7], 0 ; 再到这个地址去看一下,程序又在比较什么呢?
00401429 |. 74 68 je short 00401493 ; 如果这里等于0就跳向失败
再到这个地址去看一下:输入命令:d 4037a7。(如图4)
还是输入的注册码。不过程序现在要求
地址4037a7处的内容不能为0,而如图所示现在4037a7处是没有内容的。按照这个要求注册码必须大于16位才能满足(如图5)
所以注册码长度不能小于17位
0040142B |. 803D 1C304000>cmp byte ptr [40301C], 0
00401432 |. 75 5F jnz short 00401493
00401434 |. 66:833D A1374>cmp word ptr [4037A1], 5
0040143C |. 7C 55 jl short 00401493
这两处比较不重要,就不管他了。
开始分析下面的代码。
0040143E |. 33C9 xor ecx, ecx ; ECX清零
00401440 |. 33D2 xor edx, edx ; EDX清零
00401442 |. 33DB xor ebx, ebx ; EBX清零
00401444 |. B8 98364000 mov eax, 00403698 ; 使EAC等于注册名
00401449 |. B9 97374000 mov ecx, 00403797 ; 使ECX等于输入的注册码
0040144E |> 8A11 /mov dl, [ecx] ; 取注册码每一位的ASCII码放进DL中
00401450 |. 80FA 00 |cmp dl, 0 ; 等于0吗?
00401453 |. 74 0F |je short 00401464
00401455 |. 8A18 |mov bl, [eax] ; 取注册名每一位的ASCII码放进BL中
00401457 |. D1CB |ror ebx, 1 ; 右移
00401459 |. 83F2 12 |xor edx, 12 ; 注册码每一位的ASCII码与0x12做XOR运算
0040145C |. 3BDA |cmp ebx, edx ; 注册名注册码分别处理后的结果相比较
0040145E |. 75 33 |jnz short 00401493 ; 不相等就跳向失败
00401460 |. 40 |inc eax ; EAX+1
00401461 |. 41 |inc ecx ; ECX+1
00401462 |.^ EB EA \jmp short 0040144E ; 循环比较
00401464 |> 8A18 mov bl, [eax] ; 使BL等于EAX中的值(标志位赋值)
00401466 |. 80FB 00 cmp bl, 0 ; BL等于0吗?
00401469 |. 75 28 jnz short 00401493 ; 不等于0就跳向失败
关键的算法就几句,而且很简单。
意思是
取注册名每一位的ASCII码:ROR 注册名,1 得到一个值A
取注册码每一位的ASCII码:XOR (注册码,0x12) 得到一个值B
比较A和B,相等就继续比较下一位。不相等就跳向失败。
注意:A与B之间要符合取值范围
现在可以根据对注册名的处理结果来推出注册码。
程序到这里出了些问题,就是注册名中不能有A ,C,E 。。。等字母。而字母B,D则可以
例如:
注册名:BB
B对应的ASCII码是:42
ROR 42,1等于21
设XOR(X,12)=21,则X=33
33对应的即为数字3
依次类推:可以得到一组注册信息
注册名:BBBBBBBBBBBBBBBBB,DDDDDDDDDDDDDDDDD
注册码:33333333333333333,00000000000000000
也可以是 BDBDBDBDBDBDBDBDB
30303030303030303 ----------------------------------------------------------------------
十分简单的分析过程,希望对广大的菜鸟有帮助。高手飞过 ----------------------------------------------------------------------
【版权声明】本文只为交流,转载清保留作者及文章完整性
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!
上传的附件: