【课    题】: Nidesoft DVD to MP4 Converter 的注册分析
【作    者】: HailDuz 
【软件名称】: Nidesoft DVD to MP4 Converter V5.X.XX
【软件大小】: 724992
【下载地址】: http://www.nidesoft.com/
【保护方式】: 注册码验证
【使用工具】: OD,UltraEdit32
【操作平台】: WinXP
【软件介绍】: 好像是一个DVD转MP4的工具。
【作者声明】: 纯技术问题,只是想试试自己的耐心,无其他目的。失误之处敬请诸位赐教!
--------------------------------------------------------------------------------
【过    程】
Nidesoft DVD to MP4 Converter是一个媒体转换的工具,需要注册码完成注册,保护程度一般,有一个爆破点可以省去注册码的回溯。本文主要分析其注册过程。
检查其主程序DVDRipper.exe,无壳,VC6编译的。
OD载入,运行后标题显示未注册,提示输入注册信息:邮件地址,注册码。
任意输入些信息确认,提示注册码错误"Register code not correct,please check it!",查找字符串看到 "Registration Successful"信息,来到00416533这里提示注册成功。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
00416505  |.  51            PUSH ECX                                 ; /Arg2
00416506  |.  52            PUSH EDX                                 ; |Arg1
00416507  |.  8D8C24 4C0700>LEA ECX,DWORD PTR SS:[ESP+74C]           ; |
0041650E  |.  E8 7DD6FEFF   CALL DVDRippe.00403B90                   ; 关键Call 函数调用 
00416513  |.  8B4424 0C     MOV EAX,DWORD PTR SS:[ESP+C]
00416517  |.  5F            POP EDI
00416518  |.  85C0          TEST EAX,EAX                             ;比较EAX是否小于等于0
0041651A  |.  5D            POP EBP
0041651B  |.  0F86 A7000000 JBE DVDRippe.004165C8                    ;  跳到注册失败1 
00416521  |.  3D 9F860100   CMP EAX,1869F                           ; 比较EAX是否小于99999
00416526  |.  0F83 9C000000 JNB DVDRippe.004165C8                    ;  跳到注册失败2 
0041652C  |.  6A 40         PUSH 40 
0041652E  |.  68 E8E64400   PUSH DVDRippe.0044E6E8                   ;  ASCII "Nidesoft"
00416533  |.  68 D0E64400   PUSH DVDRippe.0044E6D0                   ;  ASCII "Registration Successful"
00416538  |.  8BCE          MOV ECX,ESI
0041653A  |.  E8 6D180200   CALL <JMP.&MFC42.#4224_?MessageBoxA@CWnd>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在00416518处更改EAX值在0~99999的值,提示注册成功,主程序标题未注册信息消失。重启程序依然需要注册,又重启验证。检查程序后发现在这里:读该程序Skins目录的ifo.bmp的信息。(注册成功后追加到文件尾部,好像可以多次累加,不知设计人想要它长到多大,没试。)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
00403E52  |> \8B46 04       MOV EAX,DWORD PTR DS:[ESI+4]
00403E55  |.  53            PUSH EBX
00403E56  |.  8B1D A4F64300 MOV EBX,DWORD PTR DS:[<&MSVCRT.fseek>]   ;  msvcrt.fseek
00403E5C  |.  6A 02         PUSH 2                                   ; /whence = SEEK_END
00403E5E  |.  6A 00         PUSH 0                                   ; |offset = 0
00403E60  |.  50            PUSH EAX                                 ; |stream
00403E61  |.  FFD3          CALL EBX                                 ; \fseek
00403E63  |.  8B4E 04       MOV ECX,DWORD PTR DS:[ESI+4]
00403E66  |.  51            PUSH ECX                                 ; /stream
00403E67  |.  FF15 A0F64300 CALL DWORD PTR DS:[<&MSVCRT.ftell>]      ; \ftell
00403E6D  |.  8B56 04       MOV EDX,DWORD PTR DS:[ESI+4]
00403E70  |.  2BC7          SUB EAX,EDI
00403E72  |.  6A 00         PUSH 0
00403E74  |.  50            PUSH EAX
00403E75  |.  52            PUSH EDX
00403E76  |.  FFD3          CALL EBX
00403E78  |.  8B46 04       MOV EAX,DWORD PTR DS:[ESI+4]
00403E7B  |.  8B8E 10010000 MOV ECX,DWORD PTR DS:[ESI+110]
00403E81  |.  50            PUSH EAX                                 ; /stream
00403E82  |.  57            PUSH EDI                                  ; |n
00403E83  |.  6A 01         PUSH 1                                     ; |size = 1
00403E85  |.  51            PUSH ECX                                  ; |ptr
00403E86  |.  FF15 9CF64300 CALL DWORD PTR DS:[<&MSVCRT.fread>]      ; \fread
00403E8C  |.  83C4 2C       ADD ESP,2C                                 ;  读取了Ifo.bmp最后16个数据
00403E8F  |.  33C0          XOR EAX,EAX
00403E91  |.  85FF          TEST EDI,EDI
00403E93  |.  7E 1B         JLE SHORT DVDRippe.00403EB0
00403E95  |>  8B96 10010000 /MOV EDX,DWORD PTR DS:[ESI+110]
00403E9B  |.  8A1C02        |MOV BL,BYTE PTR DS:[EDX+EAX]
00403E9E  |.  8D0C02        |LEA ECX,DWORD PTR DS:[EDX+EAX]
00403EA1  |.  8A96 18010000 |MOV DL,BYTE PTR DS:[ESI+118]
00403EA7  |.  32DA          |XOR BL,DL
00403EA9  |.  40            |INC EAX
00403EAA  |.  3BC7          |CMP EAX,EDI
00403EAC  |.  8819          |MOV BYTE PTR DS:[ECX],BL
00403EAE  |.^ 7C E5         \JL SHORT DVDRippe.00403E95
00403EB0  |>  8BB6 10010000 MOV ESI,DWORD PTR DS:[ESI+110]           ;  反算出注册码,FF与AscII异或
00403EB6  |.  8BCF          MOV ECX,EDI
00403EB8  |.  8B7C24 10     MOV EDI,DWORD PTR SS:[ESP+10]
00403EBC  |.  8BC1          MOV EAX,ECX
00403EBE  |.  C1E9 02       SHR ECX,2
00403EC1  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
00403EC3  |.  8BC8          MOV ECX,EAX
00403EC5  |.  5B            POP EBX
00403EC6  |.  83E1 03       AND ECX,3
00403EC9  |.  B8 01000000   MOV EAX,1
00403ECE  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
00403ED0  |.  5F            POP EDI
00403ED1  |.  5E            POP ESI
00403ED2  \.  C2 0800       RETN 8
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

反溯到启动验证部分:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
0040D090  /$  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
0040D096  |.  6A FF         PUSH -1
-----------------------------------------------------------------------------------------------
0040D0E6  |.  8D8C24 C00200>LEA ECX,DWORD PTR SS:[ESP+2C0]
0040D0ED  |.  50            PUSH EAX                                 ;  Eax=1D(29)个
0040D0EE  |.  52            PUSH EDX                                 ;  Edx地址 对应为:Nidesoft-DVD-to-MP4-Converter
0040D0EF  |.  E8 2C69FFFF   CALL DVDRippe.00403A20                   ;  生成了一堆怪异的码,后来看是计算注册码用计算码表
0040D0F4  |.  8D4C24 0C     LEA ECX,DWORD PTR SS:[ESP+C]
-----------------------------------------------------------------------------------------------------------
0040D1B4  |.  51            PUSH ECX                                 ; /Arg2
0040D1B5  |.  52            PUSH EDX                                 ; |Arg1
0040D1B6  |.  8D8C24 C80200>LEA ECX,DWORD PTR SS:[ESP+2C8]           ; |
0040D1BD  |.  E8 CE69FFFF   CALL DVDRippe.00403B90                   ; \判断是否注册的关键Call  
0040D1C2  |.  8B4424 08     MOV EAX,DWORD PTR SS:[ESP+8]
0040D1C6      85C0          TEST EAX,EAX
0040D1C8      76 25         JBE SHORT DVDRippe.0040D1EF
0040D1CA      3D 9F860100   CMP EAX,1869F                           ;同上面所述的注册判断
0040D1CF      73 1E         JNB SHORT DVDRippe.0040D1EF            
0040D1D1  |.  8D86 5CD10100 LEA EAX,DWORD PTR DS:[ESI+1D15C]
0040D1D7  |.  8D8E 4CD10100 LEA ECX,DWORD PTR DS:[ESI+1D14C]
0040D1DD  |.  50            PUSH EAX
0040D1DE  |.  C786 50D10100>MOV DWORD PTR DS:[ESI+1D150],1
0040D1E8  |.  E8 89A80200   CALL <JMP.&MFC42.#858_??4CString@@QAEABV>
0040D1ED  |.  EB 45         JMP SHORT DVDRippe.0040D234               ;跳到注册版
0040D1EF  |>  8D8E 5CD10100 LEA ECX,DWORD PTR DS:[ESI+1D15C]
0040D1F5  |.  68 40DA4400   PUSH DVDRippe.0044DA40                   ;  ASCII "(Unregistered)";到这里就是未注册版
0040D1FA  |.  8D5424 14     LEA EDX,DWORD PTR SS:[ESP+14]
-----------------------------------------------------------------------------------------
0040D266  |.  81C4 0C130000 ADD ESP,130C
0040D26C  \.  C3            RETN
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

下面是计算注册码所用的计算码表:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
00102EE0  D6 A4 09 35 1A CC CD 5C 3E 4D CA 98 99 35 2D 69  证.5 掏\>M?-i
00102EF0  65 C4 A0 7F CD E7 38 17 69 9B 5D C7 13 3D DC 45  e顽8 i?=
-----------   --------------------------------------------------------------------------------------------
00103EF0  88 E7 33 2E 20 65 AC EA CE A9 B0 07 BD E0 82 B3  3. e惟?洁
00103F00  49 2C 8A BA C0 E4 BA 98 E0 B8 B9 D5 94 C8 F5 13  I,冷喔拐?
00103F10  C2 E1 F6 6A F2 56 20 02 72 1C 1C DD 42 43 75 5E  箩  r  Cu^
00103F20  CD F0 8F 95 6B F1 5E CB                          宛k@ .
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


这里是读取有效的注册码信息,分别取前八位和八位后到十六位的注册码中的有效数字
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
00403B90  /$  83EC 1C       SUB ESP,1C
00403B93  |.  33C0          XOR EAX,EAX
00403B95  |.  56            PUSH ESI
-------------------------------------------------------------
00403BD0  |.  51            PUSH ECX
00403BD1  |.  8D5424 10     LEA EDX,DWORD PTR SS:[ESP+10]
00403BD5  |.  68 ECC04400   PUSH DVDRippe.0044C0EC                   ; |format = "%08X";取前8位注册码有效十六进制数字
00403BDA  |.  52            PUSH EDX                                 ; |s
00403BDB  |.  894424 28     MOV DWORD PTR SS:[ESP+28],EAX            ; |
00403BDF  |.  FFD7          CALL EDI                                 ; \sscanf
00403BE1  |.  83C4 0C       ADD ESP,0C
00403BE4  |.  8D4424 28     LEA EAX,DWORD PTR SS:[ESP+28]
00403BE8  |.  8D4C24 18     LEA ECX,DWORD PTR SS:[ESP+18]
00403BEC  |.  50            PUSH EAX
00403BED  |.  68 ECC04400   PUSH DVDRippe.0044C0EC                   ;  ASCII "%08X";取后8位注册码有效十六进制数字
00403BF2  |.  51            PUSH ECX
00403BF3  |.  FFD7          CALL EDI
00403BF5  |.  83C4 0C       ADD ESP,0C
------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

计算注册码得到结果判断码的关键函数分析。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
00403C90  /$  51            PUSH ECX
00403C91  |.  8B4424 08     MOV EAX,DWORD PTR SS:[ESP+8]
00403C95  |.  57            PUSH EDI
00403C96  |.  85C0          TEST EAX,EAX
00403C98  |.  8BF9          MOV EDI,ECX
00403C9A  |.  74 59         JE SHORT DVDRippe.00403CF5
00403C9C  |.  8B4C24 10     MOV ECX,DWORD PTR SS:[ESP+10]
00403CA0  |.  85C9          TEST ECX,ECX
00403CA2  |.  74 51         JE SHORT DVDRippe.00403CF5
00403CA4  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]               ;  纳入注册码有效8位进Eax,否则为一个地址值作为初始码
00403CA6  |.  53            PUSH EBX
00403CA7  |.  55            PUSH EBP
00403CA8  |.  56            PUSH ESI
00403CA9  |.  8B31          MOV ESI,DWORD PTR DS:[ECX]               ;  纳入注册码有效后8位进ESI,否则为一个地址值作为初始码
00403CAB  |.  8D5F 44       LEA EBX,DWORD PTR DS:[EDI+44]
00403CAE  |.  C74424 10 100>MOV DWORD PTR SS:[ESP+10],10
00403CB6  |>  8B2B          /MOV EBP,DWORD PTR DS:[EBX]              ; 从预置码第18个编码位开始依次递减进行载入完成循环
00403CB8  |.  8BCF          |MOV ECX,EDI
00403CBA  |.  33C5          |XOR EAX,EBP                                ;将载入的预置码与注册码前八位有效数字码异或后备压栈调用
00403CBC  |.  50            |PUSH EAX
00403CBD  |.  8BE8          |MOV EBP,EAX
00403CBF  |.  E8 7CFEFFFF   |CALL DVDRippe.00403B40                     ;计算码中间处理函数,分析见后面
00403CC4  |.  8B4C24 10     |MOV ECX,DWORD PTR SS:[ESP+10]
00403CC8  |.  33C6          |XOR EAX,ESI                                 ;计算结果与上一个计算结果异或
00403CCA  |.  83EB 04       |SUB EBX,4
00403CCD  |.  49            |DEC ECX
00403CCE  |.  8BF5          |MOV ESI,EBP
00403CD0  |.  894C24 10     |MOV DWORD PTR SS:[ESP+10],ECX
00403CD4  |.^ 75 E0         \JNZ SHORT DVDRippe.00403CB6                ;判断是否16次结束,得到计算结果
00403CD6  |.  8B4F 04       MOV ECX,DWORD PTR DS:[EDI+4]             ;  取预置码5CCDCC1A
00403CD9  |.  8B5424 18     MOV EDX,DWORD PTR SS:[ESP+18]
00403CDD  |.  33C8          XOR ECX,EAX                              ;  5CCDCC1A xor 00403CD4处的计算结果得到最终结果判断码
00403CDF  |.  8B07          MOV EAX,DWORD PTR DS:[EDI]             
00403CE1  |.  33C6          XOR EAX,ESI                              
00403CE3  |.  5E            POP ESI
00403CE4  |.  8902          MOV DWORD PTR DS:[EDX],EAX               
00403CE6  |.  8B4424 18     MOV EAX,DWORD PTR SS:[ESP+18]
00403CEA  |.  5D            POP EBP
00403CEB  |.  5B            POP EBX
00403CEC  |.  8908          MOV DWORD PTR DS:[EAX],ECX              
00403CEE  |.  33C0          XOR EAX,EAX
00403CF0  |.  5F            POP EDI
00403CF1  |.  59            POP ECX
00403CF2  |.  C2 0800       RETN 8
00403CF5  |>  B8 01000000   MOV EAX,1
00403CFA  |.  5F            POP EDI
00403CFB  |.  59            POP ECX
00403CFC  \.  C2 0800       RETN 8
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

