crackist 发表于 2012-7-8 15:22

小菜对PDF2WORD的一次逆向过程

本帖最后由 crackist 于 2012-7-8 16:05 编辑

{:301_1009:}这么一个小软件还要注册

本着助人为乐,坑蒙拐骗的伟大精神,小菜我决定尝试逆向一番。。
故有了本文。第一次发帖写破解笔记可能理解起来有点困难~凑合看吧,相信在52破解这个温暖的环境大家的水平都可以稳步上升的。
废话就这么多。开始正题!
附件下载:
附件下载:http://dl.dbank.com/c0qhsdovuk

首先PEID查壳:

无壳,丢进OD。直接跑起来!

随便输入一组注册信息,点击确定:

提示错误这个信息框别点了,返回OD,将OD暂停,停在如下代码:
7C92E4F4 >C3         retn
7C92E4F5    8DA424 00000>lea   esp,dword ptr ss:
7C92E4FC    8D6424 00    lea   esp,dword ptr ss:
7C92E500 >8D5424 08    lea   edx,dword ptr ss:
7C92E504    CD 2E      int   2E
7C92E506    C3         retn
打开调用堆栈(ALT+K),情况如下:

需要注意的地方我的光标已经停留在了上面,代码如下:
0012E234   00429C07   ? USER32.MessageBoxA                  pdf2rtf.00429C01            0012E230
0012E238   00040466   hOwner = 00040466 ('请注册 pdf2wor
0012E23C   004673E0   Text = "序列号错误, 请检查后重试.
0012E240   00000000   Title = NULL
0012E244   00000010   Style = MB_OK|MB_ICONHAND|MB_APPLM

在“调用来自”一栏双击字符串“pdf2rtf.00429C01”,也可以在“0012E234   00429C07   ? USER32.MessageBoxA                  pdf2rtf.00429C01            0012E230”这一行代码上面右键--显示调用,来到如下位置:

00429C01    FF15 2487440>call    dword ptr ds:[<&USER32.MessageB>; USER32.MessageBoxA
00429C07    68 FB030000push    3FB
00429C0C    56         push    esi
00429C0D    FF15 2887440>call    dword ptr ds:[<&USER32.GetDlgIt>; USER32.GetDlgItem
00429C13    50         push    eax
00429C14    FF15 2C87440>call    dword ptr ds:[<&USER32.SetFocus>; USER32.SetFocus
00429C1A    E9 C3010000jmp   pdf2rtf.00429DE2
00429C1F    6A 01      push    1
00429C21    68 E4704600push    pdf2rtf.004670E4                ; ASCII "http://www.verypdf.com/pdf2word/index.html"
00429C26    E8 95F6FFFFcall    pdf2rtf.004292C0
往上翻,找关键地方上面下断。


我们如果不知道从哪下手,可以在反汇编窗口右键--分析--分析代码,然后再往上看:
00429BBE   .6A 40      push    40                              ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00429BC0   .68 3874460>push    pdf2rtf.00467438                ; |Title = "谢谢注册            "
00429BC5   .68 1474460>push    pdf2rtf.00467414                ; |Text = "感谢你注册 pdf2word v1.4.          "
00429BCA   .56         push    esi                           ; |hOwner
00429BCB   .FF15 24874>call    dword ptr ds:[<&USER32.MessageB>; \MessageBoxA
00429BD1   .68 FCA6460>push    pdf2rtf.0046A6FC                ;ASCII "1234567890"
00429BD6   .56         push    esi
00429BD7   .E8 54F9FFF>call    pdf2rtf.00429530
00429BDC   .83C4 08    add   esp,8
00429BDF   .C705 C4A74>mov   dword ptr ds:,1
00429BE9   .6A 01      push    1                               ; /Result = 1
00429BEB   .56         push    esi                           ; |hWnd
00429BEC   .FF15 20874>call    dword ptr ds:[<&USER32.EndDialo>; \EndDialog
00429BF2   .E9 EB01000>jmp   pdf2rtf.00429DE2
00429BF7   >6A 10      push    10                              ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
00429BF9   .6A 00      push    0                               ; |Title = NULL
00429BFB   .68 E073460>push    pdf2rtf.004673E0                ; |Text = "序列号错误, 请检查后重试.                        "
00429C00   .56         push    esi                           ; |hOwner
00429C01   .FF15 24874>call    dword ptr ds:[<&USER32.MessageB>; \MessageBoxA
00429C07   .68 FB03000>push    3FB                           ; /ControlID = 3FB (1019.)
00429C0C   .56         push    esi                           ; |hWnd
00429C0D   .FF15 28874>call    dword ptr ds:[<&USER32.GetDlgIt>; \GetDlgItem
00429C13   .50         push    eax                           ; /hWnd
00429C14   .FF15 2C874>call    dword ptr ds:[<&USER32.SetFocus>; \SetFocus
是不是明朗多了?

我们来到注册成功上面的一个CALL下断,也就是在:
00429BB2   .E8 09F8FFF>call    pdf2rtf.004293C0处下断,F9运行,返回程序再次注册,停在了我们断下的CALL.

F7跟进,看看里面在什么的干活~
来到这里:
004293C0/$83EC 30    sub   esp,30
004293C3|.55         push    ebp
004293C4|.56         push    esi
004293C5|.8B7424 3Cmov   esi,dword ptr ss:
004293C9|.57         push    edi

我们单步向下,看看能不能找到什么有用的信息。
来到这里:
00429450|> \5F         pop   edi                           ;pdf2rtf.0046A7C4
00429451|.5E         pop   esi
00429452|.33C0       xor   eax,eax                     ;EAX清零
00429454|.5D         pop   ebp
00429455|.83C4 30    add   esp,30
00429458\.C3         retn

可以看到有一句是把寄存器EAX清零,我们继续跟出去看看跳向失败前用到了什么信息,继续单步出去。
返回出来以后来到这里:
00429BB7   .83C4 04    add   esp,4
00429BBA   .85C0       test    eax,eax                                       ;此处测试EAX的值,下面是个JE,等于0则跳!
00429BBC   .74 39      je      short pdf2rtf.00429BF7
00429BBE   .6A 40      push    40                              ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00429BC0   .68 3874460>push    pdf2rtf.00467438                ; |Title = "谢谢注册            "
00429BC5   .68 1474460>push    pdf2rtf.00467414                ; |Text = "感谢你注册 pdf2word v1.4.          "
00429BCA   .56         push    esi                           ; |hOwner
00429BCB   .FF15 24874>call    dword ptr ds:[<&USER32.MessageB>; \MessageBoxA
00429BD1   .68 FCA6460>push    pdf2rtf.0046A6FC                ;ASCII "1234567890"

可以看到此处对比的正是EAX的值,到了这里大家都懂得了~
修改的方法不止一种,我这里是把CALL里面的XOR修改为了OR,只要实现关键跳不跳就可以了。
我们看下效果……

OK,成功注册,我们保存下爆破的软件,看看是不是真的注册成功,因为有的软件直接改跳是没真正注册的。

事实证明我们是成功的~
关闭的时候觉得退出的确认提示很让人不爽,就是传说中的NAG吧。

我们来看看怎么去掉它,OD载入破解完的程序。
跑起来,点击退出按钮,让程序弹出NAG窗,然后回到OD暂停掉。打开调用堆栈(ALT+K)。


调用堆栈
地址       堆栈       函数例程 / 参数                     调用来自                      框架
0012F324   77D19418   包含 ntdll.KiFastSystemCallRet          USER32.77D19416               0012F358
0012F328   77D2770A   USER32.WaitMessage                  USER32.77D27705               0012F358
0012F35C   77D249C4   USER32.77D2757B                     USER32.77D249BF               0012F358
0012F384   77D3A956   USER32.77D2490E                     USER32.77D3A951               0012F380
0012F644   77D3A2BC   USER32.SoftModalMessageBox            USER32.77D3A2B7               0012F640
0012F794   77D663FD   USER32.77D3A147                     USER32.77D663F8               0012F790
0012F7EC   77D664A2   USER32.MessageBoxTimeoutW             USER32.77D6649D               0012F7E8
0012F820   77D50877   ? USER32.MessageBoxTimeoutA         USER32.77D50872               0012F81C
0012F840   77D5082F   ? USER32.MessageBoxExA                USER32.77D5082A               0012F83C
0012F844   000D04F8   hOwner = 000D04F8 ('PDF2Word v1.4'
0012F848   00469F90   Text = "要退出吗?      "
0012F84C   0046684C   Title = "PDF2Word"
0012F850   00000004   Style = MB_YESNO|MB_APPLMODAL
0012F854   00000000   LanguageID = 0 (LANG_NEUTRAL)
0012F85C   73D8849C   ? USER32.MessageBoxA                  MFC42.73D88496                0012F858
0012F860   000D04F8   hOwner = 000D04F8 ('PDF2Word v1.4'
0012F864   00469F90   Text = "要退出吗?      "
0012F868   0046684C   Title = "PDF2Word"
0012F86C   00000004   Style = MB_YESNO|MB_APPLMODAL
0012F874   0043A951   ? <jmp.&MFC42.#4224>                  Crack.0043A94C

我们在0012F840   77D5082F   ? USER32.MessageBoxExA 上面查看调用堆栈,来到如下位置:
77D5082A    E8 2D000000call    USER32.MessageBoxExA
77D5082F    5D         pop   ebp
77D50830    C2 1000      retn    10
可以发现我们现在是在系统的领空,我们在这个CALL下断,再次点击退出,让程序运行到这来。
运行到这个CALL以后,我们单步走,在提示里面点击“是”,也就是退出。直到返回程序领空。
两次RETN以后,我们来到了程序领空,此处代码如下:

0043D323    83F8 06      cmp   eax,6
0043D326^ 75 B3      jnz   short Crack.0043D2DB
0043D328    6A 00      push    0
0043D32A    FF15 1481440>call    dword ptr ds:[<&KERNEL32.ExitPr>; 这里是退出函数

0043D330    8B41 20      mov   eax,dword ptr ds:
0043D333    8B0D C4A7460>mov   ecx,dword ptr ds:
0043D339    50         push    eax
0043D33A    51         push    ecx
0043D33B    E8 C0CAFEFFcall    Crack.00429E00
0043D340    A3 C4A74600mov   dword ptr ds:,eax
0043D345    C3         retn

往上看,代码如下:


0043D309    83C4 08      add   esp,8
0043D30C    85C0         test    eax,eax
0043D30E^ 75 CB      jnz   short Crack.0043D2DB            ; 这里应该是个循环,不知道计算神马鬼东西
0043D310    6A 04      push    4                               ; 这里就是弹窗这个小节的开始了
0043D312    68 4C684600push    Crack.0046684C                  ; ASCII "PDF2Word"
0043D317    68 909F4600push    Crack.00469F90
0043D31C    8BCE         mov   ecx,esi
0043D31E    E8 29800000call    <jmp.&MFC42.#4224>            ; 刚刚我们走过的CALL,也就是弹NAG的CALL



我们把0043D310    6A 04      push    4这个地方直接JMP到退出函数的开始,也就是地址:0043D328
保存下,测试。
点击窗体中的“关闭”按钮是直接退出,但是点击右上角的X退出依然有NAG,这个方法也是一样,算是留给各位新手的小作业了吧,欢迎各位交流哦。
郁闷的是我开始一步一步都传了图片,谁知的中途莫名其妙被刷新了下,还好论坛发帖有恢复数据功能,但是只有文字恢复了出来,图片木有了~~






Chief 发表于 2012-7-8 15:26

写得不错,鼓励下。
可以借鉴别人的破文帖子,把帖子整理的清晰一点,
这样别人浏览起来比较方便。

Kido 发表于 2012-7-8 15:28

膜拜lz老师
老师要是使用code代码就更加漂亮了~

1354669803 发表于 2012-7-8 15:29

这个应该是赋值和F12暂停法的应用吧?感谢分享 膜拜楼主

吾爱扣扣 发表于 2012-7-8 15:33

呵呵!不错哦!学习了!

crackist 发表于 2012-7-8 16:07

Chief 发表于 2012-7-8 15:26 static/image/common/back.gif
写得不错,鼓励下。
可以借鉴别人的破文帖子,把帖子整理的清晰一点,
这样别人浏览起来比较方便。

谢谢~这是我第一次写帖子,自己都觉得有点乱…{:17_1074:}

crackist 发表于 2012-7-8 16:10

Kido 发表于 2012-7-8 15:28 static/image/common/back.gif
膜拜lz老师
老师要是使用code代码就更加漂亮了~

{:301_997:}我也不是老湿,也是个新手,加入52PoJie就是为了提高自己,帮助他人。共同进步{:301_984:}

Sound 发表于 2012-7-8 21:45

帖子写的不错
高亮一天以示鼓励
希望多出一些精品文章
吾爱破解论坛有您更精彩

crackist 发表于 2012-7-9 08:39

Sound 发表于 2012-7-8 21:45 static/image/common/back.gif
帖子写的不错
高亮一天以示鼓励
希望多出一些精品文章


{:301_991:}感谢支持

老海 发表于 2012-7-9 15:51

分析的不错,只是在用语方面有不确切的地方。
页: [1] 2
查看完整版本: 小菜对PDF2WORD的一次逆向过程