吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 22227|回复: 16
收起左侧

[原创] 吾爱破解脱壳练习-----MoleBox V2.6.5

 关闭 [复制链接]
小生我怕怕 发表于 2008-10-5 00:20
由于前次脱壳练习失利,我们测试失败的原因,特决定提前取消第七次脱壳练习,开展第八次脱壳练习,对次深感抱歉


一转眼我们的脱壳练习已经第8期啦,在这其中我相信许多的朋友也学习到了东西
必能脱掉此壳
本期考核主题为:MoleBox V2.6.5
1.脱壳后的文件大家以千脑形式上传,目的是为了便于隐藏文件和节约论坛空间
2.脱壳后的文件,请大家以脱文附带脱壳后程序打包压缩传于千脑网盘
3.对于回帖过程中千万不要出现灌水,否则BAN了ID
4.对于有优秀脱文或优秀脱壳方法的朋友,给于适当威望奖励
5.鉴于此练习是针对论坛的所有人,请大家踊跃参加,如果不是脱了壳教作业的,请不要顶帖子,方便管理查阅,及时给出评分
6.以下为需要设置威望的格式
7.脱壳一以周期计算,(周期=等于二天)
8.脱壳周期一结束,就开始公布答案让大家能有更充分的学习环境,让不懂脱的朋友去寻找你失误的地方争取早日赶上论坛的积极份子
9.我们要的是脱文,并不是脱壳机去脱的,如果用脱机脱了别拿来,请一定附带上脱文
10.我们讲对每次脱壳练习选择一个最好的脱壳分析过程,方便大家学习,每次脱壳练习结束后会说出楼数,对于被选种的朋友,我们会酌情给予CB或者威望进行奖励

11.对本次参加加密壳脱壳练习的,给出脱文全部给予5CB奖励,能分析出IAT加密所在,不使用importRCE等修复工具的给10CB


鉴于脱壳练习发展的趋势良好,观察了下载量,的确有明显的增长,证明很多的坛友
是怀着对脱壳破解的热爱的,所以经过管理组商议,由3天进行一次的脱壳练习,改成每两天一次的脱壳练习,有助于大家对
技巧的熟练,脱壳练习是经过了我们多翻难度测试,才发布出来,所以希望大家好好珍惜如此好好时机学习,不怕你不懂,就怕你不学


在一次申明:对于不是交作业顶帖的人,一律扣处10CB,严重的扣处威望处理,请大家自觉,保持良好的学习环境

练习一:(结果已经公布)
http://www.52pojie.cn/thread-10496-1-1.html
最佳分析:第10楼unpack

练习二:(结果已经公布)
http://www.52pojie.cn/thread-10607-1-1.html
最佳分析:第9楼lqiulu

练习三:(结果已经公布)
http://www.52pojie.cn/thread-10688-1-1.html
最佳分析:第11楼傻人有傻福

练习四:(结果已经公布)
http://www.52pojie.cn/thread-10850-1-1.html
最佳分析:第11楼维护世界和平

练习五:(结果已经公布)
http://www.52pojie.cn/thread-10990-1-1.html
最佳分析:第3楼维护世界和平

练习六:(结果已经公布)
http://www.52pojie.cn/thread-11112-1-1.html
最佳分析:第12楼ximo

练习七:(结果已经公布)
http://www.52pojie.cn/thread-11244-1-1.html
最佳分析:第14楼傻人有傻福

UnPackMe第8期.rar

239 KB, 下载次数: 1070, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 1热心值 +1 收起 理由
min-gong + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wgz001 发表于 2008-10-5 14:42
到达OEP用ESP 先找到加密IAT 的关键跳转
00470F2F85D2TEST EDX,EDX
00470F3174 17 JE SHORT UnPackMe.00470F4A ; 不跳就加密IAT

(先在00470f31处下硬件断点,重新载入程序)将JE改成JUMP然后到OEP直接用OD插件DUMP 就可以了不用修复

呵呵[s:40]

个人思路,不对之处还请多多指教
**************************************************************************************************************************************************

上面是在公司里搞的 太匆忙了 老板来了 赶紧逃跑啊所以没怎么具体下面重新写过:

1.到达OEP
就用最常用的ESP吧
首先OD载入程序,或略所有异常,单步F8两次,来到这里

00469BD9E8 4F000000 call UnPackMe.00469C2D

此时ESP=0012FFA0数据窗口中跟随,选中“ 08 02 93 7C” 右键 --->断点------>硬件访问断点------>选择word
接下来F9运行程序,来到这里

004697B158pop eax; UnPackMe.00469BD8
004697B258pop eax
004697B3FFD0call eax
004697B5E8 F5CB0000 call UnPackMe.004763AF

接下来单步F8,走到CALLEAX后F7跟进,来到这里

0045159C55push ebp
0045159D8BECmov ebp,esp
0045159F83C4 F0 add esp,-10
004515A2B8 BC134500 mov eax,UnPackMe.004513BC
004515A7E8 8846FBFF call UnPackMe.00405C34
004515ACA1 E02F4500 mov eax,dword ptr ds:[452FE0]

传说中的OEP了,用常规方法DUMP ,修复,结果无法运行,[s:17]

那用刚学的方法试试,来到第二步了。

2.修复IAT

CTRL+B 搜索FF25 可以看到下面的函数

004011F4- FF25 B0514500 jmp dword ptr ds:[4551B0]; kernel32.GetStdHandle
004011FA8BC0mov eax,eax
004011FC- FF25 AC514500 jmp dword ptr ds:[4551AC]; kernel32.RaiseException

