从网上找来了这么一个软件,试着破解了一下,发现这个软件还真是防君子不防小人啊,很简单的,用了不到半个小时就全都搞定了,高手什么的就莫看了。
软件名称: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文件拷贝下来,就可以把试用版变成注册版了:)
果然是防君子不防小人的软件:)
评论