且行且远
分类: 逆向手札 由 ssfighter 于 2006年2月22日 发表

从网上找来了这么一个软件,试着破解了一下,发现这个软件还真是防君子不防小人啊,很简单的,用了不到半个小时就全都搞定了,高手什么的就莫看了。

软件名称:PDF2Word(PDF To Word)
软件版本:1.6
适用平台:Windows 9x/ME/NT/2000/2003/XP
下载地址:http://www.onlinedown.net/soft/26328.htm
功能简介:PDF2Word(pdf to word)让你可以把文本,图片以及其他内容从pdf文档中输出到word文档中,所以你能够重新编辑pdf内容,PDF2Word将保存文本,版面和图片到生成的word文档中。PDF2Word(pdf to word)是一个独立的软件,所以你不需要安装Microsoft Word,Adobe Acrobat,甚至 Acrobat Reader来运行它。
使用软件:PeiD0.94 RegSnap FlyOdbg UltraEdit32

破解过程如下:

先用PeiD0.94侦壳,发现无壳。当然由于这个版本已经是被汉化过的了,因此可能原来有壳在汉化时候已经被脱掉了,不管,无壳更好,呵呵。
先试着运行一下,发现软件有使用次数的限制,用RegSnap扫描一次,再运行一次,再用RegSnap扫描一次,两次对比之后发现只在\Windows\ System32\下建立了一个pdf2word.dat的文件,注册表没有修改过,因此初步可以判断肯定是修改了这个文件,记录了使用的次数。用 UltraEdit32打开这个文件,发现只在12Ch处记了一个数2,这个应该就是已经使用的次数,再运行一遍,发现变成了3,看来果然不假,呵呵,软件的加密果然是防君子不防小人啊。

下面推注册码,用FlyOdbg载入,用Ultra String Reference插件搜索所有的ASCII字符,找到“注册码”错误的标记,来到这里。