在命令栏中输入 DD 004551B0就可以看到函数了吧

004551B07C812FC9offset kernel32.GetStdHandle
004551B400000000
004551B877D311DBoffset USER32.GetKeyboardType
004551BC77D2C908offset USER32.LoadStringA
004551C077D507EAoffset USER32.MessageBoxA
004551C477D2C8B0offset USER32.CharNextA

向上翻页 就可以看到一部分函数被加密了

0045516C7C8101A1offset kernel32.lstrcpynA
0045517000477189UnPackMe.00477189
004551747C80A4A5offset kernel32.GetThreadLocale
004551787C801EF2offset kernel32.GetStartupInfoA
0045517C00477369UnPackMe.00477369
004551800047727FUnPackMe.0047727F
0045518400476D17UnPackMe.00476D17
004551887C80D2F2offset kernel32.GetLocaleInfoA
0045518C7C812FADoffset kernel32.GetCommandLineA
0045519000477480UnPackMe.00477480
0045519400476627UnPackMe.00476627
00455198004768F2UnPackMe.004768F2
0045519C004763BBUnPackMe.004763BB
004551A07C810E17offset kernel32.WriteFile

00455170,0045517c,00255180,00455184,==都被加密了,下面来跳过去(修复也可以)

在这里下硬件访问断点

004551687C80BE46offset kernel32.lstrlenA

同时在OEP处下硬件执行断点,CTRL+F2重新载入程序,直接F9运行程序,几次F9后来到这里

00470E99 /0F84 B0000000 je UnPackMe.00470F4F
00470E9F |8B55 F4 mov edx,dword ptr ss:[ebp-C]
00470EA2 |833A 00 cmp dword ptr ds:[edx],0
00470EA5 |0F84 A4000000 je UnPackMe.00470F4F

此时在命令栏中输入 DD00455168 并注意看数据窗中的变化

当单步F8走到这里
00470EF68901mov dword ptr ds:[ecx],eax

数据窗中显示下面的东东
004551687C80BE46kernel32.lstrlenA

继续单步F8 来到这里

00470F31 /74 17 je short UnPackMe.00470F4A ; IAT加密处理关键跳

注意这个跳转,比较关键,继续单步F8到这里

00470F42E8 D9060000 call UnPackMe.00471620 ; IAT加密处理CALL

这个CALL也是关键,F7进去看看

0047162055push ebp
004716218BECmov ebp,esp
0047162383EC 10 sub esp,10
00471626C745 FC 0000000>mov dword ptr ss:[ebp-4],0
0047162D833D 5C214800 0>cmp dword ptr ds:[48215C],0
0047163475 0A jnz short UnPackMe.00471640
00471636B9 0A0000EF mov ecx,EF00000A

F8走到这里

00471658 /74 45 je short UnPackMe.0047169F

看这个常常的跳转,接下里F8到这里

00470E818B55 E0 mov edx,dword ptr ss:[ebp-20]; IAT处理

走到这里 ,寄存器中出现下一个将要处理的函数(0045516c)

00470E908945 F4 mov dword ptr ss:[ebp-C],eax ; UnPackMe.0045516C


继续单步F8来到这里

00470F31 /74 17 je short UnPackMe.00470F4A ; IAT加密处理关键跳

又要去处理IAT函数了,那么想办法让这个跳了就可以了,在上面下硬件访问断点
重新运行程序,直接F9运行程序,来到刚才下断点的地方

00470F31 /74 17 je short UnPackMe.00470F4A ; IAT加密处理关键跳

将JE 改成JUMP就跳过IAT加密了,F9运行程序,来到这里

004697B158pop eax; UnPackMe.00469BD8
004697B258pop eax
004697B3FFD0call eax
004697B5E8 F5CB0000 call UnPackMe.004763AF
004697BACCint3

到CALL EAX后F7跟进又来到了OEP

0045159C55push ebp
0045159D8BECmov ebp,esp
0045159F83C4 F0 add esp,-10
004515A2B8 BC134500 mov eax,UnPackMe.004513BC
004515A7E8 8846FBFF call UnPackMe.00405C34

此时可以用OD的插件直接DUMP就可以了,程序运行正常,[s:40]


个人思路,不对之处还请多多指教!!!

共同进步哦!!!







1.rar
lqiulu 发表于 2008-10-5 01:16
OD载入停在这里。

00469BD3 >E8 00000000 CALLUnPackMe.00469BD8 //下断bp VirtualProtect
00469BD860PUSHAD//hr esp ESP定律
00469BD9E8 4F000000 CALLUnPackMe.00469C2D
00469BDE68 2E607CDC PUSHDC7C602E
00469BE341INC ECX
00469BE40ABF F0331EE0 ORBH, BYTE PTR DS:[EDI+E01E33F0]
00469BEACA 20F4 RETF0F420
00469BED34 02 XOR AL, 2
00469BEF2299 BD2A23DA AND BL, BYTE PTR DS:[ECX+DA232ABD]
00469BF5180ASBB BYTE PTR DS:[EDX], CL

F9运行断在VirtualProtect断点,运行看堆栈,出现executable时,取消断点,alt + F9返回程序,

----------------------------------------------------------------------------
ctrl + B “89 01”nop掉。或改jmp,处理IAT加密的
----------------------------------------------------------------------------

