【文章标题】: 国内某个保护软件破解修复,大家注意蓝屏!
【文章作者】: 笨笨学脱壳
【作者邮箱】: Phantomnet@126.com
【作者QQ号】: 932410
【软件名称】: 某种原因,不做说明.
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: OllyICE、LoadPE、ImportREC
【操作平台】: Windows XP
【软件介绍】: 某单机游戏.
【作者声明】: 我只是以探讨的方式说一下,具体的情况就不说明了.比较罗嗦但是按我说的没问题.关键是多练多学:)
这里我就不说明是什么了,大家喜欢的就学一下,不喜欢的就看看捧个场,千万别再骂了,我被骂够了,去了一躺游侠网,被骂了...!
所以,今天想了想就发出来给大家学习一下!手段很平常也很简单,对于高手就看个乐呵!菜鸟我们一起研究撒.我这次就以旧版来做介绍.
给大家一个国庆节献礼!我在这里献丑了,我很笨很菜的.千万别笑我菜,要笑就回家乐去好吗?要不然我脸上会挂不住的.呵呵!
不废话了,动工......
[一].准备:
/-------------------------------------------------------
1.耐心
2.电脑会蓝的,别怕撒!
3.设置OD忽略所有异常.
4.准备个窗口工具,什么样的都可以的,为什么要窗口工具了?因为游戏嘛都是全屏幕的嘛!为什么是全屏幕呢?这个叫独占模式,撤远了不说了.
实在没有,自己挂个HOOK写个嘛!简单的很....
5.工具基本齐全,做好有个PE文件分析工具,如果没有exescope可以将凑!如果实在没有,自己写个.输入表,输出表可以用LoadPE,核对文件头最好
有个仔细全面的工具,如果觉得不会写,也没有那么只有用WinHex了,这个没就别破了,对了UE也可以的嘛!要这个做什么用呢?当然是拿它做PE头
修改.别说,这个不能修改哦!那我真的就晕厥了.
[二].破解方法一:
/--------------------------------------------------------
简单:
OD菜单->插件->获取RING0权限.
下断点Bp GetVersion
F9运行,断下来以后,CTRL+F9返回,往上看不就是OEP嘛!DUMP程序,修复....完成!结束走人.
这个就完工了,当然如果你有这样的插件就这么简单的完工了,可是有吗?我们没有,我也懒的写那个破玩意.那就没办法了吗?有啊,怎么会
没有了,对付它办法多的是,看就是想用不想用.
[三].破解方法二:
/-------------------------------------------------------------
我已经发过类似的蓝屏的原因,我就不做解释了.很笨的办法往往是最有效的.事物本身很难,但往往却能很简单解决!来看看吧!
一:运行游戏,使用窗口工具窗口化!我们好DUMP程序.
二:用LOADPE把程序DUMP出来.
三:"广告后回来!",不好意思,我一边做一边写,刚才蓝屏了,打的字都丢了.前面说的那里了?对了我们要修复dumpad.exe就是我们DUMP出的程序!
怎么修复呢?很简单,直接用ImportRec修复.点自动查找IAT,获取输入表...很多朋友说:傻瓜都知道这个OEP不是正确的,我当然知道了.还没完呢!
四:这里要注意了...一定要注意了!!!!!,在OD之前必须把虚拟光驱里的东东拿出来,或者光盘里的游戏盘拿出来不然蓝了可就是和刚才的我一样了:)
OD载入dumpad_.exe也就是ImportRec修复的程序.某保护软件的检测出现!我们做的是要证实有模块载入...
五:我们按步鄹慢慢来,先关闭OD,按如下步鄹:
打开LoadPE->PE编辑器->选择我们修复的dumpad_.exe->目录(如图1)->输入表编辑(就是输入表后面的"...",如图2)->选择pal3a.dll->右键菜单->删除镜像导入描述符
图一:
图二:
保存退出:)
六:OD重新载入dumpad_.exe,提示什么不是WIN32程序,不管它...很正常!到如下地方:
/------------------------------------------------------------------
0229A000 > 68 586FA772 push 72A76F58
0229A005 - FF25 14A12902 jmp dword ptr [229A114]
/------------------------------------------------------------------
很多朋友说,好眼熟的东西,也!难道,你看我写的某篇破文??
七:不管它是什么,直接点菜单->内存,到如图3的地方:
八:直接OD右键菜单->转到->表达式,填:00401000,通常代码段的地方.如果想知道我是怎么知道的,那就多翻翻资料哦!
这个涉及到内存管理,我就不说了,我们这个文章主要说是让大家怎么破这个程序.发现如下:
/------------------------------------------------------------------------
00401000 /$ 56 push esi
00401001 |. 8BF1 mov esi, ecx
00401003 |. 6A 08 push 8
00401005 |. 6A 01 push 1
00401007 |. C706 30865500 mov dword ptr [esi], 00558630
0040100D |. E8 46F31300 call 00540358
00401012 |. 8946 10 mov dword ptr [esi+10], eax
00401015 |. 33C0 xor eax, eax
00401017 |. 59 pop ecx
00401018 |. 8946 04 mov dword ptr [esi+4], eax
0040101B |. 8946 08 mov dword ptr [esi+8], eax
0040101E |. 8946 0C mov dword ptr [esi+C], eax
00401021 |. 59 pop ecx
00401022 |. 8BC6 mov eax, esi
00401024 |. 5E pop esi
00401025 \. C3 retn
/------------------------------------------------------------------------
这个是说明了什么,它说明很简单就是代码已经解密了.
九:右键菜单->查找->所有模块间调用,哈哈如图4,如果不是,那就是操作失误:
十:最麻烦的一步,我要给大家一个惯例,写过VC的人都知道VC6模式程序的WinMain函数的入口特征.更应该知道一个我们很有用的东西哦!编译器编译的时候,程序入口也就是OEP一般都在下面,而代码都是在上面.这个没注意的人,也许太多了吧!
我们现在就把OEP抓出来,看看我怎么抓:)将"找到的模块间的调用"窗口的滚动条划到最开始!查找CreateWindows函数(真希望那个朋友写个查找API的插件,我比较懒嘻嘻!还喜欢现成的!).如果没找到就好了呵呵:).可是我们找到了这个玩意!
如图5:
十一:这个能说明什么?写过程序的一看就明白,多半消息处理函数都是在WinMain函数里的,找到它也就能找到我们的OEP了
不信我们就验证一下!
/------------------------------------------------------------------------------------------
//消息函数在这里:
00525374 |> /53 push ebx ; /RemoveMsg
00525375 |. |57 push edi ; |MsgFilterMax
00525376 |. |57 push edi ; |MsgFilterMin
00525377 |. |8D45 E0 lea eax, dword ptr [ebp-20] ; |
0052537A |. |57 push edi ; |hWnd
0052537B |. |50 push eax ; |pMsg
0052537C |. |FF15 74815500 call dword ptr [558174] ; \PeekMessageA
//往上看,到函数入口处:
005252EA /$ 55 push ebp
005252EB |. 8BEC mov ebp, esp
005252ED |. 83EC 20 sub esp, 20
005252F0 |. 57 push edi
//右键菜单->转到->CALL 来自 XXXXXXXX(我们随便点了第一个,保证有一个就能到OEP.).到下面:
00406C15 |. 6A 01 push 1 ; /Arg1 = 00000001
00406C17 |. 8BCE mov ecx, esi ; |
00406C19 |. E8 CCE61100 call 005252EA ; \dumped_.005252EA
//往上翻到函数入口:
0040674C /$ B8 64E75400 mov eax, 0054E764
00406751 |. E8 0AA31300 call 00540A60
//同上的方法,我们到:
0052B9D8 |. E8 6FADEDFF call 0040674C
0052B9DD |. 59 pop ecx
0052B9DE |. FF15 08855500 call dword ptr [558508] ; gbengine.gbUpdateCurTime
//往上看,发现插入CD4的提示!不是我们在程序初始化阶段吗?哈哈..离OEP不远了:
0052B971 |. 68 A8456000 push 006045A8 ; ASCII "Please Insert Disc4 to Dirver %c:"
//在看到如下代码,已经放心了,这里就是主程序,上一个调用就是WinMain也就是OEP,不相信就看看,这个是查找窗口的程序,意思就
是不要有两个游戏重复运行!!!:
0052B8B5 /$ 55 push ebp
0052B8B6 |. 8BEC mov ebp, esp
0052B8B8 |. 81EC 68020000 sub esp, 268
0052B8BE |. 53 push ebx
0052B8BF |. 56 push esi
0052B8C0 |. B8 A0525700 mov eax, 005752A0 ; ASCII "PAL3A--SOFTSTAR.sh"
0052B8C5 |. 57 push edi
0052B8C6 |. 50 push eax ; /Title => "PAL3A--SOFTSTAR.sh"
0052B8C7 |. 50 push eax ; |Class => "PAL3A--SOFTSTAR.sh"
0052B8C8 |. FF15 48815500 call dword ptr [558148] ; \FindWindowA
0052B8CE |. 8BF0 mov esi, eax
0052B8D0 |. 56 push esi
0052B8D1 |. FF15 6C815500 call dword ptr [55816C]
0052B8D7 |. 85C0 test eax, eax
0052B8D9 |. 74 10 je short 0052B8EB
0052B8DB |. 6A 01 push 1 ; /ShowState = SW_SHOWNORMAL
0052B8DD |. 56 push esi ; |hWnd
0052B8DE |. FF15 B0815500 call dword ptr [5581B0] ; \ShowWindow
0052B8E4 |> 33C0 xor eax, eax
0052B8E6 |. E9 C1010000 jmp 0052BAAC
//同上一下到了下面的地方,眼睛放亮了,再往上看看吧!我们的OEP不就是这里吗?呵呵!!!:
005431B9 |> \6A 0A push 0A
005431BB |. 58 pop eax
005431BC |> 50 push eax ; /Arg4
005431BD |. FF75 9C push dword ptr [ebp-64] ; |Arg3
005431C0 |. 56 push esi ; |Arg2
005431C1 |. 56 push esi ; |/pModule
005431C2 |. FF15 3C805500 call dword ptr [55803C] ; |\GetModuleHandleA
005431C8 |. 50 push eax ; |Arg1
005431C9 |. E8 E786FEFF call 0052B8B5 ; \dumped_.0052B8B5
//把OEP抓下面:
00543100 /. 55 push ebp
00543101 |. 8BEC mov ebp, esp
00543103 |. 6A FF push -1
00543105 |. 68 D0185600 push 005618D0
0054310A |. 68 54385400 push 00543854 ; SE 处理程序安装
0054310F |. 64:A1 0000000>mov eax, dword ptr fs:[0]
00543115 |. 50 push eax
00543116 |. 64:8925 00000>mov dword ptr fs:[0], esp
0054311D |. 83EC 58 sub esp, 58
00543120 |. 53 push ebx
00543121 |. 56 push esi
00543122 |. 57 push edi
00543123 |. 8965 E8 mov dword ptr [ebp-18], esp
00543126 |. FF15 B4805500 call dword ptr [5580B4] ; kernel32.GetVersion
睡了...夜深了..明天续.....!
天亮了起迟了,让大家久等了...!我们继续...!
/--------------------------------------------------------
十二:窗口化游戏,大家也许会问为什么!比较重要如果觉得不太重要那就手动修复了:)
打开ImportRec,OEP处填:00543100-00400000=00143100
看到RVA项为:00158000,大小060C.这个重要吗?当然了,我们会用的着的:),修复一下文件.提示IAT部分无效,需要手动修复
不管它...!(需要说明的是这次修复是在前一次修复好的文件上再修复.这样才能让API比较全的修复,剩下的就是被替换的API)
十三:将修复完以后的文件,拿OD载入看看,现在已经在OEP了,基本上脱壳正确了,现在我们来处理一下这个文件.
打开LOADPE->PE编辑器->目录,做如下图修改:
十四:看看我们的程序已经,是不报错了!也能看到区段都不混在一起了!现在正常了,可是个头这么大怎么办呢!
[四] 破解后的修复:
/-------------------------------------------------------
这个工作是特别要有耐心的我先就不具体说了,只是把重要的地方说一下:
1.确定代码段的大小,如果这会没有exescope那么就拿Winhex就是了,需要注意的是这里打开的是原来的文件,也就是没破的,如图:
2.资源段的修复,可能因为重建PE啊!什么的突然发现,程序图标不见了,那就证明资源段部分出了问题,我们就拿Winhex打开文件
往下看找到这里,在.rsrc里放的就是资源,如图标,窗口等:
/------------------------------------------------------------------------------
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000260 2E 52 53 52 43 00 00 00 3C 13 00 00 00 40 E9 01 .RSRC...<....@?
00000270 3C 13 00 00 00 40 E9 01 00 00 00 00 00 00 00 00 <....@?........
00000280 00 00 00 00 40 00 00 C0 ....@..
/--------------------------------------------------------------------------------
//我们把16进制整理如下,看一下就一目了然:
2E52535243000000 ;段名8个字节
3C130000 ;虚拟大小
0040E901 ;虚拟地址
3C130000 ;物理大小
0040E901 ;物理地址
00000000 ;指向重定位
00000000 ;指向行数
0000 ;重定位号
0000 ;行数号
400000C0 ;区段特征
//好我们就去,01e94000的地方看看资源段,然后往下翻到如图的地方.
需要注意的是,如果发现这里的地址超出了文件大小,那还是修正一下吧!
3.我们对API的修复有两种方法:一就是DUMP区段,然后修复进去,二就是直接修复.方法我就不说了,大家试试看吧!这样可以说这个
保护软件已经没什么作为了.不过新版的比这个要好DUMP程序,但是在修复上加了难度,我又不喜欢补区段的修复,只有自己重组
文件,重新修复.替换掉的代码我是自己补进去的.旧版反而好搞许多,就是蓝屏吓坏了不少人:)
4.CALL调用和JE等跳转我已经说过了方法了,大家都学习哈!如果那天心情好再发了!
[五]结束语
/--------------------------------------------------------------------------------
这个壳脱起来不难,就是麻烦,也许我还没找到更简单的方法!如果谁知道就告诉一下.我真的想了好几天,都是很罗嗦,而又
简单的办法,也许我比较笨点,呵呵!本来想说的详细点,没心情打字了,大家就多试试,希望那位高手指点一二.我感激....再感激!.....
-By EasyStudy For PhantomNet
2007 9. 28
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
上传的附件: