某软件注册算法分析[初级]
某软件算法分析:在我知道大概的注册码规则条件下,苦苦追了一天。(菜就一个字)
国产XX行业软件,由于一些特殊原因,不给出名字了(前些天开始学汇编,当时的目的就是为了XX这个软件)。分析一下算法,作为自己学习汇编的作业—顺便想想怎么逆推,似乎逆推并不容易啊。。。。
【前情提要】
把假码字符串转为数据,地址储存在edi。
【戏肉】
06**F0 55 push ebp
06**F1 8B6C24 10 mov ebp,dword ptr ss:;假码长度
06**F5 85ED test ebp,ebp
06**F7 7E 2F jle short Star.06DAFB28;长度为0跳走
06**F9 8A4C24 0C mov cl,byte ptr ss:;把地址的地位作为运算用到的数,应该是根据假码的长度来的
06**FD 56 push esi;保存假码长度
06**FE 8B7424 18 mov esi,dword ptr ss:;算出的机器码保存于此
06DAFB02 57 push edi;保存假码的地址
06DAFB03 8B7C24 10 mov edi,dword ptr ss:
06DAFB07 2BFE sub edi,esi;假码算出的机器码在此前1024字节存放
06DAFB09 8DA424 00000000 lea esp,dword ptr ss:
06DAFB10 8A0437 mov al,byte ptr ds:;读假码的前两个字符
06DAFB13 8AD0 mov dl,al;放入DL
06DAFB15 32D1 xor dl,cl;跟CLxor,【此为机器码的第一个字符】
06DAFB17 8AC8 mov cl,al;前两个字符放入CL
06DAFB19 C0E1 05 shl cl,5;前移5位
06DAFB1C D0E8 shr al,1;假码前两个字符后移1位
06DAFB1E 02C8 add cl,al和CL相加
06DAFB20 8816 mov byte ptr ds:,dl
06DAFB22 46 inc esi;the Next
06DAFB23 4D dec ebp,计数器减一
06DAFB24 ^ 75 EA jnz short Star.06DAFB10,计数器为0跳出循环
06DAFB26 5F pop edi
06DAFB27 5E pop esi
06DAFB28 5D pop ebp
06DAFB29 C3 retn
【后续】
假码算出的机器码与用硬盘分区表算出的真码比较,真则注册,假。。。
[ 本帖最后由 zaas 于 2009-8-22 21:10 编辑 ] 努力就有进步 加油 哈哈哈!大笑3声!用我自己算的注册码注册成功!!!这软件注册机一直没出来,我还以为有多难呢。。。
[ 本帖最后由 zaas 于 2009-8-22 23:12 编辑 ] 恭喜,不知道是啥软件?? 水平低,看不懂。 是那个软件 偶也试试/:018 关于软件名字的说明:
真不好意思。真不能说。
由于我跟这家软件公司有一定的关系,他们一直挺够意思的,他们公司的几个软件我一直在用。他们的软件机器码算法是根据硬盘来的,每次我重整硬盘啊什么的都问他们要注册码,随要随给。
前些天频繁分区硬盘,装新电脑,要注册码要的烦了,才兴起了自己分析算法的念头。
他们挺够意思的,我也不能太小人不是?
再次说声抱歉了啊,各位同学。。。 没学过啥编程语言,只有VB上鞋时候摸过。用VB写的注册机:
贴出来大家研究算法,就别再深究是什么软件啦!:loveliness:
Private Sub Calcmd_Click()
Dim Output As String'输出的注册码
Dim serial As String '序列号
Dim length As Integer '序列号长度=EBP
Dim i As Integer '循环数
Dim Output_Length As Integer
Dim CL As Integer '不同软件不同常量,CL
Dim CL_Tmp As String 'CL取整、去头的过程变量
Dim OutCheck As String
Dim Output_Once As String
Output = "" '初始化注册码--->AL
Dim DL As Integer '--->DL
Dim NumStr As Integer
Dim OutputNum As Integer '输出的AL的数字形态
Dim CL_check As String
CL = Val(&H32) '--->CL初始值
serial = serialfrm.Text
serial = LTrim(serial)
serial = RTrim(serial)'去掉空格
serial = UCase(serial)'大写
length = Len(serial)
If length = 0 Then
regfrm.Text = "你耍我的吧?"
goto finish
End If
For i = 1 To length
DL = Asc(Mid(serial, i, 1)) '取字符的ascII码,DL
OutputNum = DL Xor CL 'AL
OutCheck = Hex(OutputNum)
Output_Length = Len(OutCheck)
'输出AL的ASCII
'不但需要计算output多于两位,还要计算少于两位的情况
Select Case Output_Length
Case Is > 2
Output_Once =Right(OutCheck, 2)
Case 2
Output_Once = OutCheck
Case 1
Output_Once = "0" & OutCheck
Case 0
Output_Once = "00"
End Select
CL_check = Right(Hex(OutputNum * 32), 2)
CL_Tmp = Hex(Val("&H" & CL_check) + OutputNum \ 2) '左移+右移
CL = Val("&H" & Right(CL_Tmp, 2)) '取后两位字符串变成十进制数字
Output = Output & Output_Once
Next
regfrm.Text = Output
finish:
End Sub
[ 本帖最后由 zaas 于 2009-8-23 18:57 编辑 ] 努力就有进步 恭喜楼主 加油
页:
[1]
2