00471658 /74 45 JESHORT UnPackMe.0047169F //这里可以跳过IAT加密。改jmp。
0047165A|. |8D55 F0 LEA EDX, DWORD PTR SS:[EBP-10]
0047165D|. |52PUSHEDX; /pOldProtect
0047165E|. |6A 04 PUSH4; |NewProtect = PAGE_READWRITE
00471660|. |6A 04 PUSH4; |Size = 4
00471662|. |8B45 08 MOV EAX, DWORD PTR SS:[EBP+8]; |
00471665|. |50PUSHEAX; |Address
00471666|. |FF15 40D84700 CALLDWORD PTR DS:[47D840]; \VirtualProtect
0047166C|. |85C0TESTEAX, EAX
0047166E|. |75 0A JNZ SHORT UnPackMe.0047167A
00471670|. |B9 0B0000EF MOV ECX, EF00000B
00471675|. |E8 9D2F0000 CALLUnPackMe.00474617
0047167A|> |8B4D 08 MOV ECX, DWORD PTR SS:[EBP+8]
0047167D|. |8B55 F8 MOV EDX, DWORD PTR SS:[EBP-8]
00471680|. |8B02MOV EAX, DWORD PTR DS:[EDX]
00471682|. |8901MOV DWORD PTR DS:[ECX], EAX//加密iat。也可以nop掉。
00471684|. |8D4D F4 LEA ECX, DWORD PTR SS:[EBP-C]

=========================================================================
运行到这里时EAX=00477189 (UnPackMe.00477189)
DS:[00455170]=7C801D4F (kernel32.LoadLibraryExA)
将系统kernel32.LoadLibraryExA函数(加载dll等)用程序477189赋值,进行加密。nop掉不让替换。
=========================================================================
004716848D4D F4 LEA ECX, DWORD PTR SS:[EBP-C]
0047168751PUSHECX
004716888B55 F0 MOV EDX, DWORD PTR SS:[EBP-10]
0047168B52PUSHEDX
0047168C6A 04 PUSH4
0047168E8B45 08 MOV EAX, DWORD PTR SS:[EBP+8]
0047169150PUSHEAX
00471692FF15 40D84700 CALLDWORD PTR DS:[47D840]; kernel32.VirtualProtect
----------------------------------------------------------------------------------------------------
再次f9运行,断在硬件断点 esp定律的断点,来到这里:

004697B258POP EAX ; UnPackMe.0045159C
004697B3FFD0CALLEAX //这里跳向OEP.
004697B5E8 F5CB0000 CALLUnPackMe.004763AF
004697BACCINT3

=================================================================================================

0045159C55PUSHEBP// OEP
0045159D8BECMOV EBP, ESP
0045159F83C4 F0 ADD ESP, -10
004515A2B8 BC134500 MOV EAX, UnPackMe.004513BC
004515A7E8 8846FBFF CALLUnPackMe.00405C34
004515ACA1 E02F4500 MOV EAX, DWORD PTR DS:[452FE0]
004515B18B00MOV EAX, DWORD PTR DS:[EAX]
004515B3E8 F8E5FFFF CALLUnPackMe.0044FBB0
004515B8A1 E02F4500 MOV EAX, DWORD PTR DS:[452FE0]
004515BD8B00MOV EAX, DWORD PTR DS:[EAX]
004515BFBA FC154500 MOV EDX, UnPackMe.004515FC ; ASCII ".52pojie.cn"

DUMP后修复指针全部有效。不进行IAT的处理修复后不能运行。
 楼主| 小生我怕怕 发表于 2008-10-5 01:52
00469BD3 >E8 00000000 call UnPackMe.00469BD8//OD载入
00469BD860pushad//单步一步f8
00469BD9E8 4F000000 call UnPackMe.00469C2D//在此执行ESP定律 hr esp
00469BDE68 2E607CDC push DC7C602E //在设置好上面的硬件断点的同时下bp VirtualProtect
00469BE341inc ecx //紧跟着shift+f9
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801AD4 >8BFFmov edi,edi //程序停于此处
7C801AD655push ebp//ait+b取消断点
7C801AD78BECmov ebp,esp //断点取消后 ait+f9返回到用户代码
7C801AD9FF75 14 push dword ptr ss:[ebp+14]
━━━━━━━━━━━━━━━━━━━━━━━━━━
00471047C745 EC 0000000>mov dword ptr ss:[ebp-14],0 //程序停于此处
0047104EEB 09 jmp short UnPackMe.00471059 //此时开始处理我们的iat,寻找magic jump
004710508B55 EC mov edx,dword ptr ss:[ebp-14] //这里要感谢ximo兄的纠正,看天草教程把我迷糊啦
0047105383C2 01 add edx,1 //ctrl+b搜索二进制 8901
004710568955 EC mov dword ptr ss:[ebp-14],edx
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046B2728901mov dword ptr ds:[ecx],eax //程序停在此处,有朋友就会以为这里即加密IAT的地方
0046B274837D E0 00cmp dword ptr ss:[ebp-20],0//天草教程的方法到这里把他NOP掉即可
0046B27875 13 jnz short UnPackMe.0046B28D//其实不然,这里不行的,应该这里IAT没有加密的迹象
0046B27AFF35 00A54700 push dword ptr ds:[47A500] //ctrl+L搜索下一个8901
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046B3D18901mov dword ptr ds:[ecx],eax //来到这里,大家注意观察他上下的代码无加密指针的现象
0046B3D38B45 F0 mov eax,dword ptr ss:[ebp-10]//继续ctrl+L搜索下一个8901
0046B3D6EB 02 jmp short UnPackMe.0046B3DA
0046B3D833C0xor eax,eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046B7058901mov dword ptr ds:[ecx],eax//这里也同样没有处理
0046B7078B45 0C mov eax,dword ptr ss:[ebp+C]//继续ctrl+L搜索下一个8901
0046B70A8B4D BC mov ecx,dword ptr ss:[ebp-44]
0046B70D8B49 08 mov ecx,dword ptr ds:[ecx+8]
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046B9048901mov dword ptr ds:[ecx],eax//这里也同样没有处理
0046B9068B45 10 mov eax,dword ptr ss:[ebp+10] //继续ctrl+L搜索下一个8901
0046B9098338 00 cmp dword ptr ds:[eax],0
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046B9518901mov dword ptr ds:[ecx],eax//这里也同样没有处理
0046B9536A FF push -1 //继续ctrl+L搜索下一个8901
0046B955C745 D4 0100000>mov dword ptr ss:[ebp-2C],1
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046BDB78901mov dword ptr ds:[ecx],eax//这里也同样没有处理
0046BDB98B45 0C mov eax,dword ptr ss:[ebp+C]//继续ctrl+L搜索下一个8901
0046BDBC8338 00 cmp dword ptr ds:[eax],0
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046BFA18901mov dword ptr ds:[ecx],eax//这里也同样没有处理
0046BFA38B45 D8 mov eax,dword ptr ss:[ebp-28] //继续ctrl+L搜索下一个8901
0046BFA6FF70 04 push dword ptr ds:[eax+4]
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046C0F58901mov dword ptr ds:[ecx],eax//这里同样没有处理
0046C0F7FF75 08 push dword ptr ss:[ebp+8] //继续ctrl+L搜索下一个8901
0046C0FA8B0D 70D94700 mov ecx,dword ptr ds:[47D970]
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046C43E8901mov dword ptr ds:[ecx],eax//这里同样没有处理
0046C4408B45 0C mov eax,dword ptr ss:[ebp+C]//继续ctrl+L搜索下一个8901
0046C4438338 00 cmp dword ptr ds:[eax],0
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046C65E8901mov dword ptr ds:[ecx],eax//这里同样没有处理
0046C6606A FF push -1 //继续ctrl+L搜索下一个8901
0046C662C745 C8 0100000>mov dword ptr ss:[ebp-38],1
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046C87D8901mov dword ptr ds:[ecx],eax //这里同样没有处理
0046C87F6A FF push -1//继续ctrl+L搜索下一个8901
0046C881C745 D4 0100000>mov dword ptr ss:[ebp-2C],1
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046CA758901mov dword ptr ds:[ecx],eax//这里同样没有处理
0046CA778B45 0C mov eax,dword ptr ss:[ebp+C]//继续ctrl+L搜索下一个8901
0046CA7A8360 20 00and dword ptr ds:[eax+20],0
0046CA7E8B45 E0 mov eax,dword ptr ss:[ebp-20]
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046D3C78901mov dword ptr ds:[ecx],eax//这里同样没有处理
0046D3C96A FF push -1 //继续ctrl+L搜索下一个8901
0046D3CBC745 B8 0100000>mov dword ptr ss:[ebp-48],1
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046D9898901mov dword ptr ds:[ecx],eax //这里同样没有处理
0046D98B6A FF push -1//继续ctrl+L搜索下一个8901
0046D98D8B45 D0 mov eax,dword ptr ss:[ebp-30]
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046DA0E8901mov dword ptr ds:[ecx],eax//这里同样没有处理
0046DA10837D 0C 00cmp dword ptr ss:[ebp+C],0//继续ctrl+L搜索下一个8901
0046DA1474 08 je short UnPackMe.0046DA1E
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046DADC8901mov dword ptr ds:[ecx],eax //这里同样没有处理
0046DADEEB 72 jmp short UnPackMe.0046DB52//继续ctrl+L搜索下一个8901
0046DAE0A1 98D94700 mov eax,dword ptr ds:[47D998]
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046DB508901mov dword ptr ds:[ecx],eax //这里同样没有处理
0046DB526A 01 push 1 //继续ctrl+L搜索下一个8901
0046DB5458pop eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046E4BD66:8901 mov word ptr ds:[ecx],ax //这里同样没有处理
0046E4C08B45 FC mov eax,dword ptr ss:[ebp-4] //继续ctrl+L搜索下一个8901
0046E4C348dec eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046E5CA66:8901 mov word ptr ds:[ecx],ax //这里同样没有处理
0046E5CD8B45 FC mov eax,dword ptr ss:[ebp-4] //继续ctrl+L搜索下一个8901
0046E5D048dec eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046E6C566:8901 mov word ptr ds:[ecx],ax //这里同样没有处理
0046E6C88B45 FC mov eax,dword ptr ss:[ebp-4] //继续ctrl+L搜索下一个8901
0046E6CB48dec eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046EE3166:8901 mov word ptr ds:[ecx],ax //这里同样没有处理
0046EE348B45 F8 mov eax,dword ptr ss:[ebp-8] //继续ctrl+L搜索下一个8901
0046EE3740inc eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046EE4F66:8901 mov word ptr ds:[ecx],ax//这里同样没有处理
0046EE528B45 F8 mov eax,dword ptr ss:[ebp-8]//继续ctrl+L搜索下一个8901
0046EE5540inc eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046EE6D66:8901 mov word ptr ds:[ecx],ax //这里同样没有处理
0046EE708B45 F8 mov eax,dword ptr ss:[ebp-8] //继续ctrl+L搜索下一个8901
0046EE7340inc eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046EE8B66:8901 mov word ptr ds:[ecx],ax //这里同样没有处理
0046EE8E5Bpop ebx //继续ctrl+L搜索下一个8901
0046EE8FC9leave
━━━━━━━━━━━━━━━━━━━━━━━━━━
00470EF68901mov dword ptr ds:[ecx],eax //这里同样没有处理
00470EF8EB 2C jmp short UnPackMe.00470F26 //继续ctrl+L搜索下一个8901
00470EFA8B55 F4 mov edx,dword ptr ss:[ebp-C]
━━━━━━━━━━━━━━━━━━━━━━━━━━
0047162055push ebp //以下属于个人见解,高手不要见笑
004716218BECmov ebp,esp
0047162383EC 10 sub esp,10
00471626C745 FC 0000000>mov dword ptr ss:[ebp-4],0
0047162D833D 5C214800 0>cmp dword ptr ds:[48215C],0
0047163475 0A jnz short UnPackMe.00471640
00471636B9 0A0000EF mov ecx,EF00000A//这里即注入垃圾指令
0047163BE8 D72F0000 call UnPackMe.00474617
004716408B45 08 mov eax,dword ptr ss:[ebp+8]
004716438B08mov ecx,dword ptr ds:[eax]
0047164551push ecx
004716468B0D 5C214800 mov ecx,dword ptr ds:[48215C]
0047164CE8 13650000 call UnPackMe.00477B64
004716518945 F8 mov dword ptr ss:[ebp-8],eax
00471654837D F8 00cmp dword ptr ss:[ebp-8],0//判断执行注入
0047165874 45 je short UnPackMe.0047169F//跳走即不进行指针处理,即magic jump
0047165A8D55 F0 lea edx,dword ptr ss:[ebp-10] //把上面的je改jmp跳走就可以闭开加密指针
0047165D52push edx//改好magic jump后,大家应该还记得我们下的硬件段点吧
0047165E6A 04 push 4//我们shift+f9即可
004716606A 04 push 4
004716628B45 08 mov eax,dword ptr ss:[ebp+8]
0047166550push eax
00471666FF15 40D84700 call dword ptr ds:[47D840] ; kernel32.VirtualProtect
0047166C85C0test eax,eax
0047166E75 0A jnz short UnPackMe.0047167A
00471670B9 0B0000EF mov ecx,EF00000B //此句即向现在所在IAT进行加密
00471675E8 9D2F0000 call UnPackMe.00474617
0047167A8B4D 08 mov ecx,dword ptr ss:[ebp+8]
0047167D8B55 F8 mov edx,dword ptr ss:[ebp-8]
004716808B02mov eax,dword ptr ds:[edx]
004716828901mov dword ptr ds:[ecx],eax//这里应该是把垃圾指针放到某个位置,所以NOP掉这里也可以
━━━━━━━━━━━━━━━━━━━━━━━━━━
004697B158pop eax//程序停于此处
004697B258pop eax//取消硬件断点
004697B3FFD0call eax //f8单步到这里时,单步f7跟进,即到我们的OEP
004697B5E8 F5CB0000 call UnPackMe.004763AF
004697BACCint3
━━━━━━━━━━━━━━━━━━━━━━━━━━
0045159C55push ebp //我们的oep
0045159D8BECmov ebp,esp//直接运行我们的OD插件把程序dump
0045159F83C4 F0 add esp,-10//用OD插件dump即可不用修复
004515A2B8 BC134500 mov eax,UnPackMe.004513BC
004515A7E8 8846FBFF call UnPackMe.00405C34
004515ACA1 E02F4500 mov eax,dword ptr ds:[452FE0]
004515B18B00mov eax,dword ptr ds:[eax]
004515B3E8 F8E5FFFF call UnPackMe.0044FBB0

