吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 19219|回复: 31
收起左侧

[原创] 吾爱破解脱壳练习----GHF Protector V1.0

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

12.本期看点:尽量学会工具的运用,各种工具只要运用得当,他就是一把非常锋利的尖刀


本次群内部大整顿,如果出现有误踢的朋友,我在这里说声对不起,请你论坛短消息我,我会把你加回去的

练习一:(结果已经公布)
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楼傻人有傻福

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

练习九:(结果已经公布)
http://www.52pojie.cn/thread-11446-1-1.html
最佳分析: 第1楼小生我怕怕

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

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

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

UnPackMe.rar

23 KB, 下载次数: 577, 下载积分: 吾爱币 -1 CB

免费评分

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

查看全部评分

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

lqiulu 发表于 2008-10-15 11:11
首先解释两个函数:

GlobalAlloc函数:分配全局内存块。
GlobalFree 函数:释放指定的全局内存块。


下断:bp GlobalFree shift+F9运行 。断下后alt+f9返回。


00407297FFD0 CALL EAX
0040729961 POPAD //来到这里。
0040729ABA 00174000MOV EDX,UnPack_1.00401700
0040729FFFE2 JMP EDX //跳向oep

----------------------------------------------------------------------------------------------------------

0040170055 PUSH EBP
004017018BEC MOV EBP,ESP
004017036A FFPUSH -1
0040170568 00254000PUSH UnPack_1.00402500
0040170A68 86184000PUSH UnPack_1.00401886 ; JMP to msvcrt._except_handler3
0040170F64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0040171550 PUSH EAX
0040171664:8925 00000000 MOV DWORD PTR FS:[0],ESP
0040171D83EC 68SUB ESP,68
0040172053 PUSH EBX
0040172156 PUSH ESI
0040172257 PUSH EDI
004017238965 E8MOV DWORD PTR SS:[EBP-18],ESP

用importREC插件来dump程序,我用的比较多。一个东西可以dump加修复。呵呵。

先启动importREC,不选择从原程序获取PE文件头,填入oep,自动查找。获取。全部有效,利用importREC插件进行dump。
4.GIF
5.GIF
修复。ok。可以运行。
unpackme_dump_.rar
 楼主| 小生我怕怕 发表于 2008-10-15 00:04
