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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!