unpack.rar

197 KB, 下载次数: 21, 下载积分: 吾爱币 -1 CB

快乐先锋 发表于 2008-10-5 02:16
OD载入
00469BD3 >E8 00000000 call UnPackMe.00469BD8
00469BD860pushad//单步至此,使用ESP定律并且bp VirtualProtect,F9运行
00469BD9E8 4F000000 call UnPackMe.00469C2D
00469BDE68 2E607CDC push DC7C602E


观察堆栈

0012FD90 0047166C/CALL 到 VirtualProtect 来自 UnPackMe.00471666
0012FD94 00455170|Address = UnPackMe.00455170
0012FD98 00000004|Size = 4
0012FD9C 00000004|NewProtect = PAGE_READWRITE
0012FDA0 0012FDA4\pOldProtect = 0012FDA4
0012FDA4 00000000
0012FDA8 009A2104
0012FDAC 0047D378UnPackMe.0047D378
0012FDB0 00000000
0012FDB4/0012FE10
0012FDB8|00470F47返回到 UnPackMe.00470F47 来自 UnPackMe.00471620
0012FDBC|00455170UnPackMe.00455170
0012FDC0|0047CC9CASCII "EXECUTABLE" //直到出现这个,取消断点ALT+F9返回。
0012FDC4|00455728ASCII "kernel32.dll"


返回至
0047166C85C0test eax,eax
0047166E75 0A jnz short UnPackMe.0047167A
00471670B9 0B0000EF mov ecx,EF00000B
00471675E8 9D2F0000 call UnPackMe.00474617
0047167A8B4D 08 mov ecx,dword ptr ss:[ebp+8]
0047167D8B55 F8 mov edx,dword ptr ss:[ebp-8]
004716808B02mov eax,dword ptr ds:[edx]
004716828901mov dword ptr ds:[ecx],eax //NOP掉,F9一次
004716848D4D F4 lea ecx,dword ptr ss:[ebp-C]
0047168751push ecx

来到
004697B258pop eax; UnPackMe.0045159C
004697B3FFD0call eax //F7进去,就是OEP了。。。直接DUMP不需要修复。。
004697B5E8 F5CB0000 call UnPackMe.004763AF

