飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6321|回复: 15

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

[复制链接]
  • TA的每日心情
    无聊
    2024-1-15 22:57
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2009-8-22 21:02:53 | 显示全部楼层 |阅读模式
    某软件算法分析:
    在我知道大概的注册码规则条件下,苦苦追了一天。(菜就一个字)
    国产XX行业软件,由于一些特殊原因,不给出名字了(前些天开始学汇编,当时的目的就是为了XX这个软件)。分析一下算法,作为自己学习汇编的作业—顺便想想怎么逆推,似乎逆推并不容易啊。。。。
    【前情提要】
    把假码字符串转为数据,地址储存在edi。
    【戏肉】
    06**F0      55                push ebp
    06**F1      8B6C24 10         mov ebp,dword ptr ss:[esp+10];假码长度
    06**F5      85ED              test ebp,ebp
    06**F7      7E 2F             jle short Star.06DAFB28;长度为0跳走
    06**F9      8A4C24 0C         mov cl,byte ptr ss:[esp+C];把地址的地位作为运算用到的数,应该是根据假码的长度来的
    06**FD      56                push esi;保存假码长度
    06**FE      8B7424 18         mov esi,dword ptr ss:[esp+18];算出的机器码保存于此
    06DAFB02      57                push edi;保存假码的地址
    06DAFB03      8B7C24 10         mov edi,dword ptr ss:[esp+10]
    06DAFB07      2BFE              sub edi,esi;假码算出的机器码在此前1024字节存放
    06DAFB09      8DA424 00000000   lea esp,dword ptr ss:[esp]
    06DAFB10      8A0437            mov al,byte ptr ds:[edi+esi];读假码的前两个字符
    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:[esi],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 编辑 ]

    评分

    参与人数 1飘云币 +40 收起 理由
    Luckly + 40 多多加油 继续努力~

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-10-25 13:07
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2009-8-22 21:52:14 | 显示全部楼层
    努力就有进步 加油
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2024-1-15 22:57
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2009-8-22 23:08:22 | 显示全部楼层
    哈哈哈!大笑3声!用我自己算的注册码注册成功!!!这软件注册机一直没出来,我还以为有多难呢。。。

    [ 本帖最后由 zaas 于 2009-8-22 23:12 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-5-1 14:44
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2009-8-23 09:50:51 | 显示全部楼层
    恭喜,不知道是啥软件??
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-8-23 10:13:11 | 显示全部楼层
    水平低,看不懂。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-8-23 15:10:32 | 显示全部楼层
    是那个软件 偶也试试/:018
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2024-1-15 22:57
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2009-8-23 18:21:34 | 显示全部楼层
    关于软件名字的说明:

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

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

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

    再次说声抱歉了啊,各位同学。。。
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2024-1-15 22:57
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 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 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2025-1-14 01:25
  • 签到天数: 2279 天

    [LV.Master]伴坛终老

    发表于 2009-8-23 19:36:24 | 显示全部楼层
    努力就有进步
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-7-12 19:31
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2009-8-24 16:56:43 | 显示全部楼层
    恭喜楼主 加油
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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