观察者1.6算法于注册机
By Nydoll[CCG]
这个东西其实很简单,但是也不是直接就可以找到算法 因为它的机器码计算以及注册码计算都是在打开
注册窗口时才开始的 在输入注册码后下断点都只能找到注册码而无法发现它的具体算法 所以我用的方法是先反
汇编解决,反汇编找到“您已是Observer (观察者)注册用户!” 向上翻就是它的注册算法了:
//上面省略一部分计算机器码的代码,因为这些代码可以不考虑在注册机里。
:004038F4 57
push edi //EDI中为经过计算的机器代码。
:004038F5 6831010000 push
00000131
:004038FA FF7508
push [ebp+08]
|
:004038FD E8F6370000 Call
004070F8
:00403902 8A5DF8
mov bl, byte ptr [ebp-08] //取机器码倒数第7位
:00403905 3A5DF9
cmp bl, byte ptr [ebp-07] //取机器码倒数第6位
:00403908 7C0F
jl 00403919 //对比两个数,用大数减去小数,差放到EDX中
:0040390A 0FBE5DF8
movsx ebx, byte ptr [ebp-08]
:0040390E 0FBE7DF9
movsx edi, byte ptr [ebp-07]
:00403912 29FB
sub ebx, edi
:00403914 885DEC
mov byte ptr [ebp-14], bl
:00403917 EB0D
jmp 00403926
:00403919 0FBE5DF9
movsx ebx, byte ptr [ebp-07]
:0040391D 0FBE7DF8
movsx edi, byte ptr [ebp-08]
:00403921 29FB
sub ebx, edi
:00403923 885DEC
mov byte ptr [ebp-14], bl
:00403926 8A5DF6
mov bl, byte ptr [ebp-0A] //取机器码倒数第9位
:00403929 3A5DFB
cmp bl, byte ptr [ebp-05] //取机器码倒数第4位
:0040392C 7C0F
jl 0040393D //对比两个数,用大数减去小数,差放到EDX中
:0040392E 0FBE5DF6
movsx ebx, byte ptr [ebp-0A]
:00403932 0FBE7DFB
movsx edi, byte ptr [ebp-05]
:00403936 29FB
sub ebx, edi
:00403938 885DED
mov byte ptr [ebp-13], bl
:0040393B EB0D
jmp 0040394A
:0040393D 0FBE5DFB
movsx ebx, byte ptr [ebp-05]
:00403941 0FBE7DF6
movsx edi, byte ptr [ebp-0A]
:00403945 29FB
sub ebx, edi
:00403947 885DED
mov byte ptr [ebp-13], bl
:0040394A 8A5DF7
mov bl, byte ptr [ebp-09] //取机器码倒数第8位
:0040394D 3A5DFA
cmp bl, byte ptr [ebp-06] //取机器码倒数第5位
:00403950 7C0F
jl 00403961 //对比两个数,用大数减去小数,差放到EDX中
:00403952 0FBE5DF7
movsx ebx, byte ptr [ebp-09]
:00403956 0FBE7DFA
movsx edi, byte ptr [ebp-06]
:0040395A 29FB
sub ebx, edi
:0040395C 885DEE
mov byte ptr [ebp-12], bl
:0040395F EB0D
jmp 0040396E
:00403961 0FBE5DFA
movsx ebx, byte ptr [ebp-06]
:00403965 0FBE7DF7
movsx edi, byte ptr [ebp-09]
:00403969 29FB
sub ebx, edi
:0040396B 885DEE
mov byte ptr [ebp-12], bl
:0040396E 8A5DF5
mov bl, byte ptr [ebp-0B] //取机器码倒数第10位
:00403971 3A5DFC
cmp bl, byte ptr [ebp-04] //取机器码倒数第3位
:00403974 7C0F
jl 00403985 //对比两个数,用大数减去小数,差放到EDX中
:00403976 0FBE5DF5
movsx ebx, byte ptr [ebp-0B]
:0040397A 0FBE7DFC
movsx edi, byte ptr [ebp-04]
:0040397E 29FB
sub ebx, edi
:00403980 885DEF
mov byte ptr [ebp-11], bl
:00403983 EB0D
jmp 00403992
:00403985 0FBE5DFC
movsx ebx, byte ptr [ebp-04]
:00403989 0FBE7DF5
movsx edi, byte ptr [ebp-0B]
:0040398D 29FB
sub ebx, edi
:0040398F 885DEF
mov byte ptr [ebp-11], bl
//上面一部分代码根据机器码产生了4个值,不知道过程我说明白没有,在此重新复述一遍:比如我的机器码是
//D0F0111E16,程序分别取他的第5位与第6位比较 第8位与第3位比较 第7位与第4位比较 第9位与第2位比较,
//然后用大数减去小数,值分别保存。所以通过我的机器码得到的4个数分别为:1,1,5,1。
//接下来是第二部分计算:
:00403992 0FBE7DEC
movsx edi, byte ptr [ebp-14] //取计算完的第一个数 即1放入EDI
:00403996 83EF01
sub edi, 00000001 //EDI=EDI-1
:00403999 81E7FF000000 and edi, 000000FF
//结果与255进行按位与运算
:0040399F 57
push edi //保存运算结果
//省略一部分代码。
:004039E1 0FBE7DED
movsx edi, byte ptr [ebp-13] //取上面计算的第二个值放入EDI
:004039E5 83EF02
sub edi, 00000002 //EDI=EDI-2
:004039E8 81E7FF000000 and edi, 000000FF
//结果与255进行按位与运算
:004039EE 57
push edi //保存运算结果
//省略一部分代码。
:00403A30 0FBE7DEE
movsx edi, byte ptr [ebp-12] //取上面计算的第三个值放入EDI
:00403A34 83EF03
sub edi, 00000003 //EDI=EDI-3
:00403A37 81E7FF000000 and edi, 000000FF
//结果与255进行按位与运算
:00403A3D 57
push edi //保存运算结果
//省略一部分代码。
:00403A7F 0FBE7DEF
movsx edi, byte ptr [ebp-11] //取上面计算的第四个值放入EDI
:00403A83 83EF04
sub edi, 00000004 //EDI=EDI-4
:00403A86 81E7FF000000 and edi, 000000FF
//结果与255进行按位与运算
:00403A8C 57
push edi //保存运算结果
//至此全部注册码计算结束,让我们再来回顾一下。第一部分计算我们已经得到了4个中间数据:1,1,5,1。
//在第二部分中程序作出了以下计算:(1-1)AND 255,(1-2)AND 255,(5-3)AND 255,
//(1-1)AND 255,同样得出4个结果,他们的16进制累计值就是真正的注册码,我的是00FF32FD ^_^
//ESAY!
* Possible StringData Ref from Data Obj ->"谢谢您试用 Observer (观察者)!" //验证成功时的信息。
|
:00403B04 68A5A94000 push
0040A9A5
:00403B09 6A00
push 00000000
:00403B0B 6880010000 push
00000180
:00403B10 FF75F0
push [ebp-10]
//下面是VB的注册机,写的又臭又长,请高手帮忙改改
Dim c_num As Integer
Dim a, b, c, e, d, f As Integer
c_num = Len(Trim(Text1.Text))
d = c_num - 5
a = Mid(Text1, d, 1)
d = c_num - 6
b = Mid(Text1, d, 1)
a = Asc(a)
b = Asc(b)
If a > b Then
a = a - b
Else
a = b - a
End If
a = (a - 1) And 255
a = Hex(a)
c_num = Len(a)
If c_num = 1 Then
a = a & "0"
End If
c_num = Len(Trim(Text1.Text))
d = c_num - 8
b = Mid(Text1.Text, d, 1)
d = c_num - 3
c = Mid(Text1, d, 1)
c = Asc(c)
b = Asc(b)
If c > b Then
b = c - b
Else
b = b - c
End If
b = (b - 2) And 255
b = Hex(b)
c_num = Len(b)
If c_num = 1 Then
b = b & "0"
End If
c_num = Len(Trim(Text1.Text))
d = c_num - 7
c = Mid(Text1.Text, d, 1)
d = c_num - 4
d = Mid(Text1, d, 1)
c = Asc(c)
d = Asc(d)
If c > d Then
c = c - d
Else
c = d - c
End If
c = (c - 3) And 255
c = Hex(c)
c_num = Len(c)
If c_num = 1 Then
c = c & "0"
End If
c_num = Len(Trim(Text1.Text))
d = c_num - 9
e = Mid(Text1.Text, d, 1)
f = c_num - 2
d = Mid(Text1, f, 1)
e = Asc(e)
d = Asc(d)
If e > d Then
d = e - d
Else
d = d - e
End If
d = (d - 4) And 255
d = Hex(d)
c_num = Len(d)
If c_num = 1 Then
d = d & "0"
End If
Text2.Text = a & b & c & d
//--------------END---------------------------
本人现在正在学习VC和DEPHI请各位大客务必写出一个这两种语言的注册机,小弟感激不尽!
娃娃(NYDoll)
CHiNA CrACKiNG GrOUp