完毕。。。第一次交作业,写的很烂。。。






作业.rar
 楼主| 小生我怕怕 发表于 2008-10-5 02:33
////////////////////////////////////////////////////////////////////////////////////////////////////// /// MoleBox V2.X -> MoleStudio.com/// /// by 小生我怕怕QQ:4586631/// /// 2008.10.05/// /////////////////////////////////////////////////////////////////////////////////////////////////////// var addr //定义一个变量,用来放ESP的值stosto//单步2次mov addr,esp //把ESP的值,放变量addr中bphws addr,"r" //下硬件访问断点gpa "VirtualProtect","kernel32.dll"//查找特征API,并把查找到的地址放RESULT中bp $RESULT //对找到的地址处,下F2断点,也就是BPrun//运行run//运行run//运行run//运行run//运行run//运行run//运行run//运行run//运行run//运行bc $RESULT //取消断点rtu//ALT+F9返回find eip,#8901#//查找特征加密语句bp $RESULT //对返回的地址处F2下断run//运行到该处bc $RESULT //取消断点repl eip, #8901#, #9090#, 10 //把加密语句NOP掉,即替换为9090run//由于刚才已经下好了硬件断点,现在只要运行即可bphwc addr //取消断点stosto//单步走2次sti//F7跟进,就来到了OEP了cmt eip,"友情提示:这里就是OEP!"//在EIP处,也就是现在OD停留了位置加注释MSG "感谢使用此脚本,现在可以脱壳了" //加个对话框,给出一些提示信息ret//结束脚本
fox2006 发表于 2008-10-5 02:58
吾爱专题脱壳练习8
--------------------------------------------------------------------------------
【编写程序】:Borland Delphi 6.0 - 7.0
【调试环境】:WinXP、OllyDbg、PEiD、LordPE、ImportREC
【程序查壳】:MoleBox V2.X -> MoleStudio.com
【脱壳方法】:避开IAT加密+ESP定律+内存镜像法
------------------------------------------------------------------------------------
00469BD3 >E8 00000000 call UnPackMe.00469BD8 ;OD载入,下断点bp VirtualProtect,F9运行10次,ALT+F9执行到用户代码
00469BD860pushad
00469BD9E8 4F000000 call UnPackMe.00469C2D
00469BDE68 2E607CDC push DC7C602E
00469BE341inc ecx
---------------------------------------------------------------------------------------------
00471658 /74 45 je short UnPackMe.0047169F 关键跳,如果满足条件跳过IAT加密,记下这个地址
0047165A |8D55 F0 lea edx,dword ptr ss:[ebp-10]
0047165D |52push edx
0047165E |6A 04 push 4
00471660 |6A 04 push 4
00471662 |8B45 08 mov eax,dword ptr ss:[ebp+8]
00471665 |50push eax
00471666 |FF15 40D84700 call dword ptr ds:[47D840] ; kernel32.VirtualProtect (如果执行这个CALL,则为可写属性)
0047166C |85C0test eax,eax ;ALT+F9返回到这里,分析一下上下两个kernel32.VirtualProtect
0047166E |75 0A jnz short UnPackMe.0047167A
00471670 |B9 0B0000EF mov ecx,EF00000B
00471675 |E8 9D2F0000 call UnPackMe.00474617
0047167A |8B4D 08 mov ecx,dword ptr ss:[ebp+8]
0047167D |8B55 F8 mov edx,dword ptr ss:[ebp-8]
00471680 |8B02mov eax,dword ptr ds:[edx]
00471682 |8901mov dword ptr ds:[ecx],eax
00471684 |8D4D F4 lea ecx,dword ptr ss:[ebp-C]
00471687 |51push ecx
00471688 |8B55 F0 mov edx,dword ptr ss:[ebp-10]
0047168B |52push edx
0047168C |6A 04 push 4
0047168E |8B45 08 mov eax,dword ptr ss:[ebp+8]
00471691 |50push eax
00471692 |FF15 40D84700 call dword ptr ds:[47D840] ; kernel32.VirtualProtect(如果执行这个CALL,则为可只读属性)
00471698 |C745 FC 0100000>mov dword ptr ss:[ebp-4],1
0047169F \8B45 FC mov eax,dword ptr ss:[ebp-4]
004716A28BE5mov esp,ebp
004716A45Dpop ebp
004716A5C3retn
-------------------------------------------------------------------------------------------------
重新开始
00469BD3 >E8 00000000 call UnPackMe.00469BD8 ;OD载入,下断点bp VirtualProtect,F9运行9次,Ctrl+G,00471658(之前关键跳的地址)
00469BD860pushad
00469BD9E8 4F000000 call UnPackMe.00469C2D
00469BDE68 2E607CDC push DC7C602E
00469BE341inc ecx
---------------------------------------------------------------------------------------------------------------------
00471658 /74 45 je short UnPackMe.0047169F;到达代码处je改成jmp,下hr 0012FFA0硬件断点(ESP定律),F9两次
0047165A |8D55 F0 lea edx,dword ptr ss:[ebp-10]
0047165D |52push edx
0047165E |6A 04 push 4
00471660 |6A 04 push 4
00471662 |8B45 08 mov eax,dword ptr ss:[ebp+8]
00471665 |50push eax
00471666 |FF15 40D84700 call dword ptr ds:[47D840] ; kernel32.VirtualProtect (如果执行这个CALL,则为可写属性)
---------------------------------------------------------------------------------------------
004697B158pop eax ; F9两次到这里,ALT+M,在00401000处下内存断点,F9
004697B258pop eax
004697B3FFD0call eax
004697B5E8 F5CB0000 call UnPackMe.004763AF
004697BACCint3
004697BBCCint3
004697BCCCint3
-----------------------------------------------------------------------------------------------
0045159C55push ebp ; 到达OEP,此时,IAT已没有加密,dump+修复
0045159D8BECmov ebp,esp
0045159F83C4 F0 add esp,-10
004515A2B8 BC134500 mov eax,UnPackMe.004513BC
004515A7E8 8846FBFF call UnPackMe.00405C34
004515ACA1 E02F4500 mov eax,dword ptr ds:[452FE0]
004515B18B00mov eax,dword ptr ds:[eax]
004515B3E8 F8E5FFFF call UnPackMe.0044FBB0

