zaas 发表于 2009-8-22 21:02:53

某软件注册算法分析[初级]

某软件算法分析:
在我知道大概的注册码规则条件下,苦苦追了一天。(菜就一个字)
国产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 编辑 ]

MOV 发表于 2009-8-22 21:52:14

努力就有进步 加油

zaas 发表于 2009-8-22 23:08:22

哈哈哈!大笑3声!用我自己算的注册码注册成功!!!这软件注册机一直没出来,我还以为有多难呢。。。

[ 本帖最后由 zaas 于 2009-8-22 23:12 编辑 ]

tianxj 发表于 2009-8-23 09:50:51

恭喜,不知道是啥软件??

kcr 发表于 2009-8-23 10:13:11

水平低,看不懂。

forever 发表于 2009-8-23 15:10:32

是那个软件 偶也试试/:018

zaas 发表于 2009-8-23 18:21:34

关于软件名字的说明:

真不好意思。真不能说。
由于我跟这家软件公司有一定的关系,他们一直挺够意思的,他们公司的几个软件我一直在用。他们的软件机器码算法是根据硬盘来的,每次我重整硬盘啊什么的都问他们要注册码,随要随给。

前些天频繁分区硬盘,装新电脑,要注册码要的烦了,才兴起了自己分析算法的念头。

他们挺够意思的,我也不能太小人不是?

再次说声抱歉了啊,各位同学。。。

zaas 发表于 2009-8-23 18:29:33

没学过啥编程语言,只有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 编辑 ]

冯玉姣 发表于 2009-8-23 19:36:24

努力就有进步

DETY 发表于 2009-8-24 16:56:43

恭喜楼主 加油
页: [1] 2
查看完整版本: 某软件注册算法分析[初级]