首页
社区
课程
招聘
reBase Serie #1算法分析
发表于: 2006-7-22 11:27 6255

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平台漏洞挖掘!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
2
有一个疑问
为什么注册名不能出现1, 3, A, C, E...字符呢??
是不是ROR那里出的问题
2006-7-22 11:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
汗,2006-07-22,11:27又出一篇精华
收了33篇,我的电子书又要重编了,
2006-7-23 07:57
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 逍遥风 发布
有一个疑问
为什么注册名不能出现1, 3, A, C, E...字符呢??
是不是ROR那里出的问题


呵呵~俺不懂。。。

学习了菜儿收集的《逍遥风算法精华文集》之后,咱可能会强一些。

谢谢菜儿的收集。
2006-7-23 08:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习,支持!!!
2006-7-30 11:01
0
雪    币: 151
活跃值: (66)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
文章不错~~
ACE,都超出的范围~
也奇怪..
跟偶数有关系吧..那个运算
2006-8-1 13:00
0
游客
登录 | 注册 方可回帖
返回
//