[原创]算法分析及注册机
发表于:
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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
上传的附件: