VeryPDF PDF2Word v3.0算法分析
By Evil


使用PEID 0.94在查壳发现使用的 UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo,
使用UPX 通用脱壳机,以失败告终。使用ESP定律时,快到OEP了,出现如下代码:
00702817    8D4424 80       LEA EAX,DWORD PTR SS:[ESP-80]
0070281B    6A 00           PUSH 0
0070281D    39C4            CMP ESP,EAX
0070281F  ^ 75 FA           JNZ SHORT 复件_pdf.0070281B
00702821    83EC 80         SUB ESP,-80
00702824  ^ E9 5506E9FF     JMP 复件_pdf.00592E7E

在地址0070281F 出老是往回跳,跳到0070281B, 在00702821处 下F4 也没用.

那就带壳分析吧。于是用OD载入带壳的pdf2word.exe 
在命令行插件里输入bp MessageBoxA,按F9运行程序,程序会自动停止,从状态栏看到是程序出现异常,根据提示按Shift+F9跳过异常继续运行,这时弹出了注册窗口,输入你的E-mail地址,在Registration Key框中随意输入假注册码87654321,点OK后程序被中断,按CTRL+F9执行到返回,这时弹出“Wrong License Key”的对话框。点确定按钮,程序又一次中断,按F8返回到程序空间,在注释栏可以看到很多字符串,向上不远可以看到注册成功的提示字符串“Thank you registered VeryPDF PDF2Word v3.0.”。按照程序的注册流程,必然在“成功提示”前面有个关键跳,跳向“错误提示”,我们在00405D90 74 44           JE SHORT复件_pdf.00405DD6
这行代码上点击一下鼠标左键,很清楚的看到它恰恰是跳到“错误提示”的前面。我们可以肯定这里就是关键跳了.大家都知道关键跳前面一般都是关键比较,也就是关键CALL,向上走几行来到关键CALL处,在地址00405D86处。
00405D86    E8 95F8FFFF     CALL 复件_pdf.00405620
在此行代码上下断  按CTRL+F2重新载入程序,F9运行,还是输入刚才的e-mail和假码87654321,点OK,程序中断在刚刚下的断点,按F7进入CALL,算法代码如下:


00405620    83EC 18         SUB ESP,18
00405623    83C9 FF         OR ECX,FFFFFFFF                      ;ECX = -1
00405626    33C0            XOR EAX,EAX
00405628    53              PUSH EBX
00405629    56              PUSH ESI
0040562A    8B7424 24       MOV ESI,DWORD PTR SS:[ESP+24]
0040562E    57              PUSH EDI
0040562F    8BFE            MOV EDI,ESI
00405631    F2:AE           REPNE SCAS BYTE PTR ES:[EDI]
00405633    F7D1            NOT ECX                             ;ECX = 9
00405635    49              DEC ECX                             ;ECX = 8
00405636    83F9 14         CMP ECX,14                            
   ; 判断输入的注册码是否为20位
00405639    74 07           JE SHORT 复件_pdf.00405642               
  ; 相等的话就继续,不是就跳走
0040563B    5F              POP EDI
0040563C    5E              POP ESI
0040563D    5B              POP EBX
0040563E    83C4 18         ADD ESP,18
00405641    C3              RETN
00405642    8A06            MOV AL,BYTE PTR DS:[ESI]               
  ; 取注册码第1位放入al
00405644    8A4E 01         MOV CL,BYTE PTR DS:[ESI+1]             
  ; 取注册码第2位放入cl
00405647    8D5424 0C       LEA EDX,DWORD PTR SS:[ESP+C]
0040564B    32DB            XOR BL,BL
0040564D    52              PUSH EDX
0040564E    884424 1C       MOV BYTE PTR SS:[ESP+1C],AL
00405652    885C24 1D       MOV BYTE PTR SS:[ESP+1D],BL
00405656    884C24 10       MOV BYTE PTR SS:[ESP+10],CL
0040565A    885C24 11       MOV BYTE PTR SS:[ESP+11],BL
0040565E    E8 AE9E1800     CALL 复件_pdf.0058F511
00405663    8BF8            MOV EDI,EAX
00405665    8D4424 1C       LEA EAX,DWORD PTR SS:[ESP+1C]
00405669    50              PUSH EAX
0040566A    E8 A29E1800     CALL 复件_pdf.0058F511
0040566F    03F8            ADD EDI,EAX
00405671    83C4 08         ADD ESP,8
00405674    83FF 0B         CMP EDI,0B                             
  ; 判断前两位之和是否为11
00405677    74 09           JE SHORT 复件_pdf.00405682             
    ; 等于继续,不等则调走
00405679    5F              POP EDI
0040567A    5E              POP ESI
0040567B    33C0            XOR EAX,EAX
0040567D    5B              POP EBX
0040567E    83C4 18         ADD ESP,18
00405681    C3              RETN
00405682    8A4E 12         MOV CL,BYTE PTR DS:[ESI+12]             
 ; 取注册码第19位放入cl
