飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4409|回复: 7

[原创] 梁龙凭证打印 1.1.203 算法分析+ASM注册函数

[复制链接]
  • TA的每日心情
    难过
    2024-4-22 14:49
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2010-5-9 17:57:03 | 显示全部楼层 |阅读模式
    【破文标题】梁龙凭证打印 1.1.203 算法分析+ASM注册函数
    【破文作者】飘云/P.Y.G
    【官方主页】https://www.chinapyg.com
    【作者博客】http://blog.piaoyunsoft.com
    破解平台】WinXp SP3
    【破解工具】PEiD0.94、OD
    【作者邮箱】piaoyun04@163.com
    【软件名称】梁龙凭证打印 1.1.203
    【软件大小】2.66 MB
    【原版下载】http://www.llwsoft.cn/xzzx.htm
    【破解过程】


    看到软件仓库
    https://www.chinapyg.com/viewthr ... &extra=page%3D1
    lzq1973兄弟发布了 这个系列的破解,那么就没有秘密了~~ 拿来做教程了~~
    注意:上面提供的注册机是有少许问题的(原因在八进制转换上,不在本文范围,读者自行分析)

    OD载入程序:

    点击【软件注册】输入注册信息,找到关键处,发现只是对比注册码的过程了~~ 说明注册码在 窗体加载的时候 就已经生成了,那我们找到FormLoad事件开始分析:

    输入注册信息:123456789 断下,来到这里:

    006D70D0  push    ebp                              ;  FormLoad事件
    006D70D1  mov     ebp, esp
    006D70D3  sub     esp, 0C
    006D70D6  push    <jmp.&MSVBVM60.__vbaExceptHandle>;  SE 处理程序安装
    006D70DB  mov     eax, dword ptr fs:[0]
    006D70E1  push    eax
    006D70E2  mov     dword ptr fs:[0], esp
    006D70E9  sub     esp, 134
    006D70EF  push    ebx
    006D70F0  push    esi
    006D70F1  push    edi
    006D70F2  mov     dword ptr [ebp-C], esp
    006D70F5  mov     dword ptr [ebp-8], 00401790
    006D70FC  mov     esi, dword ptr [ebp+8]
    006D70FF  mov     eax, esi
    006D7101  and     eax, 1
    006D7104  mov     dword ptr [ebp-4], eax
    006D7107  and     esi, FFFFFFFE
    006D710A  push    esi
    006D710B  mov     dword ptr [ebp+8], esi
    006D710E  mov     ecx, dword ptr [esi]
    006D7110  call    dword ptr [ecx+4]
    006D7113  mov     eax, dword ptr [7A9CCC]
    006D7118  xor     edi, edi
    006D711A  cmp     eax, edi
    .
    .
    .无关代码--省略
    .
    .
    006D7CEB  mov     eax, dword ptr [ebp-74]          ;  机器码
    006D7CEE  lea     edx, dword ptr [ebp-A4]
    006D7CF4  lea     ecx, dword ptr [ebp-54]
    006D7CF7  mov     dword ptr [ebp-74], 0
    006D7CFE  mov     dword ptr [ebp-9C], eax
    006D7D04  mov     dword ptr [ebp-A4], 8
    006D7D0E  call    dword ptr [<&MSVBVM60.__vbaVarMo>;  MSVBVM60.__vbaVarMove
    006D7D14  lea     ecx, dword ptr [ebp-8C]
    006D7D1A  call    dword ptr [<&MSVBVM60.__vbaFreeO>;  MSVBVM60.__vbaFreeObj
    006D7D20  mov     ecx, dword ptr [esi]
    006D7D22  push    esi
    006D7D23  call    dword ptr [ecx+328]
    006D7D29  lea     edx, dword ptr [ebp-8C]
    006D7D2F  push    eax
    006D7D30  push    edx
    006D7D31  call    edi
    006D7D33  mov     dword ptr [ebp-9C], 4            ;  参数
    006D7D3D  mov     dword ptr [ebp-A4], 2
    006D7D47  mov     ebx, dword ptr [eax]
    006D7D49  mov     dword ptr [ebp-F4], eax
    006D7D4F  lea     eax, dword ptr [ebp-A4]
    006D7D55  lea     ecx, dword ptr [ebp-54]
    006D7D58  push    eax
    006D7D59  push    1                                ;  参数
    006D7D5B  lea     edx, dword ptr [ebp-74]
    006D7D5E  push    ecx                              ; /String8
    006D7D5F  push    edx                              ; |ARG2
    006D7D60  call    dword ptr [<&MSVBVM60.__vbaStrVa>; \__vbaStrVarVal
    006D7D66  push    eax
    006D7D67  call    dword ptr [<&MSVBVM60.#631>]     ;  截取前4位  设为 A
    006D7D6D  mov     edx, eax
    006D7D6F  lea     ecx, dword ptr [ebp-78]
    006D7D72  call    dword ptr [<&MSVBVM60.__vbaStrMo>;  MSVBVM60.__vbaStrMove
    006D7D78  mov     dword ptr [ebp-138], ebx
    006D7D7E  mov     ebx, dword ptr [ebp-F4]
    006D7D84  push    eax
    006D7D85  mov     eax, dword ptr [ebp-138]
    006D7D8B  push    ebx
    006D7D8C  call    dword ptr [eax+A4]
    006D7D92  test    eax, eax
    006D7D94  fclex
    006D7D96  jge     short 006D7DAA
    006D7D98  push    0A4
    006D7D9D  push    00662290
    006D7DA2  push    ebx
    006D7DA3  push    eax
    006D7DA4  call    dword ptr [<&MSVBVM60.__vbaHresu>;  MSVBVM60.__vbaHresultCheckObj
    006D7DAA  lea     ecx, dword ptr [ebp-78]
    006D7DAD  lea     edx, dword ptr [ebp-74]
    006D7DB0  push    ecx
    006D7DB1  push    edx
    006D7DB2  push    2
    006D7DB4  call    dword ptr [<&MSVBVM60.__vbaFreeS>;  MSVBVM60.__vbaFreeStrList
    006D7DBA  add     esp, 0C
    006D7DBD  lea     ecx, dword ptr [ebp-8C]
    006D7DC3  call    dword ptr [<&MSVBVM60.__vbaFreeO>;  MSVBVM60.__vbaFreeObj
    006D7DC9  lea     ecx, dword ptr [ebp-A4]
    006D7DCF  call    dword ptr [<&MSVBVM60.__vbaFreeV>;  MSVBVM60.__vbaFreeVar
    006D7DD5  mov     eax, dword ptr [esi]
    006D7DD7  push    esi
    006D7DD8  call    dword ptr [eax+318]
    006D7DDE  lea     ecx, dword ptr [ebp-8C]
    006D7DE4  push    eax
    006D7DE5  push    ecx
    006D7DE6  call    edi
    006D7DE8  mov     ebx, dword ptr [eax]
    006D7DEA  mov     dword ptr [ebp-F4], eax
    006D7DF0  lea     edx, dword ptr [ebp-54]
    006D7DF3  push    4                                ;  参数
    006D7DF5  lea     eax, dword ptr [ebp-74]
    006D7DF8  push    edx                              ; /String8
    006D7DF9  push    eax                              ; |ARG2
    006D7DFA  call    dword ptr [<&MSVBVM60.__vbaStrVa>; \__vbaStrVarVal
    006D7E00  push    eax
    006D7E01  call    dword ptr [<&MSVBVM60.#618>]     ;  截取右边4位 设为B
    006D7E07  mov     edx, eax
    006D7E09  lea     ecx, dword ptr [ebp-78]
    006D7E0C  call    dword ptr [<&MSVBVM60.__vbaStrMo>;  MSVBVM60.__vbaStrMove
    .
    .
    .无关代码--省略
    .
    .
    006D7EF3  mov     ebx, dword ptr [edx]
    006D7EF5  push    ecx                              ; /String
    006D7EF6  call    dword ptr [<&MSVBVM60.__vbaStrCa>; \连接 A、B
    006D7EFC  mov     edx, eax                         ;  连接后的字符串设为C
    006D7EFE  lea     ecx, dword ptr [ebp-7C]
    006D7F01  call    dword ptr [<&MSVBVM60.__vbaStrMo>;  MSVBVM60.__vbaStrMove
    006D7F07  mov     edx, ebx
    .
    .
    .无关代码--省略
    .
    .
    006D7FBF  push    ecx
    006D7FC0  mov     ebx, dword ptr [eax]
    006D7FC2  call    dword ptr [<&MSVBVM60.#581>]     ;  把字符串C转换成浮点数值 = D
    006D7FC8  fadd    qword ptr [401780]               ;  D + 10871006(常量) = E
    006D7FCE  sub     esp, 8
    006D7FD1  fstsw   ax
    006D7FD3  test    al, 0D
    006D7FD5  jnz     006D8398
    006D7FDB  fstp    qword ptr [esp]
    006D7FDE  call    dword ptr [<&MSVBVM60.__vbaStrR8>;  把E转换成字符串
    006D7FE4  mov     edx, eax
    006D7FE6  lea     ecx, dword ptr [ebp-78]
    006D7FE9  call    dword ptr [<&MSVBVM60.__vbaStrMo>;  MSVBVM60.__vbaStrMove
    006D7FEF  mov     edx, ebx
    .
    .
    .无关代码--省略
    .
    .
    006D8081  push    0A0
    006D8086  push    00662290
    006D808B  push    ebx
    006D808C  push    eax
    006D808D  call    dword ptr [<&MSVBVM60.__vbaHresu>;  MSVBVM60.__vbaHresultCheckObj
    006D8093  mov     ecx, dword ptr [ebp-74]          ;  字符串E
    006D8096  push    ecx
    006D8097  call    dword ptr [<&MSVBVM60.#581>]     ;  字符串E转换成浮点数值 = F
    006D809D  fstp    qword ptr [ebp-9C]
    006D80A3  lea     edx, dword ptr [ebp-A4]
    006D80A9  lea     eax, dword ptr [ebp-B4]
    006D80AF  push    edx
    006D80B0  push    eax
    006D80B1  mov     dword ptr [ebp-A4], 5
    006D80BB  call    dword ptr [<&MSVBVM60.#575>]     ;  将F转换成八进制 G
    006D80C1  mov     ecx, dword ptr [ebp-FC]
    006D80C7  lea     edx, dword ptr [ebp-B4]
    006D80CD  lea     eax, dword ptr [ebp-78]
    006D80D0  push    edx                              ; /String8
    006D80D1  mov     ebx, dword ptr [ecx]             ; |
    006D80D3  push    eax                              ; |ARG2
    006D80D4  call    dword ptr [<&MSVBVM60.__vbaStrVa>; \将G转换成字符串即为注册码 SN
    006D80DA  mov     ecx, ebx
    006D80DC  mov     ebx, dword ptr [ebp-FC]
    006D80E2  push    eax
    006D80E3  push    ebx
    006D80E4  call    dword ptr [ecx+A4]


    【算法总结】
    这里我省略了很多无关代码(VB的代码就是冗长,没必要都贴出来),方便读者参考~~

    所以这里很清楚了理清了算法流程:

    1.截取机器码左边4位注册码设为A
    2.截取机器码右边4位注册码设为B
    3.连接A、B设为C
    4.把C转换成浮点数值设为D
    5.D + 10871006(常量)并转换成字符设为E
    7.将E转换成浮点数值设为F
    8.将F转换成八进制设为G
    9.将G转换成字符串即为正确注册码SN

    【算法函数】
    ;说明下,由于wsprintf 函数不能处理 %o 八进制~~  所以导致这个代码有点长~ 不过那段进制转换函数还是值得收藏~
    ;参考自看雪论坛小虾版主的代码,感谢!

    dwCount                db        ?

    .code
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ;函数功能:将字符串转换成数值
    ;Code By PiaoYun/P.Y.G
    ;http://blog.piaoyunsoft.com
    ;说明:仅做转换用,没有判断传入字符串的合法性~~  如 "1111" --> 1111
    ;
    ;函数参数:
    ;  lpszStr:指针,传入字符串的地址
    ;返回值:16进制数值
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    _ProcStrToDword proc lpszStr:dword
            mov         esi,lpszStr
            xor  eax, eax
            xor  ebx, ebx
            
    @@:
            mov  bl, byte ptr [esi]
            test bl, bl
            je         @F
            sub  bl, 30h
            lea  eax, dword ptr [eax+eax*4]
            add  eax, eax
            add  eax, ebx
            inc  esi
            jmp         @B
    @@:
            ret
    _ProcStrToDword endp

    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ;函数功能:进制转换
    ;函数参数:
    ;    lpOutBuff:输出缓冲区
    ;    dwValue:为要转换的整数值
    ;    nType:转换类型,分别可以是2、8、10、16进制  都可以转换。
    ;此段代码参考自看雪论坛小虾版主,在此表示感谢!
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    dwtos proc uses ebx esi lpOutBuff:DWORD,dwValue:DWORD,nType:DWORD
        LOCAL        @szBuffer[512]:BYTE
        ;LOCAL         dwCount:DWORD
        xor eax,eax
        .if !(lpOutBuff)
        ret
        .endif
        xor esi,esi
        lea esi,@szBuffer
        mov ebx,lpOutBuff
        mov ecx,nType
        mov eax,dwValue
        .while eax > ecx || eax
            xor edx,edx
            div ecx
            .if dl > 9
              add dl,'A' - 10
            .else
              add dl,'0'
            .endif
            mov byte ptr [esi],dl
            inc esi
            inc dwCount
        .endw
        .while dwCount
           mov   cl,[esi-1]
           mov   [ebx],cl
           dec   esi
           dec   dwCount
           inc   ebx
        .endw
        ret
    dwtos endp

    ;=================================================
    ;注册算法:
    ;1.截取机器码左边4位注册码设为A
    ;2.截取机器码右边4位注册码设为B
    ;3.连接A、B设为C
    ;4.把C转换成浮点数值设为D
    ;5.D + 10871006(常量)并转换成字符设为E
    ;7.将E转换成浮点数值设为F
    ;8.将F转换成八进制设为G
    ;9.将G转换成字符串即为正确注册码SN
    ;=================================================
    KeyGen    proc    uses ecx edx lpID:DWORD
        LOCAL    @szTemp[9]:BYTE
        LOCAL    @dwTemp:DWORD
        LOCAL   @szOctBuffer[256]:BYTE
       
        invoke    RtlZeroMemory,addr @szTemp,sizeof @szTemp   
        invoke    RtlZeroMemory,addr @szOctBuffer,sizeof @szOctBuffer   
       
        xor    ecx,ecx
        xor    edx,edx
        xor    esi,esi
       
       
        ;截取左边4位
        mov eax,lpID
        mov    ecx,4
        xor    esi,esi
        @@:
            movzx    ebx,byte ptr[eax+esi]
            mov        byte ptr[@szTemp+esi],bl
            inc        esi
            loop    @B
       
        invoke lstrlen,lpID
        ;移动到倒数第四位
        sub    eax,4
        mov    esi,eax
       
        ;截取右边四位
        mov eax,lpID
        mov    ecx,4
        mov edx,4
        @@:
            movzx    ebx,byte ptr[eax+esi]
            mov        byte ptr[@szTemp+edx],bl
            inc        esi
            inc        edx
            loop    @B
         
        ;上面@szTemp里面已经是连接好的字符串了
       
        ;字符串转换成数值
        invoke    _ProcStrToDword,addr @szTemp
           ;加10871006
          
        add        eax,10871006
       
        ;转换成八进制
        invoke   dwtos,addr @szOctBuffer,eax,8
       
        ;输出最终注册码
        lea        eax,@szOctBuffer

        ret

    KeyGen endp

    【版权声明】 本文纯属技术交流, 原创于PYG官方论坛, 转载请注明作者并保持文章的完整, 谢谢!
    未标题-1.gif

    KeyGen.rar

    2.3 KB, 下载次数: 34, 下载积分: 飘云币 -2 枚

    评分

    参与人数 1威望 +40 飘云币 +40 收起 理由
    月之精灵 + 40 + 40 您的贴子很精彩,希望能再次分享!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2021-10-11 20:54
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2010-5-9 19:01:45 | 显示全部楼层
    /:011 初学者闪过,看不懂,呵
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-11-26 13:46
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2010-5-9 20:37:28 | 显示全部楼层
    好久不见坛主出作品了,破文代码着色也好看,膜拜大牛!/:good
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-7-26 11:22
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2010-5-11 08:01:58 | 显示全部楼层
    看不懂的飘过。。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2020-9-18 09:21
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2011-4-20 15:25:02 | 显示全部楼层
    楼主的算法很不错!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2014-7-29 10:07:40 | 显示全部楼层
    梁龙系列 算法注册机
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2020-11-19 11:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-7-31 13:01:17 | 显示全部楼层
    唉,汇编真是浪费财力物力啊!
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-6-1 20:17
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2016-7-6 20:30:00 | 显示全部楼层
    谢谢分享,路过必顶。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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