【脱壳总结】需要避开IAT加密,才能脱壳修复。




UnPackMe第8期
pcfans 发表于 2008-10-5 03:49
这时参加的第三期了,学到不少东西,在此谢谢大家


这期的脱壳过程:
OD载入

00469BD3 >E8 00000000 call00469BD8//载入后停在这里f8两次
00469BD860pushad
00469BD9E8 4F000000 call00469C2D
00469BDE68 2E607CDC pushDC7C602E//来到这里后用esp定律
00469BE341inc ecx
00469BE40ABF F0331EE0 orbh, byte ptr [edi+E01E33F0]
00469BEACA 20F4 retf0F420
----------------------------------
004697B158pop eax //esp定律来到这里f8单步
004697B258pop eax
004697B3FFD0calleax//跳向OEP
004697B5E8 F5CB0000 call004763AF
----------------------------------
0045159C55pushebp //OEP地址
0045159D8BECmov ebp, esp
0045159F83C4 F0 add esp, -10
004515A2B8 BC134500 mov eax, 004513BC
004515A7E8 8846FBFF call00405C34
004515ACA1 E02F4500 mov eax, dword ptr [452FE0]
004515B18B00mov eax, dword ptr [eax]
004515B3E8 F8E5FFFF call0044FBB0
----------------------------------
修复过程:
LoadPE脱壳,ImportREC修复,出现18个无效指针,等级1可以完全修复,修复后抓取程序无法运行,只好考虑手动修复IAT。
寻找magic jump:
选中无效指针中最前的一个rva:00055170,加上基址00400000,在OD中dd 0045512C,来到00455170下硬件访问断点,f9数次后数据窗口中显示00455170处的加密指针显示出来了,这时程序来到

00470EF8 /EB 2C jmp short 00470F26 //加密指针显示后程序来到这里,如果继续单步跟就会发现下面指针又被加密了
00470EFA |8B55 F4 mov edx, dword ptr [ebp-C]
00470EFD |8B02mov eax, dword ptr [edx]
00470EFF |25 FFFF0000 and eax, 0FFFF
00470F04 |8945 D0 mov dword ptr [ebp-30], eax
00470F07 |8B4D D0 mov ecx, dword ptr [ebp-30]
00470F0A |51pushecx
00470F0B |8B55 EC mov edx, dword ptr [ebp-14]
00470F0E |52pushedx
00470F0F |FF15 BCD74700 calldword ptr [47D7BC] ; kernel32.GetProcAddress
00470F15 |8945 D4 mov dword ptr [ebp-2C], eax
00470F18 |837D D4 00cmp dword ptr [ebp-2C], 0
00470F1C |74 08 jeshort 00470F26
00470F1E |8B45 E0 mov eax, dword ptr [ebp-20]
00470F21 |8B4D D4 mov ecx, dword ptr [ebp-2C]
00470F24 |8908mov dword ptr [eax], ecx
00470F26 \8B55 F0 mov edx, dword ptr [ebp-10]
00470F2981E2 FF000000 and edx, 0FF
00470F2F85D2testedx, edx
00470F3174 17 jeshort 00470F4A //magic jump,这里改成jmp,改好后f9运行一次,看数据窗口,所有的函数都正常显示了这时就用ImportREC加载程序,获取输入表后,所有指针都有效,抓取刚才脱壳的程序。
00470F3650pusheax
00470F378B0D 80CC4700 mov ecx, dword ptr [47CC80]; UnPackMe.0047CC9C
00470F3D51pushecx
00470F3E8B55 E0 mov edx, dword ptr [ebp-20]
00470F4152pushedx
00470F42E8 D9060000 call00471620//这里将指针再次加密
00470F4783C4 0C add esp, 0C
00470F4A^ E9 32FFFFFF jmp 00470E81

抓取修复后程序运行正常,peid查壳peid查壳Borland Delphi 6.0 - 7.0

脱壳完毕

ps.虽然修复很成功,但是不知道表达的是否正确,对于IAT加密的修复,我还在云里雾里,请高手指点
yunfeng 发表于 2008-10-5 10:13
写一个通用的脱壳脚本
//molebox 2.x ,by yunfeng
msg "忽略所有异常"
sto
sto
var cool
mov cool,esp
bphws cool,"r" //esp定律,用来找OEP
var VirtualProtect
gpa "VirtualProtect","kernel32.dll"
cmp $RESULT,0
je err
mov VirtualProtect,$RESULT
bp VirtualProtect//下VP的断点为了找IAT加密的地方

eob check
eoe check //发生中断则执行check
esto

ret


check:
cmp eip,VirtualProtect//检查是否是断在VP
je VirtualProtect
esto
ret


VirtualProtect:
rtu
var a
mov a,eip
mov a,[a]
cmp a,A75C085 //看用户代码处是否test eax,eax;jnz
je iat //如果是则到了关键地点
esto
ret



