小菜对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,这个方法也是一样,算是留给各位新手的小作业了吧,欢迎各位交流哦。
郁闷的是我开始一步一步都传了图片,谁知的中途莫名其妙被刷新了下,还好论坛发帖有恢复数据功能,但是只有文字恢复了出来,图片木有了~~
写得不错,鼓励下。
可以借鉴别人的破文帖子,把帖子整理的清晰一点,
这样别人浏览起来比较方便。 膜拜lz老师
老师要是使用code代码就更加漂亮了~ 这个应该是赋值和F12暂停法的应用吧?感谢分享 膜拜楼主 呵呵!不错哦!学习了! Chief 发表于 2012-7-8 15:26 static/image/common/back.gif
写得不错,鼓励下。
可以借鉴别人的破文帖子,把帖子整理的清晰一点,
这样别人浏览起来比较方便。
谢谢~这是我第一次写帖子,自己都觉得有点乱…{:17_1074:} Kido 发表于 2012-7-8 15:28 static/image/common/back.gif
膜拜lz老师
老师要是使用code代码就更加漂亮了~
{:301_997:}我也不是老湿,也是个新手,加入52PoJie就是为了提高自己,帮助他人。共同进步{:301_984:} 帖子写的不错
高亮一天以示鼓励
希望多出一些精品文章
吾爱破解论坛有您更精彩 Sound 发表于 2012-7-8 21:45 static/image/common/back.gif
帖子写的不错
高亮一天以示鼓励
希望多出一些精品文章
{:301_991:}感谢支持 分析的不错,只是在用语方面有不确切的地方。
页:
[1]
2