计算码中间处理函数
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
00403B40  /$  56            PUSH ESI
00403B41  |.  8BF1          MOV ESI,ECX
00403B43  |.  8B4C24 08     MOV ECX,DWORD PTR SS:[ESP+8]
00403B47  |.  33C0          XOR EAX,EAX
00403B49  |.  8A4424 0A     MOV AL,BYTE PTR SS:[ESP+A]               ;  取00403CBA处计算结果的高3,4位
00403B4D  |.  8BD1          MOV EDX,ECX
00403B4F  |.  C1EA 18       SHR EDX,18                               ;  取00403CBA处计算结果的高两位
00403B52  |.  8B8486 480400>MOV EAX,DWORD PTR DS:[ESI+EAX*4+448]     ;  取高3,4位计算对应预置码位置的值设为X2
00403B59  |.  57            PUSH EDI
00403B5A  |.  8B7C96 48     MOV EDI,DWORD PTR DS:[ESI+EDX*4+48]      ;  取高两位计算对应预置码位置的值设为X1
00403B5E  |.  33D2          XOR EDX,EDX
00403B60  |.  8AD5          MOV DL,CH                                ;  取00403CBA处计算结果的高5,6位
00403B62  |.  03C7          ADD EAX,EDI                              ; X1 + X2
00403B64  |.  81E1 FF000000 AND ECX,0FF                              ;  取00403CBA处计算结果的低两位
00403B6A  |.  8BBC96 480800>MOV EDI,DWORD PTR DS:[ESI+EDX*4+848]     ;  取高5,6位计算对应预置码位置的值设为X3
00403B71  |.  8B948E 480C00>MOV EDX,DWORD PTR DS:[ESI+ECX*4+C48]     ;  取低两位计算对应预置码位置的值设为X4
00403B78  |.  33C7          XOR EAX,EDI                              ;  (X1 + X2)XOR X3
00403B7A  |.  5F            POP EDI
00403B7B  |.  03C2          ADD EAX,EDX                              ;  (X1 + X2)XOR X3 +X4
00403B7D  |.  5E            POP ESI
00403B7E  \.  C2 0400       RETN 4
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
总结一下:
程序注册过程是首先计算注册码预置值的数表以备后续使用。然后取注册码前8位,判断是否为有效16进制数,有效则取做计算的初始值(Y0),否则置Y0为一地址值,同理取注册码9到16位做同样处理得到计算初始值(Y1)。
计算过程如下:
以Y0为初始值,从预置码第18个编码位开始依次递减进行载入与计算结果做异或计算,利用计算结果的1,2;3,4;5,6;7,8组合计算对应预置码的位置并取值完成16次计算。将计算结果与预置码5CCDCC1A异或得到最终结果判断码。当结果判断码小于99999并大于0时注册成功。

知道注册过程不难计算对应注册码的计算结果,容易想到穷举法得到成功注册码,做了个程序计算1夜得到了很多有效注册码(没完全计算完)。
顺便说一下,用密码工具检测为BlowFish,由于本人对此了解甚少,到对应位置(不是有效地址)没看出任何端倪,如有更有效的可逆方法请不吝赐教。

  希望大家批评指点。
  
  HailDuz
  2009.6.26晨