cool: //所有要做的都做完了,很快到OEP了
cob
coe
run
bphwc cool

zou: //自动走路的代码
mov a,eip
mov a,[a]
shl a,8
shl a,8
shl a,8
cmp a,58000000//直到指令不是pop eax为止
jne cool2
sto
jmp zou

cool2:
sti //进入call eax就到OEP了
jmp oep
ret



iat: //对IAT加密的代码进行PATCH
find eip,#8901#
cmp $RESULT,0
je err
mov [$RESULT],#9090#
msg "绕开输入表加密!"
bc VirtualProtect
jmp cool
ret


oep:
cmt eip,"OEP!!!dump and fix IAT"
an eip
ret

err:
msg "error"
ret
dumped_.rar
小糊涂虫 发表于 2008-10-5 11:25
00469BD3 >E8 00000000call UnPackMe.00469BD8
00469BD860 pushad 看到这东西,肯定会想到......................................
00469BD9E8 4F000000call UnPackMe.00469C2D在这儿..........
00469BDE68 2E607CDCpush DC7C602E
00469BE341 inc ecx

F9一次来到...
004697B158 pop eax ; UnPackMe.00469BD8
004697B258 pop eax
004697B3FFD0 call eax 这里是关键了......F7到OEP了....
004697B5E8 F5CB0000call UnPackMe.004763AF
004697BACC int3
0045159C55 push ebp
0045159D8BEC mov ebp,esp
0045159F83C4 F0add esp,-10
004515A2B8 BC134500mov eax,UnPackMe.004513BC ; ;
004515A7E8 8846FBFFcall UnPackMe.00405C34
004515ACA1 E02F4500mov eax,dword ptr ds:[452FE0]
004515B18B00 mov eax,dword ptr ds:[eax]
到OEP后可以脱壳了......脱壳后发现有10几个指针用等级1.2.3都是无法修复的.....
下面就找出加密的........
00055170从这个开始..找....
CRTL+G来到00455170下个断...然后在OEP也下个断....
重载程序...在CRTL+G来到00455170,然后就可以shift+F9了.一直看到下面的东西为止.
004551707C801D4Fkernel32.LoadLibraryExA 到这里已找出一个了....这么多的无效指针,,,我没有时间这样一个一个的找....所以看下面..
004551740005588C
004551780005589E

00470EF68901 mov dword ptr ds:[ecx],eax
00470EF8EB 2Cjmp short UnPackMe.00470F26到这里可以F8了....
00470EFA8B55 F4mov edx,dword ptr ss:[ebp-C]
00470EFD8B02 mov eax,dword ptr ds:[edx]

00470F2F85D2 test edx,edx
00470F3174 17je short UnPackMe.00470F4A 这里要改为JMP..........就万事大吉了....
00470F338B45 DCmov eax,dword ptr ss:[ebp-24]
00470F3650 push eax
00470F378B0D 80CC4700mov ecx,dword ptr ds:[47CC80] ; UnPackMe.0047CC9C
00470F3D51 push ecx
00470F3E8B55 E0mov edx,dword ptr ss:[ebp-20]
00470F4152 push edx


然后shift+f9来到了
0045159C55 push ebp
0045159D8BEC mov ebp,esp
0045159F83C4 F0add esp,-10
004515A2B8 BC134500mov eax,UnPackMe.004513BC ; ;
004515A7E8 8846FBFFcall UnPackMe.00405C34
004515ACA1 E02F4500mov eax,dword ptr ds:[452FE0]
004515B18B00 mov eax,dword ptr ds:[eax]
004515B3E8 F8E5FFFFcall UnPackMe.0044FBB0
004515B8A1 E02F4500mov eax,dword ptr ds:[452FE0]
004515BD8B00 mov eax,dword ptr ds:[eax]
到这一步已全部OK了...不用修复,,直接用OD插件脱壳可以运行.....
傻人有傻福 发表于 2008-10-5 11:35
脱壳完全是前人们的经验,MOLEBOX有捆绑文件的话 我就不会了

00469BD3 >E8 00000000 call00469BD8 ; OD载入到这里
00469BD860pushad
00469BD9E8 4F000000 call00469C2D ; 这里用ESP定律

下完ESP断点后,先不要F9运行,再下bp VirtualProtectSHIFT+F9 10次后返回
0047166C85C0testeax, eax ; 返回到这里
0047166E75 0A jnz short 0047167A
00471670B9 0B0000EF mov ecx, EF00000B
00471675E8 9D2F0000 call00474617
0047167A8B4D 08 mov ecx, dword ptr [ebp+8]
0047167D8B55 F8 mov edx, dword ptr [ebp-8]
004716808B02mov eax, dword ptr [edx]
004716828901mov dword ptr [ecx], eax ; 拿EAX的值填充IAT,这里就是IAT加密的地方,NOP掉就可以了


接着就可以用ESP定律了F9运行

004697B158pop eax; ESP定律的断点停在这里
004697B258pop eax
004697B3FFD0calleax; F7 前往OEP

F7来到OEP

0045159C55pushebp; OEP
0045159D8BECmov ebp, esp
0045159F83C4 F0 add esp, -10
004515A2B8 BC134500 mov eax, 004513BC
004515A7E8 8846FBFF call00405C34
004515ACA1 E02F4500 mov eax, dword ptr [452FE0]
004515B18B00mov eax, dword ptr [eax]

DUM出来用IMPORTREC修复的时候指针全部有效 转储修复一下 可以运行
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 15:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表