00405685    8A56 13         MOV DL,BYTE PTR DS:[ESI+13]             
 ; 取注册码第20位放入dl
00405688    8D4424 0C       LEA EAX,DWORD PTR SS:[ESP+C]
0040568C    884C24 18       MOV BYTE PTR SS:[ESP+18],CL
00405690    50              PUSH EAX
00405691    885C24 1D       MOV BYTE PTR SS:[ESP+1D],BL
00405695    885424 10       MOV BYTE PTR SS:[ESP+10],DL
00405699    885C24 11       MOV BYTE PTR SS:[ESP+11],BL
0040569D    E8 6F9E1800     CALL 复件_pdf.0058F511
004056A2    8D4C24 1C       LEA ECX,DWORD PTR SS:[ESP+1C]
004056A6    8BF8            MOV EDI,EAX
004056A8    51              PUSH ECX
004056A9    E8 639E1800     CALL 复件_pdf.0058F511
004056AE    03F8            ADD EDI,EAX
004056B0    83C4 08         ADD ESP,8
004056B3    83FF 0D         CMP EDI,0D                             
  ; 判断最后2位(19位和20位) 之和是否为13
004056B6    74 09           JE SHORT 复件_pdf.004056C1               
  ; 等于继续,不等则调走
004056B8    5F              POP EDI
004056B9    5E              POP ESI
004056BA    33C0            XOR EAX,EAX
004056BC    5B              POP EBX
004056BD    83C4 18         ADD ESP,18
004056C0    C3              RETN
004056C1    8A56 05         MOV DL,BYTE PTR DS:[ESI+5]              
 ; 取注册码第6位放入dl
004056C4    8A46 0D         MOV AL,BYTE PTR DS:[ESI+D]               
; 取注册码第14位放入al
004056C7    8D4C24 0C       LEA ECX,DWORD PTR SS:[ESP+C]
004056CB    885424 18       MOV BYTE PTR SS:[ESP+18],DL
004056CF    51              PUSH ECX
004056D0    885C24 1D       MOV BYTE PTR SS:[ESP+1D],BL
004056D4    884424 10       MOV BYTE PTR SS:[ESP+10],AL
004056D8    885C24 11       MOV BYTE PTR SS:[ESP+11],BL
004056DC    E8 309E1800     CALL 复件_pdf.0058F511
004056E1    8D5424 1C       LEA EDX,DWORD PTR SS:[ESP+1C]
004056E5    8BF8            MOV EDI,EAX
004056E7    52              PUSH EDX
004056E8    E8 249E1800     CALL 复件_pdf.0058F511
004056ED    03F8            ADD EDI,EAX
004056EF    83C4 08         ADD ESP,8
004056F2    83FF 09         CMP EDI,9                                
; 判断第6位和第14位之和是否为9
004056F5    74 09           JE SHORT 复件_pdf.00405700
004056F7    5F              POP EDI
004056F8    5E              POP ESI
004056F9    33C0            XOR EAX,EAX
004056FB    5B              POP EBX
004056FC    83C4 18         ADD ESP,18
004056FF    C3              RETN
00405700    807E 0C 56      CMP BYTE PTR DS:[ESI+C],56              
 ; 判断第13位是否为“V”,16进制的56就是“V”
00405704    74 09           JE SHORT 复件_pdf.0040570F                 
; 等于继续,不等则跳转
00405706    5F              POP EDI
00405707    5E              POP ESI
00405708    33C0            XOR EAX,EAX
0040570A    5B              POP EBX
0040570B    83C4 18         ADD ESP,18
0040570E    C3              RETN
0040570F    807E 0E 33      CMP BYTE PTR DS:[ESI+E],33              
 ; 判断第15位是否为“3”,16进制的33就是“3”
00405713    74 09           JE SHORT 复件_pdf.0040571E
00405715    5F              POP EDI
00405716    5E              POP ESI
00405717    33C0            XOR EAX,EAX
00405719    5B              POP EBX
0040571A    83C4 18         ADD ESP,18
0040571D    C3              RETN
0040571E    8A4E 0F         MOV CL,BYTE PTR DS:[ESI+F]              
 ; 将注册码第16位放入cl
00405721    33C0            XOR EAX,EAX                            
 ; 清空eax
00405723    80F9 31         CMP CL,31                              
 ;判断第16位是否为“1”,16进制的31就是“1”
00405726    5F              POP EDI
00405727    5E              POP ESI
00405728    5B              POP EBX
00405729    0F94C0          SETE AL                                 
 ;等于的话将al置1,不等eax仍为零,返回后在关键跳前面test eax,eax看eax是否为零,为零跳向错误提示,不为零则成功,所以第16位必须为“1”
0040572C    83C4 18         ADD ESP,18
0040572F    C3              RETN










算法总结:
1.  注册码长度必须是20位。
2.  第1,2位 之和为11
3.  第19,20位 之和为13
4.  第6,14位 之和为9
5.  第13位是“V”          ;大写的V
6.  第15位是 3
7.  第16位是 1
8.  其它位任意

举例:
EMIL alex@126.com
注册码: 470004000000V5310067