首页
社区
课程
招聘
[原创]算法分析及注册机
发表于: 2009-7-21 16:15 4437

[原创]算法分析及注册机

2009-7-21 16:15
4437

【文章标题】: 算法分析及注册机--请赐个邀请码吧
【文章作者】: vbroot
【下载地址】: 已上传
【加壳方式】: 无
【使用工具】: OLLyICE
【操作平台】: WIN XP
【软件介绍】: 软件还是比较简单的
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  废话也不多说了。
  直接开始设定一个断点,那么如何来找呢!因为是新手所以找的CRAKEME也比较简单,一般比较简单的就是字符串查找方式,
  或者使用函数参考点。本例中我使用函数。
  
  用OLLyICE打开文件crcmel1.exe
  程序停在此
  00401000 >/$  6A 00         push    0                                ; /hTemplateFile = NULL
  
  然后运行程序或按F9运行
  可以看到主程序界面已打开,呵呵界面也是很简单的。
  返回OLLyICE界面,汇编区域中右键->查找->当前模块中的名称(标签)在此窗口中找到GetDlgItemTextA函数(提取字符)及
  GetDlgItemInt(提取数字)。这两个函数还是在学VC++的时候知道的。本例中都是用GetDlgItemTextA函数来提取用户名及注册码的。
  
  输入假定的用户名:rooot  注册码:123
  
  0040124C   .  6A 28         push    28                               ; /Count = 28 (40.)
  0040124E   .  68 06214000   push    00402106                         ; |Buffer = crcme1.00402106
  00401253   .  68 E9030000   push    3E9                              ; |ControlID = 3E9 (1001.)
  00401258   .  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
  0040125B   .  E8 10020000   call    <jmp.&USER32.GetDlgItemTextA>    ; \GetDlgItemTextA   ’取用户名
  第一个断点停在0040125B
  在这个内存00402106地址中就是用户名。
  一下步按运行程序(F9)。
  
  00401260   .  83F8 05       cmp     eax, 5                                                ’eax用户名长度与5比较
  00401263   . /0F82 BD000000 jb      00401326
  00401269   . |6A 28         push    28                               ; /Count = 28 (40.)
  0040126B   . |68 2E214000   push    0040212E                         ; |Buffer = crcme1.0040212E
  00401270   . |68 EA030000   push    3EA                              ; |ControlID = 3EA (1002.)
  00401275   . |FF75 08       push    dword ptr [ebp+8]                ; |hWnd
  00401278   . |E8 F3010000   call    <jmp.&USER32.GetDlgItemTextA>    ; \GetDlgItemTextA  ’取注册码
  第二个断点停在00401278
  在这个内存0040212E地址中就是注册码。
  
  0040127D   .  BF 06214000   mov     edi, 00402106                    ;  ASCII "rooot"   
  00401282   .  33DB          xor     ebx, ebx                            ’清零
  00401284   .  33C0          xor     eax, eax                           ‘ 清零
  
  00401286   >  8A1F          mov     bl, byte ptr [edi]                  'bl="r"=72    ebx=低位=0072
  00401288   .  80FB 20       cmp     bl, 20                            ‘判断密码是否为空
  0040128B   . /0F82 95000000 jb      00401326
  00401291   . |03C3          add     eax, ebx                            ebx="r"=72   ebx=高位=0000 & 低位=0072            
  00401293   . |47            inc     edi                                 edi+1=00402107="ooot"
  00401294   . |803F 00       cmp     byte ptr [edi], 0                   判断用户名是否读取完毕.
  00401297   .^|75 ED         jnz     short 00401286
  这是一段(00401286--00401297)循环即把每一个用户名累加.
  最后eax=233=72+6F+6F++6F+74   72是r的16进制  6F是o的16进制  74是t的16进制   
  
  
  00401299   . |C1C0 03       rol     eax, 3               233循环左移(rol)=1198=233*2^3
  0040129C   . |35 A5150500   xor     eax, 515A5           1198 xor 515A5=5043D
  004012A1   . |50            push    eax                  5043D储存起来(压入堆栈)
  
  
  004012A2   . |33C0          xor     eax, eax             清零
  004012A4   . |33DB          xor     ebx, ebx             清零
  004012A6   . |33FF          xor     edi, edi             清零
  004012A8   .  BE 2E214000   mov     esi, 0040212E                    ;  ASCII "123"    esi=123
  
  
  004012AD   >  B8 0A000000   mov     eax, 0A                             eax=0A
  004012B2   .  8A1E          mov     bl, byte ptr [esi]                  bl=1
  004012B4   .  85DB          test    ebx, ebx                           
  004012B6   . /74 15         je      short 004012CD
  004012B8   . |80FB 30       cmp     bl, 30                         是否大于O(0的16进制=30)
  004012BB   . |72 69         jb      short 00401326                 转移条件(低于)即bl<30则转移
  004012BD   . |80FB 39       cmp     bl, 39                         是否大于9(9的16进制=39)
  004012C0   . |7F 64         jg      short 00401326                 转移条件(大于)即bl>39则转移
  004012C2   . |83EB 30       sub     ebx, 30
  004012C5   . |0FAFF8        imul    edi, eax
  004012C8   . |03FB          add     edi, ebx
  004012CA   . |46            inc     esi
  004012CB   .^|EB E0         jmp     short 004012AD
  
  这段代码 004012AD--004012CB 其实就是在把密码123 转换成16进制123=7B(7B是123的16进制)
  
  
  004012CD   > \81F7 CA870000 xor     edi, 87CA                    edi=7B 计算后edi=87B1
  004012D3   .  8BDF          mov     ebx, edi                     ebx=87B1
  004012D5   .  58            pop     eax                          出堆栈 eax=5043D  这个就是之前通过用户名计算后的值
  004012D6   .  03C3          add     eax, ebx                     eax=5043D+87B1=58BEE
  004012D8   .  35 E7970700   xor     eax, 797E7                   eax= 58BEE  xor 797E7=21C09
  004012DD   .  85C0          test    eax, eax                     测试 根据结果设置ZF标志寄存器
  004012DF   . /75 45         jnz     short 00401326               爆破点   标志位ZF=0则转移 当然不能让它转了
  
  所以我们就要让ZF的标志为置为1就可以了,如何做呢!我们就从  xor  eax, 797E7 入手了。
  我们将eax=797E7   则 xor  eax, 797E7        这样标志位ZF=1
  
  
  哈哈,我们所有的条件都瞒足了,就可以写注册机了。
  
  
  后面跳转的代码我就不贴出来了,大家一看就知道了。
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
--------------------------------------------------------------------------------
【经验总结】
  通过上面的分析我们可以得到很多的信息包括它的算法。现在来总结分析下。
  我们来倒推回去得到一个公式
  
  以用户名为:rooot 为例
  
  设注册码为X
  
  5043D+(X xor 87CA)=797E7
  
  则X=(797E7-5043D) xor 87CA=21460   (797E7、87CA 2个数都是固定的,5043D怎么出来的应该知道吧看上面的)
  
  转换成10进制等于=136288
  
  注册码=136288
  
  注册机用VB写的,主要代码如下:
  
  Private Sub Command1_Click()
  
      If Len(Text1) < 5 Then
         MsgBox "用户名不能少于5位", vbInformation, "提示"
      Else
          Sum = 0
          a1 = CLng("&H" & "515A5")
          a2 = CLng("&H" & "797E7")
          a3 = CLng("&H" & "87CA")
              For i = 1 To Len(Text1)
                a = Mid(Text1, i, 1)
                Sum = Sum + Asc(a)
              Next i
              c = Hex(Sum * 8)
              c = CLng("&H" & c)
              c = (c Xor a1)
              c = (a2 - c)
              c = c Xor a3
          Text2 = c
      End If
      
  End Sub
  
  
  
  
  
  
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年07月21日 16:11:06


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 366
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
09年3月前注册的号 好像直接找版主要邀请码就可以了,详细可以浏览置顶公告
2009-7-21 16:47
0
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
3
恩 你是2008 注册的 邀请码已发 谢谢你的分享  学习了 好文章
2009-7-21 17:06
0
雪    币: 409
活跃值: (182)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
非常感谢,我会继续努力!
2009-7-21 21:27
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
很不错的教程,谢谢分享
2009-7-21 21:36
0
雪    币: 68
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个帖子收藏了,留着慢慢看,谢谢楼主分享
2009-7-21 22:01
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
继续学习 。。。。。。。 菜鸟的榜样
2009-7-21 22:30
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
新手学习一下
2009-7-21 23:03
0
雪    币: 60
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
榜样啊··支持·····
2009-7-22 15:30
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
值得学习 顶
2009-7-22 15:38
0
游客
登录 | 注册 方可回帖
返回
//