飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7914|回复: 5

[转贴] 例谈算法注册机制作技巧

[复制链接]

该用户从未签到

发表于 2006-11-26 15:05:42 | 显示全部楼层 |阅读模式
众所周知,制作算法注册机时,需要彻底搞清楚注册码产生的计算过程,并在此基础上进行编程实现注册码求取。至于编程,当然是根据个人爱好进行选择。图形界面的常用VB、VC、BC、Delphi等,DOS界面的用TC、QB。搞清算法是重点,编程方法是关键。有时算法搞清楚了(可能算法也很容易),却不一定容易实现希望的结果。请看下例:
说明:程序是VB6.0编写的。
0044A979 .>CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
在此之前,程序已经读入机器ID,并将其转化成十六进制数。如笔者的:
ID=505682168=0x1E2418F8
0044A97F >>MOV ECX,DWORD PTR SS:[EBP-E8] ; 取出ID号(hex)
0044A985 .>CALL DWORD PTR DS:[<&MSVBVM60.__vbaI4Abs>; MSVBVM60.__vbaI4Abs
0044A98B .>MOV ECX,EAX ; 转移ID
0044A98D .>SUB ECX,0BFE69 ; ID-0xBFE69
0044A993 .>JO LockFile.0044AF79 ; 小于转移到出错处理
0044A999 .>CALL DWORD PTR DS:[<&MSVBVM60.__vbaI4Abs>; MSVBVM60.__vbaI4Abs
0044A99F .>MOV ECX,EAX ; 转移差
0044A9A1 .>MOV EAX,D20D20D3 ; 赋值0xD20D20D3
0044A9A6 .>IMUL ECX ; 与差相乘
解析:这一部分比较简单,其计算模型为:
结果=(ID-0xBFE69)*0xD20D20D3
0044A9A8 . >ADD EDX,ECX ; 差+进位
0044A9AA . >SAR EDX,6 ; 结果 >> 6 bit
0044A9AD . >MOV ECX,EDX ; 复制副本
0044A9AF . >SHR ECX,1F ; 副本 >> 1F bit
0044A9B2 . >ADD EDX,ECX ; 原结果与副本结果相加
0044A9B4 . >PUSH EDX ; 保存结果
0044A9B5 . >CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrI4>] ; 结果转成十进制数字
0044A9BB . >MOV DWORD PTR SS:[EBP-6C],EAX ; 保存转换结果
解析:这里的运算也很简单,分成两步:
第一步,将前述的积的进位与差相加并右移6 bit位。
第二步,将所得的结果的副本右移31 bit位,并与原结果相加,其结果即为注册码的十六进制数。
仔细分析不难得知,0044A9AD……0044A9B2 这三句是无效操作。如假设执行完 0044A9A8 这一句后,EDX=0xFFFFFFFF,则执行完 0044A9AA 这一句后,EDX=0x03FFFFFF,最高位为0。故执行完 0044A9AF 这一句后,ECX=0x00000000。
进一步解析:SAR EDX,6 右移 6 bit位,即为除以 64 并取整。积的进位求法:积除以 4294967296 (0x1 00000000)并取整。好了,计算模型为:
Int(Int((ID-0xBFE69)*0xD20D20D3/0x100000000)+(ID-0xBFE69))/64)-->注册码
怎么样,挺简单的吧?上面的模型用VB编程如下:
Private Sub Command1_Click()
a# = Val(text1.Text)
a# = a# - &HBFE69
b# = a# * &HD20D20D3
b# = Int(b# / 4294967296#)
a# = a# + b#
text2.Text = Int(a# / 64)
End Sub
运行一下,你会发现没有得出正确的结果。再分析,一个问题出现在 0044A9A8 ,ADD EDX,ECX是不带进位相加的,而我们的结果中包含着进位。又修改程序如下:
Private Sub Command1_Click()
a# = Val(text1.Text)
a# = a# - &HBFE69
b# = a# * &HD20D20D3
b# = Int(b# / 4294967296#)
a# = a# + b#
a# = a# - Int(a# / 4294967296#) * 4294967296#
text2.Text = Int(a# / 64)
End Sub
再运行,还没有得出正确结果。再分析,理论上没有问题了啊!?那么是什么地方出毛病里呢?
重新跟踪软件,记录每一步有用的数据。得出如下结果:
1、取出 ECX = 0x1E2418F8
2、作差 ECX = 0x1E2418F8 - 0xBFE69 = 0x1E181A8F
3、求积 0x1E181A8F * 0xD20D20D3 , EAX = 0x7872C3DD, EDX = 0xFA99364F
4、进位与差求和 EDX = 0xFA99364F + 0x1E181A8F = 0x18B150DE(去掉进位)
5、移位 EDX = 0x62C543
使用XP自带的计算器(98的计算器不支持双字节十六进制计算)模拟计算一番很快发现,问题出现在第三步。软件计算的结果是:
0x1E181A8F * 0xD20D20D3 = 0xFA99364F7872C3DD
而计算器计算的是:
0x1E181A8F * 0xD20D20D3 = 0x18B150DE7872C3DD
可以看到,后8位相同,而前8位完全不同,但前8位正是我们需要的东西。是什么原因呢?好,我们来单步运行制作的注册机,看看数据计算情况。通过跟踪数据,我们发现,b# = a# * &HD20D20D3 计算的结果是负数。与XP的计算器计算时的处理意思完全不同,软件中也是将0xD20D20D3 看作是负数。故此应该知道,我们的算法模型错啦。正确的算法模型是:
Int(((ID - 786025) * 3524075731 / 4294967296)/64)-->注册码
或许有的朋友会问,你这模型有问题,你的差与进位的和哪里去了?而且数据仅仅是改了表示法而已?是的,这一改就行了。原因很简单,计算机在处理数据时,最大的正整数只能是 0x1FFFFFFF,0xD20D20D3被当作负数来处理。而 3524075731(=0xD20D20D3) 则是当作长整数来处理的,所以结果自然就不同了。这一点尤其是在逻辑运算中更应该注意。
由此可以看出,在制作算法注册机时,完全搞清计算方法非常重要。数据的表示方法(结构)也是一个十分关键的问题。有机地结合它们,再展现你的编程思想,就可以制作出满意注册机。如本例最终源代码为:
Private Sub Command1_Click()
a# = Val(Text1.Text)
a# = Int((a# - 786025) * 3524075731# / 4294967296#)
Text2.Text = Int(a# / 64)
End Sub
当然,实现的方法并非一种。以下代码也可实现:
Private Sub Command1_Click()
Strg$ = "0123456789ABCDEF"
a# = Val(Text1.Text)
If Len(Text1.Text) = 0 Then me1 = MsgBox("你的电脑没有ID号码?", vbokonlly, "哼哼,骗我啊!")
a# = a# - &HBFE69
c# = a#
a# = Int(a# * &HD20D20D3 / 4294967296#)
h$ = Hex(a#)
tmp# = 0
For i = 1 To Len(h$)
h1$ = Mid(h$, i, 1)
For j = 1 To 16
If h1$ = Mid(Strg$, j, 1) Then
tmp# = tmp# * 16 + j - 1
Else
End If
Next j
Next i
a# = tmp# + c#
a# = a# - Int(a# / 4294967296#) * 4294967296#
a# = Int(a# / 64)
Text2.Text = a#
End Sub


Private Sub Command2_Click()
me2 = MsgBox("制作的注册机是为研究技术,请不要任意传播", vbOKOnly, "laoxuetong提醒你")
End Sub
相比较而言,除了加了一些判断外,用于计算的代码也稍微复杂了些。
PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2018-6-6 15:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2006-12-4 18:12:07 | 显示全部楼层
    学习,望能一起学习交流。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-1-9 11:05
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2007-2-2 12:31:29 | 显示全部楼层
    好,学习一下方法
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-1-1 19:52
  • 签到天数: 114 天

    [LV.6]常住居民II

    发表于 2007-4-2 13:42:38 | 显示全部楼层
    学习一下,分析得很清楚.
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-19 16:24:11 | 显示全部楼层
    不错学习借鉴一下方法/:001
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2012-5-25 22:38:24 | 显示全部楼层
    进来学习一下了,膜拜大牛
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表