00511709 >50push eax //OD载入
0051170A7C 05 jl short UnPackMe.00511711 //ait+m打开内存镜像
0051170C52push edx
0051170DC1C4 80 rol esp,80
005117105Apop edx
0051171158pop eax
005117127E 07 jle short UnPackMe.0051171B
0051171472 05 jb short UnPackMe.0051171B
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 18//F2设置访问断点,shift+f9运行程序
地址=00519000
大小=00001000 (4096.)
物主=UnPackMe 00510000
区段=.idata
包含=data,imports
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
0051126EFF10call dword ptr ds:[eax] //程序停在这里CALL上,我们单步F7跟进
0051127083C4 10 add esp,10
0051127389C7mov edi,eax
005112756A 00 push 0
0051127768 6C6C6F63 push 636F6C6C
0051127C68 75616C41 push 416C6175
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801D77 >8BFFmov edi,edi//程序来到这里
7C801D7955push ebp //开始F8单步走吧
7C801D7A8BECmov ebp,esp
7C801D7C837D 08 00cmp dword ptr ss:[ebp+8],0
7C801D8053push ebx
7C801D8156push esi
7C801D8274 14 je short kernel32.7C801D98
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801DA45Epop esi
7C801DA55Bpop ebx
7C801DA65Dpop ebp
7C801DA7C2 0400 retn 4//通过这里返回到下面的代码
7C801DAA64:A1 18000000mov eax,dword ptr fs:[18]
━━━━━━━━━━━━━━━━━━━━━━━━━━
0051127083C4 10 add esp,10//返回到这里,我们继续F8单步走
0051127389C7mov edi,eax //由于代码过多,我就不一样复制啦
005112756A 00 push 0//大家随时注意寄存器的变化,现在正在准备我们的IAT,而此时我们的IAT是完整状态
0051127768 6C6C6F63 push 636F6C6C //留心IAT的变化
0051127C68 75616C41 push 416C6175
0051128168 56697274 push 74726956
━━━━━━━━━━━━━━━━━━━━━━━━━━
0051133168 00300000 push 3000 //当我们走到这里时注意寄存器窗口
0051133651push ecx
0051133750push eax
00511338FFD3call ebx
0051133A59pop ecx
0051133B85C0test eax,eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
EAX 00400000 //此时寄存器在读取我们的text段
ECX 00007400 //不用管我们继续走
EDX 7C99C0D8 ntdll.7C99C0D8
EBX 7C809A51 kernel32.VirtualAlloc
ESP 0012FD9C
EBP 0012FFB0
ESI 00511C55 ASCII ".text"
EDI 0012FDB8 ASCII "PE"
EIP 00511331 UnPackMe.00511331
━━━━━━━━━━━━━━━━━━━━━━━━━━
005113838B57 14 mov edx,dword ptr ds:[edi+14] //到达这里时注意寄存器的变化
0051138685D2test edx,edx
0051138874 14 je short UnPackMe.0051139E
0051138A56push esi
0051138B8B75 08 mov esi,dword ptr ss:[ebp+8]
━━━━━━━━━━━━━━━━━━━━━━━━━━
EAX 00000005 //此时寄存器在读text和rdata数据段
ECX 00000000 //不用管我们继续单步
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7C809A51 kernel32.VirtualAlloc
ESP 0012FDA4
EBP 0012FFB0
ESI 00511C7D ASCII ".rdata"
EDI 0012FF78 ASCII ".text"
EIP 00511383 UnPackMe.00511383
━━━━━━━━━━━━━━━━━━━━━━━━━━
00511388 /74 14 je short UnPackMe.0051139E //到达这里时在次注意寄存器窗口
0051138A |56push esi
0051138B |8B75 08 mov esi,dword ptr ss:[ebp+8]
0051138E |01D6add esi,edx
00511390 |8B4F 10 mov ecx,dword ptr ds:[edi+10]
00511393 |8B57 0C mov edx,dword ptr ds:[edi+C]
━━━━━━━━━━━━━━━━━━━━━━━━━━
EAX 00000004//现在在读取data和rdata段
ECX 00000000//不用管我们继续F8单步走
EDX 00000A00
EBX 7C809A51 kernel32.VirtualAlloc
ESP 0012FDA4
EBP 0012FFB0
ESI 00511CA5 ASCII ".data"
EDI 0012FF78 ASCII ".rdata"
EIP 00511388 UnPackMe.00511388
━━━━━━━━━━━━━━━━━━━━━━━━━━
005114268B50 18 mov edx,dword ptr ds:[eax+18] //经过一路向下我们来到了这里
005114293B55 B0 cmp edx,dword ptr ss:[ebp-50] //记住上面的地址千万要打断向上的,不能让向上跳转实现
0051142C75 27 jnz short UnPackMe.00511455 //此时我们在来看我们的寄存器窗口
0051142E8B50 1C mov edx,dword ptr ds:[eax+1C]
005114313B55 B4 cmp edx,dword ptr ss:[ebp-4C]
0051143475 1F jnz short UnPackMe.00511455
005114368B50 20 mov edx,dword ptr ds:[eax+20]
━━━━━━━━━━━━━━━━━━━━━━━━━━
EAX 00251EC0//在读取我们的MZP,这个是一个标志位,个人习惯这样叫
ECX 00400000//具体如何解释这个大家可以去了解下PE结构
EDX 00510000 ASCII "MZP"
EBX 7C809A51 kernel32.VirtualAlloc
ESP 0012FDA4
EBP 0012FFB0
ESI 00251EC0
EDI 00407400
EIP 00511426 UnPackMe.00511426
━━━━━━━━━━━━━━━━━━━━━━━━━━
0051149B8B4D C0 mov ecx,dword ptr ss:[ebp-40]//走到这里时很明显我们的程序资源已经释放完毕
0051149E8B11mov edx,dword ptr ds:[ecx] //此时正是我们的最佳DUMP时机
005114A085D2test edx,edx
005114A274 2A je short UnPackMe.005114CE
005114A4F7C2 00000080 test edx,80000000
005114AA74 08 je short UnPackMe.005114B4
005114AC81E2 FFFFFF7F and edx,7FFFFFFF
━━━━━━━━━━━━━━━━━━━━━━━━━━
EAX 7C800000 kernel32.7C800000//积存器已经呈现,已经我们在选用最佳DUMP时机时我们都选在MZP的下面几句
ECX 7C801BF6 kernel32.7C801BF6//我们运行我们的PEtools把程序DUMP
EDX 00010000 UNICODE "=::=::\"//记住是PEtools而不是lordPE
EBX 00407000 ASCII "Dp"
ESP 0012FDA4
EBP 0012FFB0
ESI 00400000
EDI 7C800000 kernel32.7C800000
EIP 0051149B UnPackMe.0051149B
━━━━━━━━━━━━━━━━━━━━━━━━━━
我们检查下脱壳后的程序,运行下可以运行,在来PEID查下壳吧
郁闷还在有一层壳,那么我们在继续来吧
PEID查壳为:AHpack 0.1
呵呵,压缩壳,我们OD载入我们DUMP出来的程序
━━━━━━━━━━━━━━━━━━━━━━━━━━
004070FF >60pushad //太明显就是想用ESP定律诱惑我们
0040710068 54704000 push Dumped.00407054 //那就不客气啦,在这里hr esp 或者直接ESP定律
00407105B8 48704000 mov eax,<&KERNEL32.GetModuleHandleA>//设置好硬件断点后,我们F9运行程序
0040710AFF10call dword ptr ds:[eax]
0040710C68 B3704000 push Dumped.004070B3 ; ASCII "GlobalAlloc"
0040711150push eax
00407112B8 44704000 mov eax,<&KERNEL32.GetProcAddress>
━━━━━━━━━━━━━━━━━━━━━━━━━━
0040729ABA 00174000 mov edx,Dumped.00401700 //哈哈明显吧,我们OEP压入EDX
0040729FFFE2jmp edx //这里直接跳向我们的OEP
004072A190nop
004072A2C3retn
004072A344inc esp
004072A40000add byte ptr ds:[eax],al
━━━━━━━━━━━━━━━━━━━━━━━━━━
0040170055push ebp //运行我们的OD插件把程序DUMP
004017018BECmov ebp,esp//再运行importRCE修复下我们的程序
004017036A FF push -1//到此脱壳成功,修复时指针全部有效
0040170568 00254000 push Dumped.00402500
0040170A68 86184000 push Dumped.00401886 ; jmp to msvcrt._except_handler3
0040170F64:A1 00000000mov eax,dword ptr fs:[0]
0040171550push eax
0040171664:8925 0000000>mov dword ptr fs:[0],esp
━━━━━━━━━━━━━━━━━━━━━━━━━━
总结:
当我们碰到某个程序无法用lordPE脱壳时不防试试PEtools这个强大的工具
最佳dump更多时候是建立在要知道RVA大小的情况下的,这个壳比较特殊
所以在我们发现我们的资源已经完全释放,而IAT未填充,我们的程序读了
MZP这个位置后即是我们的最佳DUMP时机,但本文中的方法只是给大家做
个借鉴,要想更好的了解最佳dump时机可以去看下fly的文章

unpack_.rar

9 KB, 下载次数: 13, 下载积分: 吾爱币 -1 CB

 楼主| 小生我怕怕 发表于 2008-10-15 00:06
我们在来说个断点的脱壳法,今天我们要利用到这个
bp LoadLibraryA
━━━━━━━━━━━━━━━━━━━━━━━━━━
00511709 >50push eax//OD载入
0051170A7C 05 jl short UnPackMe.00511711//在命令行下断 bp LoadLibraryA
0051170C52push edx//然后我们shift+f9四次
0051170DC1C4 80 rol esp,80//在第四次时会出现一个错误对话框,我们不用管,直接关闭
005117105Apop edx //错误提示请下下图
0051171158pop eax
005117127E 07 jle short UnPackMe.0051171B
━━━━━━━━━━━━━━━━━━━━━━━━━━
图一:

1.jpg


━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801D77 >8BFFmov edi,edi //shift+f9运行8次之后我们停在了这里
7C801D7955push ebp
7C801D7A8BECmov ebp,esp
7C801D7C837D 08 00cmp dword ptr ss:[ebp+8],0
7C801D8053push ebx
━━━━━━━━━━━━━━━━━━━━━━━━━━
0012FF9C 00407208/CALL 到 LoadLibraryA 来自 UnPack_1.00407206//shift+f9运行8次后堆栈显示如左
0012FFA0 004029DE\FileName = "SHELL32.dll" //此时正是我们的返回最佳时机
0012FFA4 005110DB
0012FFA8 0012FFD4
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801D77 >8BFFmov edi,edi //我们ait+b把断点取消
7C801D7955push ebp//ait+f9返回到用户代码
7C801D7A8BECmov ebp,esp
7C801D7C837D 08 00cmp dword ptr ss:[ebp+8],0
7C801D8053push ebx
7C801D8156push esi
━━━━━━━━━━━━━━━━━━━━━━━━━━
004072088905 CE704000 mov dword ptr ds:[4070CE],eax //我们返回到这里
0040720EC705 D2704000 0>mov dword ptr ds:[4070D2],0 //好开始F8单步走吧
00407218BA 00004000 mov edx,UnPack_1.00400000
0040721D8B06mov eax,dword ptr ds:[esi]
━━━━━━━━━━━━━━━━━━━━━━━━━━
0040725F8907mov dword ptr ds:[edi],eax
004072618305 D2704000 0>add dword ptr ds:[4070D2],4
00407268^ EB AE jmp short UnPack_1.00407218 //这个JMP是不能跳的
0040726A83C6 14 add esi,14//我们F4运行到这里
0040726DBA 00004000 mov edx,UnPack_1.00400000
00407272^ E9 6EFFFFFF jmp UnPack_1.004071E5 //这里也一样我们在下一句F4运行到所选
0040727768 54704000 push UnPack_1.00407054 ; ASCII "KERNEL32.DLL"
━━━━━━━━━━━━━━━━━━━━━━━━━━
00407297FFD0call eax//继续F8单步到达这里后
0040729961popad //我们注意下面的值是把我们的OEP压入EDX
0040729ABA 00174000 mov edx,UnPack_1.00401700
0040729F^ FFE2jmp edx //这里就跳向我们的OEP
004072A190nop
004072A2C3retn
━━━━━━━━━━━━━━━━━━━━━━━━━━
0040170055push ebp//运行PEtools脱壳
004017018BECmov ebp,esp //运行我们的importRCE修复
004017036A FF push -1
0040170568 00254000 push UnPack_1.00402500
0040170A68 86184000 push UnPack_1.00401886 ; jmp to msvcrt._except_handler3
0040170F64:A1 00000000mov eax,dword ptr fs:[0]
0040171550push eax
0040171664:8925 0000000>mov dword ptr fs:[0],esp
━━━━━━━━━━━━━━━━━━━━━━━━━━
在我们输入我们的OEP修复时出现下图状况
如图:

2.JPG
━━━━━━━━━━━━━━━━━━━━━━━━━━
我们来设置下我们的importRCE,如下图:
3.jpg

━━━━━━━━━━━━━━━━━━━━━━━━━━
好此时我们在来设置从新选择加载我们的要脱壳的进程,然后在填上OEP,自动查找IAT
呵呵,成功了吧,修复后发现程序可以运行,到此我们脱壳结束
liky 发表于 2008-10-15 01:01
OD载入
00511709 >50push eax
0051170A7C 05 jl short UnPackMe.00511711
0051170C52push edx
0051170DC1C4 80 rol esp,80
005117105Apop edx
0051171158pop eax
005117127E 07 jle short UnPackMe.0051171B
0051171472 05 jb short UnPackMe.0051171B
005117160D 00000000 or eax,0
0051171BFCcld
0051171CBE 3C010000 mov esi,13C
0051172187DExchg esi,ebx
0051172387D2xchg edx,edx

下断点 bp GetModuleHandleA SHIFT+F9运行两次执行用户代码返回
0040710C68 B3704000 push UnPack_1.004070B3 ; ASCII "GlobalAlloc"
0040711150push eax
00407112B8 44704000 mov eax,UnPack_1.00407044
00407117FF10call dword ptr ds:[eax]
0040711968 00100000 push 1000
0040711E6A 40 push 40
00407120FFD0call eax
004071228905 CA704000 mov dword ptr ds:[4070CA],eax
0040712889C7mov edi,eax
0040712ABE 00104000 mov esi,UnPack_1.00401000
0040712F60pushad
00407130FCcld
00407131B2 80 mov dl,80
0040713331DBxor ebx,ebx
00407135A4movs byte ptr es:[edi],byte ptr ds:[esi]
00407136B3 02 mov bl,2

向下拉主窗口 找到 第二个POPAD (根据堆栈平衡)
00407289B8 44704000 mov eax,UnPack_1.00407044
0040728EFF10call dword ptr ds:[eax]
004072908B15 CA704000 mov edx,dword ptr ds:[4070CA]
0040729652push edx
00407297FFD0call eax
0040729961popad !!!!!!!!!!!!!`
0040729ABA 00174000 mov edx,UnPack_1.00401700
0040729FFFE2jmp edx-----------------------------------F4
004072A190nop
004072A2C3retn
004072A344inc esp
004072A40000add byte ptr ds:[eax],al
004072A60000add byte ptr ds:[eax],al


在0040729FFFE2jmp edx ---- ----F4 然后一次F8 到达OEP

0040170055push ebp
004017018BECmov ebp,esp
004017036A FF push -1
0040170568 00254000 push UnPack_1.00402500
0040170A68 86184000 push UnPack_1.00401886 ; jmp 到 msvcrt._except_handler3
0040170F64:A1 00000000mov eax,dword ptr fs:[0]
0040171550push eax
0040171664:8925 0000000>mov dword ptr fs:[0],esp
0040171D83EC 68 sub esp,68
0040172053push ebx
0040172156push esi
0040172257push edi
004017238965 E8 mov dword ptr ss:[ebp-18],esp

然后用PETOOL脱壳 REC修复 脱壳结束
pcfans 发表于 2008-10-15 01:47
脱壳过程:
OD载入
00511709 >50PUSH EAX;加壳程序入口,OD载入停在这里
0051170A7C 05 JL SHORT UnPackMe.00511711
0051170C52PUSH EDX
0051170DC1C4 80 ROL ESP,80 ; 位移常数超出 1..31 的范围
005117105APOP EDX
0051171158POP EAX
005117127E 07 JLE SHORT UnPackMe.0051171B
0051171472 05 JB SHORT UnPackMe.0051171B
----------------------------------
这是一个比较怪异的壳,单步法路途太遥远,内存镜象法跑飞,ESP定律运行不下去,异常法找不到异常断不下来
看来很多人,又要在这徘徊很久了。
这时我们可以考虑下个函数的断点,怎么判断下什么断点呢,当然是LoadLibraryA这个加载库函数的断点了
好了,开始bp LoadLibraryA,F9运行8次,什么,你说不知道为什么运行8次?我告诉你,8被认为是个吉利的数字嘛,嘿嘿,说笑了,注意看堆栈
----------------------------------
堆栈情况
0012FF9C 00407208/CALL 到 LoadLibraryA 来自 UnPack_1.00407206;F9运行15次程序就运行起来了,而第八次是最后一次返回程序领空的机会
0012FFA0 004029DE\FileName = "SHELL32.dll"
0012FFA4 005110DB
现在知道为什么是8次了吧,堆栈窗是个很重要的窗口,千万别忘记它
----------------------------------
第八次断下来
7C801D77 >8BFFMOV EDI,EDI;停在这里,取消断点
7C801D7955PUSH EBP
7C801D7A8BECMOV EBP,ESP
7C801D7C837D 08 00CMP DWORD PTR SS:[EBP+8],0
7C801D8053PUSH EBX
7C801D8156PUSH ESI
7C801D8274 14 JE SHORT kernel32.7C801D98
----------------------------------
0012FF9C 00407208/CALL 到 LoadLibraryA 来自 UnPack_1.00407206在堆栈的这行回车,返回到程序领空
----------------------------------
回到程序领空
004072088905 CE704000 MOV DWORD PTR DS:[4070CE],EAX;返回后停在这里了,下F2断点F9运行,断下来后取消断点,接着F8单步往下走
0040720EC705 D2704000 0>MOV DWORD PTR DS:[4070D2],0
00407218BA 00004000 MOV EDX,UnPack_1.00400000
0040721D8B06MOV EAX,DWORD PTR DS:[ESI]
0040721F85C0TEST EAX,EAX
0040722175 03 JNZ SHORT UnPack_1.00407226
004072238B46 10 MOV EAX,DWORD PTR DS:[ESI+10]
0040722601D0ADD EAX,EDX
004072280305 D2704000 ADD EAX,DWORD PTR DS:[4070D2]
0040722E8B18MOV EBX,DWORD PTR DS:[EAX]
004072308B7E 10 MOV EDI,DWORD PTR DS:[ESI+10]
0040723301D7ADD EDI,EDX
00407235033D D2704000 ADD EDI,DWORD PTR DS:[4070D2]
0040723B85DBTEST EBX,EBX
0040723D74 2B JE SHORT UnPack_1.0040726A
0040723FF7C3 00000080 TEST EBX,80000000
0040724575 04 JNZ SHORT UnPack_1.0040724B
0040724701D3ADD EBX,EDX
0040724943INC EBX
0040724A43INC EBX
0040724B81E3 FFFFFF0F AND EBX,0FFFFFFF
0040725153PUSH EBX
00407252FF35 CE704000 PUSH DWORD PTR DS:[4070CE] ; SHELL32.#598
00407258B8 44704000 MOV EAX,UnPack_1.00407044
0040725DFF10CALL DWORD PTR DS:[EAX]
0040725F8907MOV DWORD PTR DS:[EDI],EAX
004072618305 D2704000 0>ADD DWORD PTR DS:[4070D2],4
00407268^ EB AE JMP SHORT UnPack_1.00407218
0040726A83C6 14 ADD ESI,14 ;F4打断向上的跳转
0040726DBA 00004000 MOV EDX,UnPack_1.00400000
00407272^ E9 6EFFFFFF JMP UnPack_1.004071E5
0040727768 54704000 PUSH UnPack_1.00407054 ;F4打断向上的跳转
0040727CB8 48704000 MOV EAX,UnPack_1.00407048
00407281FF10CALL DWORD PTR DS:[EAX]
0040728368 BF704000 PUSH UnPack_1.004070BF ; ASCII "GlobalFree"
0040728850PUSH EAX
00407289B8 44704000 MOV EAX,UnPack_1.00407044
0040728EFF10CALL DWORD PTR DS:[EAX]
004072908B15 CA704000 MOV EDX,DWORD PTR DS:[4070CA]
0040729652PUSH EDX
00407297FFD0CALL EAX
0040729961POPAD
0040729ABA 00174000 MOV EDX,UnPack_1.00401700
0040729FFFE2JMP EDX;这里就跳向程序的OEP了
004072A190NOP
004072A2C3RETN
-----------------------------------
找到了,就是这了
0040170055PUSH EBP ;程序的OEP
004017018BECMOV EBP,ESP
004017036A FF PUSH -1
0040170568 00254000 PUSH UnPack_1.00402500
0040170A68 86184000 PUSH UnPack_1.00401886 ; JMP 到 msvcrt._except_handler3
0040170F64:A1 00000000MOV EAX,DWORD PTR FS:[0]
0040171550PUSH EAX
0040171664:8925 0000000>MOV DWORD PTR FS:[0],ESP
0040171D83EC 68 SUB ESP,68
0040172053PUSH EBX
0040172156PUSH ESI
0040172257PUSH EDI
-----------------------------------
接下来当然是脱壳修复了

打开LoadPE,选择程序进程,完全dump,打开ImportREC,载人程序进程,OEP填1700,点IAT自动搜索,吐血了吧,IR竟然提示在这个OEP入口没有发现任

何可用信息,这时注意看下IR的信息窗,发现映像基址:00510000 大小:0000B000,基址不对,当然找不到IAT了。LoadPE载入刚才dump出来的那个文件

看一下基址也是00510000。这样程序完全会无法运行起来的。

下面就教大家一个方法了,要重新设置下LoadPE和ImportREC的选项,对付这类的程序脱壳和修复

LoadPE设置如图1

LoadPE设置

LoadPE设置



ImportREC设置如图2

ImportREC设置

ImportREC设置


设置好后
LoadPE选择程序进程,不要修正镜象大小,直接完全dump
ImportREC选择程序进程,输入OEP地址1700,自动搜索IAT并获取输入表发现116指针,抓取脱壳文件。
peid查壳Microsoft Visual C++ 6.0
程序运行成功,功能完好,脱壳完毕
babaloveyou 发表于 2008-10-15 02:31
UPolyX v0.5 *peid查壳是这个晕倒
00511709 UnP>50 push eax od载入到这里
0051170A 7C 05jl short UnPackMe.00511711
0051170C 52 push edx
0051170D C1C4 80rol esp,80
00511710 5A pop edx
00511711 58 pop eax
00511712 7E 07jle short UnPackMe.0051171B
00511714 72 05jb short UnPackMe.0051171B
00511716 0D 00000000or eax,0
0051171B FC cld
0051171C BE 3C010000mov esi,13C
00511721 87DE xchg esi,ebx
00511723 87D2 xchg edx,edx
00511725 F8 clc
00511726 04 00add al,0
00511728 B9 A0F9FFFFmov ecx,-660
0051172D 56 push esi
0051172E 7F 06jg short UnPackMe.00511736
00511730 57 push edi
00511731 66:83E9 00 sub cx,0
打开内存镜像
005119000处f2下断点f9运行
0051126E FF10 call dword ptr ds:[eax]; kernel32.LoadLibraryA 这里f7进去

00511270 83C4 10add esp,10
00511273 89C7 mov edi,eax
00511275 6A 00push 0
00511277 68 6C6C6F63push 636F6C6C
0051127C 68 75616C41push 416C6175
00511281 68 56697274push 74726956
00511286 54 push esp
00511287 50 push eax
00511288 8B45 0Cmov eax,dword ptr ss:[ebp+C]

一路f8打断向上的跳转
005114CC ^\EB CDjmp short UnPackMe.0051149B
005114CE 83C3 14add ebx,14
005114D1 ^ EB 99jmp short UnPackMe.0051146C
005114D3 64:8B05 30000000 mov eax,dword ptr fs:[30] f4运行到这里 出现错误 不理他
005114DA 8B40 0Cmov eax,dword ptr ds:[eax+C]
005114DD 8B58 0Cmov ebx,dword ptr ds:[eax+C]
005114E0 895D 90mov dword ptr ss:[ebp-70],ebx
005114E3 8B53 18mov edx,dword ptr ds:[ebx+18]




00511528 3B45 B8cmp eax,dword ptr ss:[ebp-48]
0051152B 76 05jbe short 00511532
0051152D 83C7 14add edi,14
00511530 ^ EB DEjmp short 00511510 这里叫他向上跳要不就跑飞了 循环2次会跳过这里

00511532 6A 1Cpush 1C
00511534 8D85 64FFFFFFlea eax,dword ptr ss:[ebp-9C]
0051153A 50 push eax
0051153B 56 push esi
0051153C FF55 88call dword ptr ss:[ebp-78]


004070FF 60 pushad
00407100 68 54704000push UnPack_1.00407054 ; ASCII "KERNEL32.DLL" 这里用esp定律 下硬件访问断点f9运行

00407105 B8 48704000mov eax,UnPack_1.00407048
0040710A FF10 call dword ptr ds:[eax]
0040710C 68 B3704000push UnPack_1.004070B3 ; ASCII "GlobalAlloc"
00407111 50 push eax
00407112 B8 44704000mov eax,UnPack_1.00407044
00407117 FF10 call dword ptr ds:[eax]
00407119 68 00100000push 1000
0040711E 6A 40push 40
00407120 FFD0 call eax
00407122 8905 CA704000mov dword ptr ds:[4070CA],eax
00407128 89C7 mov edi,eax
0040712A BE 00104000mov esi,UnPack_1.00401000

0040729A BA 00174000mov edx,UnPack_1.00401700
0040729F FFE2 jmp edx跳向 oep

004072A1 90 nop
004072A2 C3 retn
004072A3 44 inc esp
004072A4 0000 add byte ptr ds:[eax],al
004072A6 0000 add byte ptr ds:[eax],al
004072A8 0000 add byte ptr ds:[eax],al
004072AA 0000 add byte ptr ds:[eax],al


00401700 55 push ebp loadpe无法转存晕!换了petool才可以

00401701 8BEC mov ebp,esp
00401703 6A FFpush -1
00401705 68 00254000push UnPack_1.00402500
0040170A 68 86184000push UnPack_1.00401886 ; jmp to msvcrt._except_handler3
0040170F 64:A1 00000000 mov eax,dword ptr fs:[0]
00401715 50 push eax
00401716 64:8925 00000000 mov dword ptr fs:[0],esp
0040171D 83EC 68sub esp,68
00401720 53 push ebx
00401721 56 push esi
00401722 57 push edi
00401723 8965 E8mov dword ptr ss:[ebp-18],esp
00401726 33DB xor ebx,ebx

00401723 8965 E8mov dword ptr ss:[ebp-18],esp
00401726 33DB xor ebx,ebx
00401728 895D FCmov dword ptr ss:[ebp-4],ebx
0040172B 6A 02push 2
0040172D FF15 90214000call dword ptr ds:[402190] ; msvcrt.__set_app_type
这里是iat表
00401733 59 pop ecx
00401734 830D 2C314000 FF or dword ptr ds:[40312C],FFFFFFFF
0040173B 830D 30314000 FF or dword ptr ds:[403130],FFFFFFFF


手动指定 iat开始地址00402000 大小004022c0-00402000 =2c0
ir修复
打开加壳程序 来修复
无效的指针全部删除保存成功!!!

111_.rar

9 KB, 下载次数: 0, 下载积分: 吾爱币 -1 CB

A-new 发表于 2008-10-15 10:20
载入OD,
00511709 >50pusheax//代码好乱,下VritualAlloc 断点
0051170A7C 05 jlshort 00511711
0051170C52pushedx
0051170DC1C4 80 rol esp, 80
005117105Apop edx
0051171158pop eax
005117127E 07 jle short 0051171B
0051171472 05 jbshort 0051171B

VritualAlloc 断点,貌似是去花指令用的,一般这种很乱的代码比较有用
SHIFT+F9一次,断在这里

7C809AE1 >8BFFmov edi, edi
7C809AE355pushebp
7C809AE48BECmov ebp, esp
7C809AE6FF75 14 pushdword ptr [ebp+14]
7C809AE9FF75 10 pushdword ptr [ebp+10]

ALT+F9返回,到这里

0051133A59pop ecx; kernel32.7C809B49
0051133B85C0testeax, eax
0051133D75 13 jnz short 00511352
0051133F6A 40 push40
0051134168 00100000 push1000
0051134651pushecx
0051134750pusheax
00511348FFD3callebx

向下拉,看到第一个retn

00511590^\0F85 4DFFFFFF jnz 005114E3
005115968B85 30FEFFFF mov eax, dword ptr [ebp-1D0]
0051159C0345 F4 add eax, dword ptr [ebp-C]
0051159F8B4D F4 mov ecx, dword ptr [ebp-C]
005115A25Epop esi
005115A35Fpop edi
005115A45Bpop ebx
005115A5C9leave
005115A6C2 0C00 retn0C 这个

直接在红色那里按F4,接着F8到这里

00511139 89E6 mov esi, esp 这里
0051113B 894E 04 mov dword ptr [esi+4], ecx
0051113E 83C6 10 add esi, 10
00511141 FFE0 jmp eax 这个jmp貌似有点问题
00511143 55 push ebp
00511144 89E5 mov ebp, esp
00511146 81EC 00020000 sub esp, 200
0051114C 53 push ebx

一直F8吧,00511141 FFE0 jmp eax 这个跳到这里

004070FF 60 pushad
00407100 68 54704000 push 00407054 ; ASCII "KERNEL32.DLL"
00407105 B8 48704000 mov eax, 00407048
0040710A FF10 call dword ptr [eax]
0040710C 68 B3704000 push 004070B3 ; ASCII "GlobalAlloc"

呵呵,有pushad,用esp定律
F8一下,下断点 hr esp。SHIFT+F9到这里

0040729A BA 00174000 mov edx, 00401700
0040729F FFE2 jmp edx
004072A1 90 nop
004072A2 C3 retn

F8两下,就到了,传说中的OEP

00401700 55 push ebp
00401701 8BEC mov ebp, esp
00401703 6A FF push -1
00401705 68 00254000 push 00402500
0040170A 68 86184000 push 00401886 ; jmp 到 msvcrt._except_handler3
0040170F 64:A1 00000000 mov eax, dword ptr fs:[0]

dump之,用OD自带的插件,貌似dump下来图标不对,用lordPE,试下,dump不下来,那就只好用PETools了
接下来修复,打开ImportREC,OEP:1700,自动查找,貌似不对,打开选项,去掉“试用来自磁盘的PE文件头”的勾选
再试一下就OK了
wesley 发表于 2008-10-15 10:50
还以为又是ANTI DUMP呢

搞个小脚本到达OEP 嘿嘿 写的滥 别笑我
 //GHF Protector unpacking Script // //Author: Wesley // //Mail: 263010823@qq.com // /////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// gpa "GlobalFree","kernel32.dll" cmp $RESULT,0 je err bphws $RESULT,"x" run bphwc $RESULT rtu sto sto sto cmt eip,"OEP To Get,Please dumped it with petools,Enjoy!" ret error: MSG "run-time error,please check the program again!" 

到达OEP后 由于PE头被做了手脚 不能由OD中的DUMP插件脱壳或Lordpe脱
用PETOOLS或用ImportREC
1.JPG
这里脱也行
需要注意的是修复IAT时ImportREC中不能选“使用来自磁盘的PE头“ 然后再获取IAT表
发现脱壳后图标又回来了哦。。。。
傻人有傻福 发表于 2008-10-15 11:21
00511709 > $50push eax;OD载入到这里
0051170A .7C 05 jl short UnPackMe.00511711
0051170C .52push edx
0051170D .C1C4 80 rol esp,80;Shift constant out of range 1..31
00511710 .5Apop edx
00511711 >58pop eax

BP LoadLibraryASHIFT+F98次后返回
004072088905 CE704000 mov ds:[4070CE],eax ; 返回到这里
0040720EC705 D2704000 00000000mov dword ptr ds:[4070D2],0
00407218BA 00004000 mov edx,UnPack_1.00400000
0040721D8B06mov eax,ds:[esi]
0040721F85C0test eax,eax
0040722175 03 jnz short UnPack_1.00407226

接着单步往下走就行了,不要往回跳,一直走下去,就可以看到跳向OEP的跳转了
00407281FF10call ds:[eax]
0040728368 BF704000 push UnPack_1.004070BF; ASCII "GlobalFree"
0040728850push eax
00407289B8 44704000 mov eax,UnPack_1.00407044
0040728EFF10call ds:[eax]
004072908B15 CA704000 mov edx,ds:[4070CA]
0040729652push edx
00407297FFD0call eax
0040729961popad
0040729ABA 00174000 mov edx,UnPack_1.00401700
0040729FFFE2jmp edx ; 这里跳向OEP

接着再单步一下就到OEP了,
0040170055push ebp; OEP
004017018BECmov ebp,esp
004017036A FF push -1
0040170568 00254000 push UnPack_1.00402500
0040170A68 86184000 push UnPack_1.00401886; jmp to msvcrt._except_handler3
0040170F64:A1 00000000mov eax,fs:[0]

这时用PETOOLS来脱壳,IMPORTREC修复一下就可以运行了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-25 21:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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