飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7056|回复: 13

[原创] 【七夕礼物】Power Video Converter算法分析+另类注册机

[复制链接]
  • TA的每日心情
    难过
    2022-2-6 09:25
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2008-8-7 20:27:52 | 显示全部楼层 |阅读模式
    【破文标题】Power Video Converter算法分析+另类注册机
    【破文作者】p layboysen
    【作者主页】p layboysen2.photo.163.com
    破解工具】PEiD,OD
    【破解平台】Windows XP
    【软件名称】Power Video Converter
    【软件大小】1.01 MB
    【软件类别】国外软件/视频转换
    【软件授权】共享版
    【软件语言】英文
    【更新时间】2008-8-7
    【原版下载】http://www.apussoft.com/
    【保护方式】用户名、注册码
    【软件简介】Power Video Converter可以在AVi, MPEG1, MPEG2, VCD, SVCD, DVD, WMV, ASF, DAT, VOB文件格式之间进行转换,同时具有很快的转换速度和友好的使用界面。
    【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
    初学破解与编程,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
    --------------------------------------------------------------
    【破解内容】
       
       大三暑期的实习,嘴里能闲出鸟来。
       趁没毕业不抓紧时间学点自己喜欢的东西,怕这后半生真像张雨生说的那样“在太阳下低头,流着汗水默默辛苦的工作”,所以啊,找资料学Delphi、找目标练习算法分析,这是近期我的第三篇算法总结了吧,也许大家不记得了,但我自己记得——每次盯着几百行汇编代码反复来看一旦没头绪连睡觉都辗转反侧的无奈和辛苦。
       没的说,就是这样,就算受了冷落,我也不会放弃自己想要的生活。加油!
       
       试运行软件发现在其左侧有“Registration”按钮,注册错误有提示,PEID查壳得知软件无壳,OD载入查找字符很轻松找到关键处,不紧不慢咱们仔细分析:
    1. 00421BBA   .  8B46 64       mov     eax, dword ptr [esi+64]                  ;  假码"963852741"
    2. 00421BBD   .  8B4E 60       mov     ecx, dword ptr [esi+60]                  ;  用户名"senhuan"
    3. 00421BC0   .  8D5E 64       lea     ebx, dword ptr [esi+64]
    4. 00421BC3   .  8D7E 60       lea     edi, dword ptr [esi+60]
    5. 00421BC6   .  50            push    eax
    6. 00421BC7   .  51            push    ecx
    7. 00421BC8   .  E8 73FEFFFF   call    00421A40                                 ;  用户名和假码同时入栈,关键call
    8. 00421BCD   .  83C4 08       add     esp, 8
    9. 00421BD0   .  85C0          test    eax, eax
    10. 00421BD2   .  75 15         jnz     short 00421BE9
    11. 00421BD4   .  6A 40         push    40
    12. 00421BD6   .  68 14894300   push    00438914                                 ;  sorry
    13. 00421BDB   .  68 E8884300   push    004388E8                                 ;  invalid username or registration code
    14. 00421BE0   .  8BCE          mov     ecx, esi
    15. 00421BE2   .  E8 5F5C0000   call    <jmp.&MFC42.#4224_CWnd::MessageBoxA>
    复制代码
    跟进00421BC8处的call:
    1. 00421A40  /$  8B5424 04     mov     edx, dword ptr [esp+4]                   ;  用户名“senhuan”
    2. 00421A44  |.  56            push    esi
    3. 00421A45  |.  57            push    edi
    4. 00421A46  |.  BF F08B4300   mov     edi, 00438BF0
    5. 00421A4B  |.  8BF2          mov     esi, edx
    6. 00421A4D  |.  B9 01000000   mov     ecx, 1
    7. 00421A52  |.  33C0          xor     eax, eax
    8. 00421A54  |.  F3:A6         repe    cmps byte ptr es:[edi], byte ptr [esi]   ;  比较用户名是不是输入
    9. 00421A56  |.  74 2B         je      short 00421A83
    10. 00421A58  |.  8B4424 10     mov     eax, dword ptr [esp+10]                  ;  假码“963852741”
    11. 00421A5C  |.  53            push    ebx
    12. 00421A5D  |.  BF F08B4300   mov     edi, 00438BF0
    13. 00421A62  |.  8BF0          mov     esi, eax
    14. 00421A64  |.  B9 01000000   mov     ecx, 1
    15. 00421A69  |.  33DB          xor     ebx, ebx
    16. 00421A6B  |.  F3:A6         repe    cmps byte ptr es:[edi], byte ptr [esi]   ;  比较假码是否输入
    17. 00421A6D  |.  5B            pop     ebx
    18. 00421A6E  |.  74 13         je      short 00421A83
    19. 00421A70  |.  50            push    eax
    20. 00421A71  |.  52            push    edx
    21. 00421A72  |.  E8 99FDFFFF   call    00421810                                 ;  用户名和假码同时入栈,又是关键call,跟进
    22. 00421A77  |.  83C4 08       add     esp, 8
    23. 00421A7A  |.  F7D8          neg     eax
    24. 00421A7C  |.  1BC0          sbb     eax, eax
    25. 00421A7E  |.  5F            pop     edi
    26. 00421A7F  |.  F7D8          neg     eax
    27. 00421A81  |.  5E            pop     esi
    28. 00421A82  |.  C3            retn
    29. 00421A83  |>  5F            pop     edi
    30. 00421A84  |.  33C0          xor     eax, eax
    31. 00421A86  |.  5E            pop     esi
    32. 00421A87  \.  C3            retn
    复制代码
    跟进00421A72的call(省略部分代码):
    1. ……
    2. 0042185F  |.  8B4C24 38     mov     ecx, dword ptr [esp+38]                  ;  假码放入ECX
    3. 00421863  |.  8BD8          mov     ebx, eax                                 ;  用户名放入EBX,下面关键处会用到
    4. 00421865  |.  51            push    ecx
    5. 00421866  |.  8D4C24 14     lea     ecx, dword ptr [esp+14]
    6. 0042186A  |.  E8 FD5D0000   call    <jmp.&MFC42.#537_CString::CString>
    7. 0042186F  |.  8D4C24 10     lea     ecx, dword ptr [esp+10]
    8. 00421873  |.  C64424 2C 01  mov     byte ptr [esp+2C], 1
    9. 00421878  |.  E8 DF610000   call    <jmp.&MFC42.#6282_CString::TrimLeft>
    10. 0042187D  |.  8D4C24 10     lea     ecx, dword ptr [esp+10]
    11. 00421881  |.  E8 D0610000   call    <jmp.&MFC42.#6283_CString::TrimRight>
    12. 00421886  |.  6A 20         push    20
    13. 00421888  |.  8D4C24 14     lea     ecx, dword ptr [esp+14]
    14. 0042188C  |.  E8 9F600000   call    <jmp.&MFC42.#2915_CString::GetBuffer>
    15. 00421891  |.  8BD0          mov     edx, eax                                 ;  假码放入EDX
    16. 00421893  |.  83CE FF       or      esi, FFFFFFFF
    17. 00421896  |.  8BFA          mov     edi, edx
    18. 00421898  |.  8BCE          mov     ecx, esi
    19. 0042189A  |.  33C0          xor     eax, eax
    20. 0042189C  |.  895424 20     mov     dword ptr [esp+20], edx                  ;  放假码是用来求其长度
    21. 004218A0  |.  F2:AE         repne   scas byte ptr es:[edi]           
    22. 004218A2  |.  F7D1          not     ecx                                      ;  这三句是用来求字符串长度的另一种方法
    23. 004218A4  |.  49            dec     ecx                                 
    24. 004218A5  |.  8BFB          mov     edi, ebx
    25. 004218A7  |.  8BE9          mov     ebp, ecx
    26. 004218A9  |.  8BCE          mov     ecx, esi
    27. 004218AB  |.  F2:AE         repne   scas byte ptr es:[edi]
    28. 004218AD  |.  F7D1          not     ecx                                      ;  求用户名长度
    29. 004218AF  |.  49            dec     ecx
    30. 004218B0  |.  3BCD          cmp     ecx, ebp
    31. 004218B2  |.  0F87 54010000 ja      00421A0C                                 ;  此处得知用户名长度必须小于注册码
    32. 004218B8  |.  8BFB          mov     edi, ebx
    33. 004218BA  |.  8BCE          mov     ecx, esi
    34. 004218BC  |.  F2:AE         repne   scas byte ptr es:[edi]
    35. 004218BE  |.  F7D1          not     ecx
    36. 004218C0  |.  49            dec     ecx
    37. 004218C1  |.  0F84 45010000 je      00421A0C                                 ;  检测用户名和注册码是不是为空
    38. 004218C7  |.  8BFA          mov     edi, edx
    39. 004218C9  |.  8BCE          mov     ecx, esi
    40. 004218CB  |.  F2:AE         repne   scas byte ptr es:[edi]
    41. 004218CD  |.  F7D1          not     ecx
    42. 004218CF  |.  49            dec     ecx
    43. 004218D0  |.  0F84 36010000 je      00421A0C
    44. 004218D6  |.  894424 38     mov     dword ptr [esp+38], eax
    45. 004218DA  |>  8B5424 38     /mov     edx, dword ptr [esp+38]
    46. 004218DE  |.  8D4C24 34     |lea     ecx, dword ptr [esp+34]
    47. 004218E2  |.  8A82 A8884300 |mov     al, byte ptr [edx+4388A8]
    48. 004218E8  |.  884424 18     |mov     byte ptr [esp+18], al
    49. 004218EC  |.  E8 BD5A0000   |call    <jmp.&MFC42.#540_CString::CString>
    50. 004218F1  |.  8BFB          |mov     edi, ebx
    51. 004218F3  |.  83C9 FF       |or      ecx, FFFFFFFF
    52. 004218F6  |.  33C0          |xor     eax, eax
    53. 004218F8  |.  33ED          |xor     ebp, ebp
    54. 004218FA  |.  F2:AE         |repne   scas byte ptr es:[edi]
    55. 004218FC  |.  F7D1          |not     ecx
    56. 004218FE  |.  49            |dec     ecx                                     ;  此时ECX中是用户名长度
    57. 004218FF  |.  C64424 2C 02  |mov     byte ptr [esp+2C], 2
    58. 00421904  |.  74 4B         |je      short 00421951
    59. 00421906  |>  8A042B        |/mov     al, byte ptr [ebx+ebp]                 ;  EBX中放的是用户名,用户名每个字母依次放入al中
    60. 00421909  |.  33F6          ||xor     esi, esi
    61. 0042190B  |>  3A0475 408843>||/cmp     al, byte ptr [esi*2+438840]           ;  在00438840处有一个密码表,是计算注册码的关键
    62. 00421912  |.  74 08         |||je      short 0042191C
    63. 00421914  |.  46            |||inc     esi
    64. 00421915  |.  83FE 34       |||cmp     esi, 34
    65. 00421918  |.^ 7C F1         ||\jl      short 0042190B
    66. 0042191A  |.  EB 11         ||jmp     short 0042192D
    67. 0042191C  |>  8A0C75 418843>||mov     cl, byte ptr [esi*2+438841]            ;  这里的字符串是用户名所对应的密码表转换后的值
    68. 00421923  |.  51            ||push    ecx
    69. 00421924  |.  8D4C24 38     ||lea     ecx, dword ptr [esp+38]
    70. 00421928  |.  E8 1B5D0000   ||call    <jmp.&MFC42.#940_CString::operator+=>
    71. 0042192D  |>  83FE 34       ||cmp     esi, 34
    72. 00421930  |.  75 0E         ||jnz     short 00421940
    73. 00421932  |.  8B5424 18     ||mov     edx, dword ptr [esp+18]
    74. 00421936  |.  8D4C24 34     ||lea     ecx, dword ptr [esp+34]
    75. 0042193A  |.  52            ||push    edx
    76. 0042193B  |.  E8 085D0000   ||call    <jmp.&MFC42.#940_CString::operator+=>
    77. 00421940  |>  8BFB          ||mov     edi, ebx
    78. 00421942  |.  83C9 FF       ||or      ecx, FFFFFFFF
    79. 00421945  |.  33C0          ||xor     eax, eax
    80. 00421947  |.  45            ||inc     ebp
    81. 00421948  |.  F2:AE         ||repne   scas byte ptr es:[edi]
    82. 0042194A  |.  F7D1          ||not     ecx
    83. 0042194C  |.  49            ||dec     ecx
    84. 0042194D  |.  3BE9          ||cmp     ebp, ecx                               ;  EBP是循环的次数,ECX是用户名位数
    85. 0042194F  |.^ 72 B5         |\jb      short 00421906
    86. 00421951  |>  8B4424 34     |mov     eax, dword ptr [esp+34]                 ;  用户名和密码表对应换算成的一串字符(注册码一部分)设为R1
    87. 00421955  |.  8B48 F8       |mov     ecx, dword ptr [eax-8]                  ;  用户名长度放入ECX
    88. 00421958  |.  83F9 10       |cmp     ecx, 10                                 ;  比较用户名是不是大于16位
    89. 0042195B  |.  7D 3A         |jge     short 00421997
    90. 0042195D  |.  8BC1          |mov     eax, ecx
    91. 0042195F  |.  B9 10000000   |mov     ecx, 10
    92. 00421964  |.  2BC8          |sub     ecx, eax                                ;  如果用户名长度(设为len)小于16位,算出(16-len)
    93. 00421966  |.  8D5424 1C     |lea     edx, dword ptr [esp+1C]
    94. 0042196A  |.  51            |push    ecx
    95. 0042196B  |.  52            |push    edx
    96. 0042196C  |.  B9 C48E4300   |mov     ecx, 00438EC4                          
    97. 00421971  |.  E8 D45A0000   |call    <jmp.&MFC42.#4129_CString::Left>        ;  可疑之处,等会跟进看看
    98. 00421976  |.  50            |push    eax
    99. 00421977  |.  8D4C24 38     |lea     ecx, dword ptr [esp+38]
    100. 0042197B  |.  C64424 30 03  |mov     byte ptr [esp+30], 3
    101. 00421980  |.  E8 BD5C0000   |call    <jmp.&MFC42.#939_CString::operator+=>
    102. 00421985  |.  8D4C24 1C     |lea     ecx, dword ptr [esp+1C]
    103. 00421989  |.  C64424 2C 02  |mov     byte ptr [esp+2C], 2
    104. 0042198E  |.  E8 0F5A0000   |call    <jmp.&MFC42.#800_CString::~CString>
    105. 00421993  |.  8B4424 34     |mov     eax, dword ptr [esp+34]                 ;  两部分注册码连接,即R1+R2(出现了明码)
    106. 00421997  |>  8B4C24 20     |mov     ecx, dword ptr [esp+20]
    107. 0042199B  |.  51            |push    ecx                                     ; /s2
    108. 0042199C  |.  50            |push    eax                                     ; |s1
    109. 0042199D  |.  FF15 B4D64200 |call    dword ptr [<&MSVCRT._mbscmp>]           ; \_mbscmp 比较真假码
    110. 004219A3  |.  83C4 08       |add     esp, 8
    111. 004219A6  |.  8D4C24 34     |lea     ecx, dword ptr [esp+34]
    112. 004219AA  |.  85C0          |test    eax, eax
    113. 004219AC  |.  C64424 2C 01  |mov     byte ptr [esp+2C], 1
    114. 004219B1  |.  74 1B         |je      short 004219CE                          ;  真正的关键跳
    115. 004219B3  |.  33F6          |xor     esi, esi
    116. 004219B5  |.  E8 E8590000   |call    <jmp.&MFC42.#800_CString::~CString>
    117. 004219BA  |.  8B4424 38     |mov     eax, dword ptr [esp+38]
    118. 004219BE  |.  40            |inc     eax
    119. 004219BF  |.  83F8 03       |cmp     eax, 3
    120. 004219C2  |.  894424 38     |mov     dword ptr [esp+38], eax
    121. 004219C6  |.^ 0F8C 0EFFFFFF \jl      004218DA
    122. 004219CC  |.  EB 0A         jmp     short 004219D8
    123. 004219CE  |>  BE 01000000   mov     esi, 1
    复制代码
    跟进00421971的call:
    1. ……
    2. 73D86480    33FF            xor     edi, edi
    3. 73D86482    8B01            mov     eax, dword ptr [ecx]                     ; 另外一截密码表"ESqNCdaYoDciekuS"
    4. 73D86484    3B78 F8         cmp     edi, dword ptr [eax-8]
    5. 73D86487    7C 0B           jl      short 73D86494
    6. 73D86489    51              push    ecx
    7. 73D8648A    8B4D 08         mov     ecx, dword ptr [ebp+8]
    8. 73D8648D    E8 FFDEFAFF     call    #535_CString::CString
    9. 73D86492    EB 3C           jmp     short 73D864D0
    10. 73D86494    56              push    esi
    11. 73D86495    8D4D 0C         lea     ecx, dword ptr [ebp+C]
    12. 73D86498    E8 BFC1FAFF     call    #540_CString::CString
    13. 73D8649D    8B4D F0         mov     ecx, dword ptr [ebp-10]
    14. 73D864A0    6A 00           push    0
    15. 73D864A2    6A 00           push    0
    16. 73D864A4    33F6            xor     esi, esi
    17. 73D864A6    57              push    edi
    18. 73D864A7    8D45 0C         lea     eax, dword ptr [ebp+C]
    19. 73D864AA    46              inc     esi
    20. 73D864AB    50              push    eax
    21. 73D864AC    8975 FC         mov     dword ptr [ebp-4], esi
    22. 73D864AF    E8 27710000     call    #1589_CString::AllocCopy
    23. 73D864B4    8B4D 08         mov     ecx, dword ptr [ebp+8]                   ; 加入刚刚算出的(16-len)为9,则从第一位开始截取第二组密码表"ESqNCdaYoDciekuS"9位并取出(注册码第二部分)设为R2
    24. 73D864B7    8D45 0C         lea     eax, dword ptr [ebp+C]
    25. 73D864BA    50              push    eax
    26. 73D864BB    E8 D1DEFAFF     call    #535_CString::CString
    复制代码
    至此,算法过程逐渐明朗:
    1、软件事先定义两组密码表如下:
       单步走到0042190B处,查看数据窗口可知第一处密码表:aGbmcldSemfkgEhcixjsktlYmbnkoDptqarfswtlujvDwIxPyZzXAPBoCKDgEyFmGtHaIrJqKNLQMUNuOGPJQLRnSbTCUFVHWoXwYEZpvMw
       在73D86482会出现第二处密码表:ESqNCdaYoDciekuS
    2、软件依次取出用户名每一位根据第一处密码表换算成密码表中的字符,从而生成一个和用户自己输入的用户名相同的字符串
    3、然后判断用户名是不是大于16位,若小于则算出(16-len),然后从第二处密码表开头依次取出(16-len)位,并且与第2步的字串连接作为注册码;若不小于16位,则直接把根据第一处密码表换算生成的字串作为注册码

    根据研究发现要把这段汇编“翻译”成高级语言还真不太容易,灵机一动想到一个另类的方法,呵呵:
    OD载入,用户名我们输入“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”,注册码随便,然后单步到004218B2时不要让跳转实现(会跳向错误),当单步到00421951时,出现一个字符串“GmlSmkEcxstYbkDtafwljDIPZXPoKgymtarqNQUuGJLnbCFHowEp”,呵呵,这就是大小写52个字母分别对应的注册码值,用这个字符串来选个注册码看看

    用户名:p layboysen(因为我们论坛有文字自动过滤,所以我在p的后面故意加了一个空格,试验的时候请自行去除)
    对应
    注册码:tYGZmDZwmk

    因为我们的用户名只有10位,那么16-10=6,从第二个密码表中取出前6位“ESqNCd”
    最终注册码为: tYGZmDZwmkESqNCd

    今天七夕,天比较晚了,还要赶着回去给GF打电话去呢,注册机就先不写了,有时间再补上,同时也祝愿大家有情人终成眷属,七夕快乐!/:013

    [ 本帖最后由 playboysen 于 2008-8-8 08:12 编辑 ]

    评分

    参与人数 1威望 +20 飘云币 +40 收起 理由
    tianxj + 20 + 40 您发布的主题属于精品!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2023-12-27 21:49
  • 签到天数: 85 天

    [LV.6]常住居民II

    发表于 2008-8-7 21:41:34 | 显示全部楼层
    强烈支持

    十分强大
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-6-7 15:59
  • 签到天数: 159 天

    [LV.7]常住居民III

    发表于 2008-8-7 21:44:27 | 显示全部楼层
    学习一下,先谢谢楼主了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-4-15 13:51
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-8-7 22:06:09 | 显示全部楼层
    写得真详细,楼主辛苦了。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-8-8 02:03:12 | 显示全部楼层
    哎,我这水平能达到这样就好了!
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2022-2-6 09:25
  • 签到天数: 6 天

    [LV.2]偶尔看看I

     楼主| 发表于 2008-8-8 08:07:39 | 显示全部楼层
    版主是不是把论坛的文字过滤系统给改一下啊,连我的名字“p layboysen”都给我过滤了的,呜呜
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-8-8 08:57:29 | 显示全部楼层
    原帖由 **sen 于 2008-8-8 08:07 发表
    版主是不是把论坛的文字过滤系统给改一下啊,连我的名字“p layboysen”都给我过滤了的,呜呜


    坚持过奥运  感谢兄弟分享 ~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-8-8 18:43:05 | 显示全部楼层
    不错!学习了!感谢楼主分享:victory:
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2022-2-6 09:25
  • 签到天数: 6 天

    [LV.2]偶尔看看I

     楼主| 发表于 2008-8-9 10:33:43 | 显示全部楼层
    呵呵,补充注意事项:
    1、软件会把任何单个中文字符用密码表换算成“vv”,即如果用户名是“飘云阁”,则在00421951设断会发现R1为“vvvvvv”(6位),然后再用16-6=10,从第二处密码表“ESqNCdaYoDciekuS”取出十位并连接,即为注册码(用户名:飘云阁 注册码:vvvvvvESqNCdaYoD)
    2、注册成功后要重启软件才能在About中看到效果
    3、注册码保存在软件根目录videoconvert.ini文件中

    Enjoy~~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-8-9 11:55:58 | 显示全部楼层

    不错,不错

    支持支持
    :loveliness: :loveliness: :loveliness:
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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