00429F6B   > \6A 10         push 10                              ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
00429F6D   .  6A 00         push 0                               ; |Title = NULL
00429F6F   .  68 70824600   push pdf2rtf.00468270                ; |Text = “注册码错误,请检查后再试。”
00429F74   .  56            push esi                             ; |hOwner
00429F75   .  FF15 64974400 call near dword ptr ds:[<&USER32.Mes>; \MessageBoxA

其中00429F6B是从00429F30跳转过来的,往上翻,来到这里:

00429F0E   .  68 ECB64600   push pdf2rtf.0046B6EC                ; |Buffer = pdf2rtf.0046B6EC
00429F13   .  68 FB030000   push 3FB                             ; |ControlID = 3FB (1019.)
00429F18   .  56            push esi                             ; |hWnd
00429F19   .  F3:AB         rep stos dword ptr es:[edi]          ; |
00429F1B   .  FF15 5C974400 call near dword ptr ds:[<&USER32.Get>; \GetDlgItemTextA
00429F21   .  68 ECB64600   push pdf2rtf.0046B6EC
00429F26   .  E8 F5F7FFFF   call pdf2rtf.00429720
00429F2B   .  83C4 04       add esp,4
00429F2E   .  85C0          test eax,eax
00429F30   .  74 39         je short pdf2rtf.00429F6B
00429F32   .  6A 40         push 40                              ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00429F34   .  68 D0824600   push pdf2rtf.004682D0                ; |Title = “感谢您的注册”
00429F39   .  68 A4824600   push pdf2rtf.004682A4                ; |Text = “感谢您注册 VeryPDF PDF2Word v1.6.”
00429F3E   .  56            push esi                             ; |hOwner
00429F3F   .  FF15 64974400 call near dword ptr ds:[<&USER32.Mes>; \MessageBoxA
00429F45   .  68 ECB64600   push pdf2rtf.0046B6EC
00429F4A   .  56            push esi
00429F4B   .  E8 40F9FFFF   call pdf2rtf.00429890

看来00429F21就是关键call,设上断点,用F7步入。来到验证注册码的位置:
00429720  /$  83EC 30       sub esp,30
00429723  |.  55            push ebp
00429724  |.  56            push esi
00429725  |.  8B7424 3C     mov esi,dword ptr ss:[esp+3C]        ;  假码
00429729  |.  57            push edi
0042972A  |.  8A06          mov al,byte ptr ds:[esi]             ;  取假码第一位
0042972C  |.  8A4E 01       mov cl,byte ptr ds:[esi+1]           ;  取假码第二位
0042972F  |.  8A56 0E       mov dl,byte ptr ds:[esi+E]           ;  取假码第15位
00429732  |.  884424 18     mov byte ptr ss:[esp+18],al          ;  放假码第一位
00429736  |.  32C0          xor al,al
00429738  |.  884C24 30     mov byte ptr ss:[esp+30],cl          ;  放假码第二位
0042973C  |.  8A4E 0F       mov cl,byte ptr ds:[esi+F]           ;  取假码第16位
0042973F  |.  884424 19     mov byte ptr ss:[esp+19],al
00429743  |.  884424 31     mov byte ptr ss:[esp+31],al
00429747  |.  884424 25     mov byte ptr ss:[esp+25],al
0042974B  |.  884424 0D     mov byte ptr ss:[esp+D],al
0042974F  |.  8A46 02       mov al,byte ptr ds:[esi+2]           ;  取假码第三位
00429752  |.  3C 24         cmp al,24                            ;  第三位=’$’

看来假码的第三位应该是’$’

00429754  |.  885424 24     mov byte ptr ss:[esp+24],dl          ;  放假码第15位
00429758  |.  884C24 0C     mov byte ptr ss:[esp+C],cl           ;  放假码第16位
0042975C  |.  75 52         jnz short pdf2rtf.004297B0
0042975E  |.  8B3D 4C964400 mov edi,dword ptr ds:[<&MSVCRT.atoi>>;  msvcrt.atoi
00429764  |.  8D5424 0C     lea edx,dword ptr ss:[esp+C]
00429768  |.  52            push edx                             ; /s    这个是假码第1位
00429769  |.  FFD7          call near edi                        ; \atoi
0042976B  |.  8BE8          mov ebp,eax
0042976D  |.  8D4424 1C     lea eax,dword ptr ss:[esp+1C]
00429771  |.  50            push eax                             ; /s    这个是假码第16位
00429772  |.  FFD7          call near edi                        ; \atoi
00429774  |.  03E8          add ebp,eax
00429776  |.  83C4 08       add esp,8
00429779  |.  83FD 0A       cmp ebp,0A

取第1位和第16位转化成int格式
第1位和第16位的和应该是0A

0042977C  |.  75 32         jnz short pdf2rtf.004297B0
0042977E  |.  8D4C24 24     lea ecx,dword ptr ss:[esp+24]
00429782  |.  51            push ecx                             ; /s
00429783  |.  FFD7          call near edi                        ; \atoi
00429785  |.  8D5424 34     lea edx,dword ptr ss:[esp+34]
00429789  |.  8BE8          mov ebp,eax
0042978B  |.  52            push edx                             ; /s
0042978C  |.  FFD7          call near edi                        ; \atoi
0042978E  |.  03E8          add ebp,eax
00429790  |.  83C4 08       add esp,8
00429793  |.  83FD 0A       cmp ebp,0A

取第2位和第15位,这两位的和也应该是0A

00429796  |.  75 18         jnz short pdf2rtf.004297B0
00429798  |.  807E 03 24    cmp byte ptr ds:[esi+3],24

第4位也应该是’$’

0042979C  |.  75 12         jnz short pdf2rtf.004297B0
0042979E  |.  8A4E 05       mov cl,byte ptr ds:[esi+5]           ;  取假码第6位
004297A1  |.  33C0          xor eax,eax
004297A3  |.  80F9 23       cmp cl,23                            ;  ‘#’

第6位应该是’#’
004297A6  |.  5F            pop edi
004297A7  |.  5E            pop esi
004297A8  |.  5D            pop ebp
004297A9  |.  0F94C0        sete al
这里如果cl是23则al=1 否则 al=0

004297AC  |.  83C4 30       add esp,30
004297AF  |.  C3            retn
004297B0  |>  5F            pop edi
004297B1  |.  5E            pop esi
004297B2  |.  33C0          xor eax,eax
004297B4  |.  5D            pop ebp
004297B5  |.  83C4 30       add esp,30
004297B8  \.  C3            retn

验证过程居然只有这么短,那么综合上面的过程,总结起来就是:

第3、4位应该是’$’,第6位应该是’#’
第1位和第16位的和应该是10。
第2位和第15位的和也应该是10

注册码居然和注册用的Email地址无关,根据上面的这几条原则,把注册码填入,顺利注册。顺便说一下,注册之后的pdf2word.dat文件就完全改变了,如果把这个文件删掉,则又会是未注册版本。看来其实只要把这个注册之后的pdf2word.dat文件拷贝下来,就可以把试用版变成注册版了:)

果然是防君子不防小人的软件:)



发表评论

昵称:  (必须)
邮件:  (必须)
网址: 
评论: