自动精灵 v2.0简单算法分析
【文章标题】: 自动精灵 v2.0简单算法分析【文章作者】: jjdg
【软件名称】: 自动精灵 v2.0
【软件大小】: 706KB
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
今天逛论坛的时候,看见gujin162兄的自动精灵 v2.0注册机的帖子(https://www.chinapyg.com/viewthread.php?tid=20558&highlight=%D7%D4%B6%AF%BE%AB%C1%E9),就顺着连接打开一看,好家伙!要价2400!
心想,就冲这要价,也不能不看看吧?于是就下载了一个,看看它的算法如何!
因为gujin162兄已经发布了详细的追码分析,我就不罗嗦了,这里直接看算法去!^_^
004EB6E1|.E8 3E030000 CALL AutoStar.004EBA24 ;这是算法CALL F7进去
来到004EBA24,
004EBA24/$55 PUSH EBP ;注册码算法CALL
004EBA25|.8BEC MOV EBP,ESP
004EBA27|.6A 00 PUSH 0
004EBA29|.6A 00 PUSH 0
004EBA2B|.6A 00 PUSH 0
004EBA2D|.6A 00 PUSH 0
004EBA2F|.6A 00 PUSH 0
004EBA31|.53 PUSH EBX
004EBA32|.56 PUSH ESI
004EBA33|.57 PUSH EDI
004EBA34|.8BF9 MOV EDI,ECX
004EBA36|.33C0 XOR EAX,EAX
004EBA38|.55 PUSH EBP
004EBA39|.68 FABA4E00 PUSH AutoStar.004EBAFA
004EBA3E|.64:FF30 PUSH DWORD PTR FS:
004EBA41|.64:8920 MOV DWORD PTR FS:,ESP
004EBA44|.8BC2 MOV EAX,EDX ;EDX里面是序列号389463739
004EBA46|.E8 C9D2F1FF CALL AutoStar.00408D14 ;将序列号转换为16进制,送入EAX
004EBA4B|.8BD8 MOV EBX,EAX ;将EAX中的16进制序列号送入EBX
004EBA4D|.8BC3 MOV EAX,EBX ;下面开始是特征值的计算
004EBA4F|.B9 85000000 MOV ECX,85 ;读入固定字85
004EBA54|.99 CDQ ;除法运算前,EDX清零
004EBA55|.F7F9 IDIV ECX ;eax除以ecx实现两个带符号数的二进制除法运算
004EBA57|.69C0 AB000000 IMUL EAX,EAX,0AB ;eax乘以固定数ab
004EBA5D|.35 FDC85C02 XOR EAX,25CC8FD ;EAX与固定值25CC8FD做异或
004EBA62|.99 CDQ ;EDX清零
004EBA63|.33C2 XOR EAX,EDX ;EAX与EDX异或
004EBA65|.2BC2 SUB EAX,EDX ;用EAX-EDX
004EBA67|.05 68C4AC07 ADD EAX,7ACC468 ;EAX加固定值7ACC468,加法后为特征值的16进制"273127DB"
004EBA6C|.8BD8 MOV EBX,EAX ;将特征值"273127DB"送入EBX
004EBA6E|.8D55 F8 LEA EDX,DWORD PTR SS:
004EBA71|.8BC3 MOV EAX,EBX
004EBA73|.E8 60D1F1FF CALL AutoStar.00408BD8
004EBA78|.8D45 F4 LEA EAX,DWORD PTR SS:
004EBA7B|.BA 10BB4E00 MOV EDX,AutoStar.004EBB10 ;ASCII "734618529841"
004EBA80|.E8 CF87F1FF CALL AutoStar.00404254
004EBA85|.8D45 FC LEA EAX,DWORD PTR SS:
004EBA88|.E8 2F87F1FF CALL AutoStar.004041BC
004EBA8D|.8B45 F4 MOV EAX,DWORD PTR SS: ;将固定值堆栈"734618529841"送入EAX
004EBA90|.E8 E789F1FF CALL AutoStar.0040447C ;取"734618529841"的位数存入EAX,这也产生的注册码的位数
004EBA95|.8BD8 MOV EBX,EAX ;将位数送入EBX,让EBX做计数器
004EBA97|.85DB TEST EBX,EBX
004EBA99|.7E 3A JLE SHORT AutoStar.004EBAD5
004EBA9B|.BE 01000000 MOV ESI,1 ;计数器
004EBAA0|>8D45 EC /LEA EAX,DWORD PTR SS:
004EBAA3|.8B55 F4 |MOV EDX,DWORD PTR SS: ;读入"734618529841",这是用来定位的
004EBAA6|.8A5432 FF |MOV DL,BYTE PTR DS: ;逐位读入"734618529841"进行定位
004EBAAA|.E8 F588F1FF |CALL AutoStar.004043A4
004EBAAF|.8B45 EC |MOV EAX,DWORD PTR SS:
004EBAB2|.E8 5DD2F1FF |CALL AutoStar.00408D14 ;把特征值转换为10进制"657532891"
004EBAB7|.8B55 F8 |MOV EDX,DWORD PTR SS: ;把特征值"657532891"读入EDX
004EBABA|.8A5402 FF |MOV DL,BYTE PTR DS: ;根据上面读入的定位字符的值在特征值的相应位取字符
004EBABE|.8D45 F0 |LEA EAX,DWORD PTR SS:
004EBAC1|.E8 DE88F1FF |CALL AutoStar.004043A4
004EBAC6|.8B55 F0 |MOV EDX,DWORD PTR SS:
004EBAC9|.8D45 FC |LEA EAX,DWORD PTR SS:
004EBACC|.E8 B389F1FF |CALL AutoStar.00404484
004EBAD1|.46 |INC ESI ;计数器加1
004EBAD2|.4B |DEC EBX ;计数器减1
004EBAD3|.^ 75 CB \JNZ SHORT AutoStar.004EBAA0 ;继续循环,直到取完所有字符
004EBAD5|>8BC7 MOV EAX,EDI
004EBAD7|.8B55 FC MOV EDX,DWORD PTR SS: ;将产生的注册码送入EDX
004EBADA|.E8 3187F1FF CALL AutoStar.00404210
004EBADF|.33C0 XOR EAX,EAX
004EBAE1|.5A POP EDX
004EBAE2|.59 POP ECX
004EBAE3|.59 POP ECX
004EBAE4|.64:8910 MOV DWORD PTR FS:,EDX
004EBAE7|.68 01BB4E00 PUSH AutoStar.004EBB01
004EBAEC|>8D45 EC LEA EAX,DWORD PTR SS:
004EBAEF|.BA 05000000 MOV EDX,5
004EBAF4|.E8 E786F1FF CALL AutoStar.004041E0 ;将产生的注册码再次送入EDX
004EBAF9\.C3 RETN
004EBAFA .^ E9 A580F1FF JMP AutoStar.00403BA4
004EBAFF .^ EB EB JMP SHORT AutoStar.004EBAEC
004EBB01 .5F POP EDI
004EBB02 .5E POP ESI
004EBB03 .5B POP EBX
004EBB04 .8BE5 MOV ESP,EBP
004EBB06 .5D POP EBP
004EBB07 .C3 RETN ;返回调用
位数 123456789
特征值: 657532891
固定值: 734618529841即取码顺序
按第7、3、4、6、1、8、5、2、9、8、4、1位从特征值中取得注册码!
注册码: 875269351956
总结一下:
程序根据机器产生一个序列号,然后对其进行计算得到一个特征值,也可以称其为一个密码本,然后按照固定值734618529841提供的顺序逐位从密码本中取出字符生成注册码,
这个过程大家用XP自带的计算器就可以完成!^_^
在VB中,拖2个文本框和1个按钮,使用如下代码即可!
Private Sub Command1_Click()
If Len(Text1.Text) <> 9 Then
MsgBox "你输入的序列号不正确!请重新输入!", vbOKOnly, "出错啦!^_^"
Text1.Text = ""
Text2.Text = ""
Else
xlh = Val(Text1.Text)
xlh = xlh \ &H85
xlh = xlh * &HAB
xlh = xlh Xor &H25CC8FD
xlh = xlh Xor &H0
xlh = xlh + &H7ACC468
a = Trim(Str(xlh))
gdz = "734618529841"
For i = 1 To 12
b = Mid(gdz, i, 1)
zcm = zcm & Mid(a, b, 1)
Next
Text2.Text = zcm
End If
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii >= 48 And KeyAscii <= 57 Then
Else
KeyAscii = 0
MsgBox "你输入的序列号不正确!请重新输入!", vbOKOnly, "出错啦!^_^"
End If
End Sub
OK!
搞定!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于PYG论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年10月19日 15:52:49
[ 本帖最后由 jjdg 于 2007-10-20 04:05 编辑 ] 膜拜学习+沙发 人家那是V币 老兄吓我一跳 不错 兄弟最近精品多多~~
如果是2400RMB的话 得把代码全部VM掉 然后再整几个猛壳 让密界叹息 让用户放弃 /:017 我以为是RMB2400/:L ,学习了
页:
[1]