【文章标题】: 破解福昕阅读器(申请邀请码)
【文章作者】: 独头蒜
【作者邮箱】: 1025738353@qq.com
【作者QQ号】: 1025738353
【软件名称】: 福昕阅读器
【下载地址】: 自己搜索下载
【保护方式】: 无
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: OD IDA
【操作平台】: winxp sp3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
大家好,我是独头蒜
今天呢,我来破解一个程序:福昕阅读器 ,顺便申请一下论坛的邀请码。
我们今天用到2个工具,OD 和IDA
OD 最强大的32位汇编级动态调试工具
IDA 最强大的静态反汇编工具
第一步:踩点
我们先运行这个程序,了解一下程序。
成果:输入错误的时候,出现错误的对话框。
“对不起,您输入的密码不正确”
有些朋友或许说,我们直接用od查找相应的字符串就可以了,可是呢,我们不能找到。
这个字符串,怎么办?~~~~(>_<)~~~~
不要着急,我们还有办法
我们用OD载入这个程序,注册,随便输入,当它出现错误信息的时候,我们先不要点击确定,按F12
,让程序断下来。
7C92E4F4 > C3 retn
7C92E4F5 8DA424 00000000 lea esp, dword ptr [esp]
7C92E4FC 8D6424 00 lea esp, dword ptr [esp]
7C92E500 > 8D5424 08 lea edx, dword ptr [esp+8]
7C92E504 CD 2E int 2E
7C92E506 C3 retn
7C92E507 90 nop
7C92E508 > 55 push ebp
7C92E509 8BEC mov ebp, esp
7C92E50B 9C pushfd
程序自然的断到了这里,这里是系统的函数,我们返回,让他到程序的领空。
然后呢,出现了错误对话框,我们点击确定
00870412 |> \53 push ebx ; /Style
00870413 |. 57 push edi ; |Title
00870414 |. FF75 08 push dword ptr [ebp+8] ; |Text
00870417 |. FF75 F4 push dword ptr [ebp-C] ; |hOwner
0087041A |. FF15 F0A6A900 call dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA (错误信息)
00870420 |. 85F6 test esi, esi ; Foxit_Re.00A755D4
00870422 |. 8BF8 mov edi, eax
00870424 |. 74 05 je short 0087042B
00870426 |. 8B45 F8 mov eax, dword ptr [ebp-8]
00870429 |. 8906 mov dword ptr [esi], eax
0087042B |> 837D FC 00 cmp dword ptr [ebp-4], 0
0087042F |. 74 0B je short 0087043C
00870431 |. 6A 01 push 1 ; /Enable = TRUE
00870433 |. FF75 FC push dword ptr [ebp-4] ; |hWnd
恩,到达程序的领空了,可是呢 这里还是在程序错误的内部函数里面, 我们还要走几次返回
返回几次后,我们来到了比较关键的代码处。
004971F1 . 52 push edx
004971F2 . 899C24 B80500>mov dword ptr [esp+5B8], ebx
004971F9 . E8 D1CD0100 call 004B3FCF
004971FE . 83C4 24 add esp, 24
00497201 . 3BC7 cmp eax, edi
00497203 . 75 36 jnz short 0049723B
00497205 . 8D4424 10 lea eax, dword ptr [esp+10]
00497209 . 68 12F20000 push 0F212
0049720E . 50 push eax
0049720F . E8 FC5EF7FF call 0040D110
00497214 . 83C4 08 add esp, 8
00497217 . 8B00 mov eax, dword ptr [eax]
00497219 . 6A 00 push 0
0049721B . 6A 00 push 0
0049721D . 50 push eax
0049721E . C68424 A00500>mov byte ptr [esp+5A0], 0B
00497226 . E8 24923D00 call 0087044F
0049722B . 889C24 940500>mov byte ptr [esp+594], bl
00497232 . 8D4C24 10 lea ecx, dword ptr [esp+10]
00497236 . E9 FA020000 jmp 00497535
0049723B > B9 10000000 mov ecx, 10
00497240 . 33C0 xor eax, eax
00497242 . 8D7C24 24 lea edi, dword ptr [esp+24]
00497246 . 8D9424 040100>lea edx, dword ptr [esp+104]
0049724D . F3:AB rep stos dword ptr es:[edi]
0049724F . B9 40000000 mov ecx, 40
00497254 . 8DBC24 840200>lea edi, dword ptr [esp+284]
0049725B . F3:AB rep stos dword ptr es:[edi]
0049725D . B9 20000000 mov ecx, 20
00497262 . 8DBC24 040200>lea edi, dword ptr [esp+204]
00497269 . F3:AB rep stos dword ptr es:[edi]
0049726B . B9 10000000 mov ecx, 10
00497270 . 8D7C24 64 lea edi, dword ptr [esp+64]
00497274 . F3:AB rep stos dword ptr es:[edi]
00497276 . B9 40000000 mov ecx, 40
0049727B . 8DBC24 840300>lea edi, dword ptr [esp+384]
00497282 . F3:AB rep stos dword ptr es:[edi]
00497284 . B9 20000000 mov ecx, 20
00497289 . 8DBC24 040100>lea edi, dword ptr [esp+104]
00497290 . F3:AB rep stos dword ptr es:[edi]
00497292 . B9 20000000 mov ecx, 20
00497297 . 8DBC24 840100>lea edi, dword ptr [esp+184]
0049729E . F3:AB rep stos dword ptr es:[edi]
004972A0 . 8D8C24 840100>lea ecx, dword ptr [esp+184]
004972A7 . 8D8424 840300>lea eax, dword ptr [esp+384]
004972AE . 51 push ecx
004972AF . 52 push edx
004972B0 . 8D4C24 6C lea ecx, dword ptr [esp+6C]
004972B4 . 50 push eax
004972B5 . 8D9424 900200>lea edx, dword ptr [esp+290]
004972BC . 51 push ecx
004972BD . 8D4424 34 lea eax, dword ptr [esp+34]
004972C1 . 52 push edx
004972C2 . 8D8C24 180200>lea ecx, dword ptr [esp+218]
004972C9 . 50 push eax
004972CA . 51 push ecx
004972CB . 68 1C679F00 push 009F671C ; ASCII "FRP"
004972D0 . 6A 00 push 0
004972D2 . E8 D9380300 call 004CABB0
004972D7 . 83C4 24 add esp, 24
004972DA . A3 887BA700 mov dword ptr [A77B88], eax
004972DF . 85C0 test eax, eax
004972E1 . 75 62 jnz short 00497345 ; 关注(如果不跳,就成功啦)
004972E3 . 8D5424 10 lea edx, dword ptr [esp+10]
004972E7 . 68 80080000 push 880
004972EC . 52 push edx
004972ED . E8 1E5EF7FF call 0040D110
004972F2 . 83C4 08 add esp, 8
004972F5 . 8B00 mov eax, dword ptr [eax]
004972F7 . 6A 00 push 0
004972F9 . 6A 00 push 0
004972FB . 50 push eax
004972FC . C68424 A00500>mov byte ptr [esp+5A0], 0C
00497304 . E8 46913D00 call 0087044F ; 注册部分
00497309 . 8D4C24 10 lea ecx, dword ptr [esp+10]
0049730D . 889C24 940500>mov byte ptr [esp+594], bl
00497314 . E8 B2EC3C00 call 00865FCB
00497319 . 8B4424 14 mov eax, dword ptr [esp+14]
0049731D . 50 push eax ; /FileName
0049731E . FF15 30A3A900 call dword ptr [<&KERNEL32.DeleteFile>; \DeleteFileA
00497324 . 8D4C24 18 lea ecx, dword ptr [esp+18]
00497328 . C68424 940500>mov byte ptr [esp+594], 1
00497330 . E8 96EC3C00 call 00865FCB
00497335 . C78424 940500>mov dword ptr [esp+594], -1
00497340 . E9 0D020000 jmp 00497552
00497345 > BE 10679F00 mov esi, 009F6710 ; ASCII "2008/01/01"
0049734A . 8D8424 840100>lea eax, dword ptr [esp+184]
00497351 > 8A10 mov dl, byte ptr [eax]
00497353 . 8ACA mov cl, dl
00497355 . 3A16 cmp dl, byte ptr [esi]
00497357 . 75 1D jnz short 00497376 ; 是否为新版本
00497359 . 84C9 test cl, cl
0049735B . 74 12 je short 0049736F
0049735D . 8A50 01 mov dl, byte ptr [eax+1]
00497360 . 8ACA mov cl, dl
有和我一样的菜鸟或许说,这么复杂我们怎么分析呢?
这么多关键跳转,我们怎么知道那个是关键跳呢?这里我们就要用强大的IDA去分析了
当然也需要一些灵感和经验咯
好,我们用IDA载入后 查找关键地址 004972E1 00497304 00497357
其实主要也就是这3个地址,其中有2个是跳转,IDA有一个强大的功能:可以显示程序的逻辑线路图,我们根据程序逻辑线路图很容易可以熟悉程序的编写思路
在这里我们稍微分析一下,就可以找到关键的call咯
我已经把分析后的结果以注释的形式写到上面了,很显然,004972E1 这里就是最关键的跳转
如果这个跳转不能实现,那么程序就显示注册失败!!!
我们改了这个跳转再试试看。
咦?改了以后怎么还不行呢?显示我是在2008年1月1日之前购买的,
切!不行!! 我要搞定它,
我们继续往下看 发现00497357这个跳转(为了更方便,一定要用IDA咯)
恩,把这里改了以后,就可以成功注册了
如果改了497478这个地址, 则显示为成功注册零时注册码
今天就到这里,(*^__^*) 嘻嘻……
--------------------------------------------------------------------------------
【版权声明】: 只适合学习之用,不要用于非法用途,否则后果自负!!
2010年03月30日 12:39:10
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课