小生我怕怕 发表于 2008-9-21 22:04

吾爱专题脱壳练习----压缩壳练习之二

本次主题是压缩壳,fly说,脱尽压缩壳,再去学加密壳,因此,先放压缩壳练习
本次壳为FSG2.0,上次的壳答案也随之公开,让大家看下大家的脱壳基础到底如何
请大家在回复中注意以下几点:
1.脱壳后的文件大家以千脑形式上传,目的是为了便于隐藏文件和节约论坛空间
2.脱壳后的文件,请大家以脱文附带脱壳后程序打包压缩传于千脑网盘
3.对于回帖过程中千万不要出现灌水,否则BAN了ID
4.对于有优秀脱文或优秀脱壳方法的朋友,给于适当威望奖励
5.鉴于此练习是针对论坛的所有人,请大家踊跃参加,如果不是脱了壳教作业的,请不要顶帖子,方便管理查阅,及时给出评分
6.以下为需要设置威望的格式
7.脱壳一以周期计算,(周期=等于三天)
8.脱壳周期一结束,就开始公布答案让大家能有更充分的学习环境,让不懂脱的朋友去寻找你失误的地方争取早日赶上论坛的积极份子
9.我们要的是脱文,并不是脱壳机去脱的,如果用脱机脱了别拿来,请一定附带上脱文

维护世界和平 发表于 2008-9-21 23:42

郁闷,我没权限搞加密帖子!
小生说要脱文...惨,写下...
强烈要求给权限啊!!!!!!!帖子无法加威望!

0040955C >60pushad
0040955DEB 04 jmp short 00409563//开始ESP定律
0040955F625CE9 F1 bound ebx, qword ptr
0040956387EBxchgebx, ebp
00409565EB 03 jmp short 0040956A
00409567^ E0 BB loopdne short 00409524
00409569B8 87EB83EC mov eax, EC83EB87
0040956EE0 6A loopdne short 004095DA

0040B18651pushecx//八次Shift + F9后,来到这里!
0040B18787D9xchgecx, ebx
0040B18940inc eax
0040B18A48dec eax
0040B18B87D9xchgecx, ebx
0040B18D83C4 04 add esp, 4
0040B1908B6C24 24 mov ebp, dword ptr
0040B19466:33ED xor bp, bp
0040B19766:3E:817D 00 4>cmp word ptr ds:, 5A4D

0040B63A60pushad
0040B63B43inc ebx
0040B63C4Bdec ebx
0040B63D61popad
0040B63EC3retn //往下拉。来到这里!在这里下F2,然后Shift + F9运行。来到这里~继续单步!
0040B63F0000add byte ptr , al
0040B6410000add byte ptr , al

004001548725 24A94000 xchgdword ptr , esp //单步后,来到这里,很熟悉的FSG特征噢
0040015A61popad
0040015B94xchgeax, esp
0040015C55pushebp
0040015DA4movsbyte ptr es:, byte ptr [esi>
0040015EB6 80 mov dh, 80
00400160FF13calldword ptr
00400162^ 73 F9 jnb short 0040015D
0040016433C9xor ecx, ecx
00400166FF13calldword ptr
0040016873 16 jnb short 00400180

004001CD^\78 F3 jsshort 004001C2往下拉,来到这里!
004001CF75 03 jnz short 004001D4
004001D1FF63 0C jmp dword ptr //在这里下F2 然后Shift + F9运行,来到这里,单步一下!就飞向熟悉的OEP了!
004001D450pusheax
004001D555pushebp

0040170055pushebp//熟悉的OEP
004017018BECmov ebp, esp
004017036A FF push-1
0040170568 00254000 push00402500
0040170A68 86184000 push00401886 ; jmp 到 MSVCRT._except_handler3
0040170F64:A1 00000000mov eax, dword ptr fs:
0040171550pusheax

到了这里!LordPE把程序转存下来~
开始手动修复IAT!
拿起ImportREC~先填下OEP=00001700 然后自动搜索IAT,看到了RAV=0000216C,这时回到OD,输入命令dd 0040216C,这时能看到熟悉的IAT了!哈哈,然后开始往上拉,找IAT表的开始地址0040,找IAT表的结束地址00402500,我们计算一下!
OEP=00001700
RAV=00001FFC
大小=00402500-00401FFC=504
输入进去,获取IAT表,然后剪切到一些无效函数,修复程序,OK。程序运行成功!

A-new 发表于 2008-9-21 22:12

沙发,站位 ……
载入OD

0040955C > 60 pushad
0040955D EB 04 jmp short 00409563
0040955F 625CE9 F1 bound ebx, qword ptr
00409563 87EB xchg ebx, ebp
00409565 EB 03 jmp short 0040956A
00409567 ^ E0 BB loopdne short 00409524
00409569 B8 87EB83EC mov eax, EC83EB87

这里

0040B141 83C1 FF add ecx, -1
0040B144 ^ 75 A1 jnz short 0040B0E7
0040B146 EB 47 jmp short 0040B18F F4

和这里

0040B1E2 /75 20 jnz short 0040B204
0040B1E4 |8178 04 726F634>cmp dword ptr , 41636F72
0040B1EB |75 17 jnz short 0040B204
0040B1ED |8178 08 6464726>cmp dword ptr , 65726464
0040B1F4 |75 0E jnz short 0040B204
0040B1F6 |66:8178 0C 7373 cmp word ptr , 7373
0040B1FC |75 06 jnz short 0040B204
0040B1FE |8078 0E 00 cmp byte ptr , 0
0040B202 |74 03 je short 0040B207
0040B204 \41 inc ecx
0040B205 ^ EB D0 jmp short 0040B1D7
0040B207 8B46 24 mov eax, dword ptr F4,不然要按N久F8

直到这里,除了上面注意的两除外,一直F8,见call就F7,(下面没有特殊说明,一直F8)

0040B26A 55 push ebp ; kernel32.7C800000
0040B26B FFD6 call esi
0040B26D FFD0 call eax
0040B26F 890424 mov dword ptr , eax
0040B272 E8 0C000000 call 0040B283 F7
0040B277 43 inc ebx
0040B278 6C ins byte ptr es:, dx


到这里
0040B283 55 push ebp ; kernel32.7C800000
0040B284 FFD6 call esi
0040B286 FFD0 call eax
0040B288 6A 00 push 0
0040B28A E8 0B000000 call 0040B29A F7
0040B28F 45 inc ebp


来到这里,这里比较重要
0040B29A 55 push ebp ; kernel32.7C800000
0040B29B FFD6 call esi
0040B29D FFD0 call eax
0040B29F 55 push ebp
0040B2A0 FFD6 call esi
0040B2A2 8BF8 mov edi, eax F2下断点,然后F9,然后在取消断点,继续单步

到这里之前见call就F7
0040B2DC 55 push ebp ; kernel32.7C800000
0040B2DD FFD6 call esi
0040B2DF FFD0 call eax
0040B2E1 85C0 test eax, eaxF2下断点,然后F9,然后在取消断点,继续单步
0040B2E3 ^ 74 D4 je short 0040B2B9

同上
0040B31A 55 push ebp ; kernel32.7C800000
0040B31B FFD6 call esi
0040B31D FFD0 call eax
0040B31F 85C0 test eax, eax F2下断点,然后F9,然后在取消断点,继续单步
0040B321 ^ 75 D4 jnz short 0040B2F7

继续同上
0040B364 55 push ebp ; kernel32.7C800000
0040B365 FFD6 call esi
0040B367 FFD0 call eax
0040B369 58 pop eax F2下断点,然后F9,然后在取消断点,继续单步
0040B36A EB 04 jmp short 0040B370

见call就F7,这里注意一下
0040B4CF 85C9 test ecx, ecx
0040B4D1 ^ 0F85 60FFFFFF jnz 0040B437
0040B4D7 57 push edi F2下断点,然后F9,然后在取消断点,继续单步

这种call就不要跟进了
0040B5C7 50 push eax
0040B5C8 FFD7 call edi 这种call
0040B5CA 83EC 04 sub esp, 4
0040B5CD 50 push eax
0040B5CE 33DB xor ebx, ebx
0040B5D0 8B45 00 mov eax, dword ptr
0040B5D3 8B8418 00004000 mov eax, dword ptr
0040B5DA A9 00000080 test eax, 80000000
0040B5DF 74 07 je short 0040B5E8
0040B5E1 25 FFFF0000 and eax, 0FFFF
0040B5E6 EB 09 jmp short 0040B5F1
0040B5E8 85C0 test eax, eax
0040B5EA 74 1D je short 0040B609
0040B5EC 05 02004000 add eax, 00400002
0040B5F1 894424 04 mov dword ptr , eax
0040B5F5 FFD6 call esi
0040B5F7 83EC 08 sub esp, 8
0040B5FA 8B4D 10 mov ecx, dword ptr
0040B5FD 898419 00004000 mov dword ptr , eax
0040B604 83C3 04 add ebx, 4
0040B607 ^ EB C7 jmp short 0040B5D0
0040B609 83C4 08 add esp, 8
0040B60C 83C5 14 add ebp, 14
0040B60F 837D 10 00 cmp dword ptr , 0
0040B613 ^ 75 A9 jnz short 0040B5BE
0040B615 E8 01000000 call 0040B61B这个Call跟进哦


00400160FF13calldword ptr ; UnPackMe.004001E8 这种call也不要跟进

直到这里
004001C995xchgeax, ebp
004001CA8B07mov eax, dword ptr
004001CC40inc eax
004001CD^ 78 F3 jsshort 004001C2
004001CF75 03 jnz short 004001D4
004001D1FF63 0C jmp dword ptr
004001D450pusheax
004001D555pushebp
004001D6FF53 14 calldword ptr
004001D9ABstosdword ptr es:
004001DA^ EB EE jmp short 004001CA
004001DC33C9xor ecx, ecx
这段代码一直在红色部分循环,
004001D1FF63 0C jmp dword ptr
这里是个大跳转,F2下断,F9运行,单步一下,哈哈,就到传说中的OEP了
0040170055pushebp;传说中的OEP
004017018BECmov ebp, esp
004017036A FF push-1
0040170568 00254000 push00402500
0040170A68 86184000 push00401886 ; jmp 到 msvcrt._except_handler3
0040170F64:A1 00000000mov eax, dword ptr fs:
0040171550pusheax
0040171664:8925 0000000>mov dword ptr fs:, esp
dump,记下OEP 1700,打开修表工具,OEP处填1700
接下来是找输入表,在OD中随便找一个API函数,右键-数据窗口跟随-内存地址,为了容易看,数据窗口设置一下(右键-长型-地址)
是不是看到函数了,上下翻翻,找到起始位置00401FFC 到 004021E4
Ok,在RAV处填 1FFC , SIZE:1E8,获取,Cut无效滴,修复,嘎嘎,大功告成!
UnPacked.rar

UnPacked.rar

小生我怕怕 发表于 2008-9-21 22:57

我来做个开头,三次内存法
━━━━━━━━━━━━━━━━━━━━━━━━━━
0040955C > 60 pushad //OD载入
0040955D EB 04 jmp short UnPackMe.00409563 //看特征此FSG有点变异
0040955F 625CE9 F1 bound ebx,qword ptr ds: //打开内存镜象 ait+m
00409563 87EB xchg ebx,ebp
00409565 EB 03 jmp short UnPackMe.0040956A
00409567 ^ E0 BB loopdne short UnPackMe.00409524
00409569 B8 87EB83EC mov eax,EC83EB87
0040956E E0 6A loopdne short UnPackMe.004095DA
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 21 //在此设置f2访问中断
地址=0040B000 //接着shift+f9运行
大小=00001000 (4096.)
物主=UnPackMe 00400000
区段=.ximo
包含=imports
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
0040B0A4 60 pushad //经过shift+f9后停在此处
0040B0A5 EB 02 jmp short UnPackMe.0040B0A9
0040B0A7 0A7450 83 or dh,byte ptr ds:
0040B0AB EC in al,dx
0040B0AC 04 C7 add al,0C7
0040B0AE 04 24 add al,24
0040B0B0 E6 D9 out 0D9,al
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 18 //在此设置f2访问中断
地址=00408000 //接着shift+f9运行
大小=00003000 (12288.)
物主=UnPackMe 00400000
区段=.ximo
包含=SFX,data,resources
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
0040B445 C00A 02 ror byte ptr ds:,2 //经过shift+f9后停在此处
0040B448 60 pushad
0040B449 68 AAD932F8 push F832D9AA
0040B44E 87D5 xchg ebp,edx
0040B450 EB 04 jmp short UnPackMe.0040B456
0040B452 23F1 and esi,ecx
0040B454 72 16 jb short UnPackMe.0040B46C
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 17 //在此设置f2访问中断
地址=00401000 //接着shift+f9运行
大小=00007000 (28672.)
物主=UnPackMe 00400000
区段=.ximo
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
0040015D A4 movs byte ptr es:,byte ptr ds: //开始f8单步吧
0040015E B6 80 mov dh,80 //注意打断向上跳转
00400160 FF13 call dword ptr ds:
00400162 ^ 73 F9 jnb short UnPackMe.0040015D
00400164 33C9 xor ecx,ecx
00400166 FF13 call dword ptr ds:
00400168 73 16 jnb short UnPackMe.00400180
0040016A 33C0 xor eax,eax
0040016C FF13 call dword ptr ds:
0040016E 73 1F jnb short UnPackMe.0040018F
━━━━━━━━━━━━━━━━━━━━━━━━━━
004001C6 FF53 10 call dword ptr ds: //过此CALL时有缓冲,即解码完成
004001C9 95 xchg eax,ebp
004001CA 8B07 mov eax,dword ptr ds:
004001CC 40 inc eax
004001CD ^ 78 F3 js short UnPackMe.004001C2
004001CF 75 03 jnz short UnPackMe.004001D4 //此跳转是向下跳的,但是FSG有特征,这个就是我们踩在巨人肩上的好处
004001D1 FF63 0C jmp dword ptr ds: ; //注意此处,即跳向我们的OEP啦,f4运行到所选,紧跟着F8单步一下,就到OEP
━━━━━━━━━━━━━━━━━━━━━━━━━━
00401700 55 push ebp //此处就是oep,运行lordpe脱壳,在运行lmportrce修复
00401701 8BEC mov ebp,esp //修复时发现我们的指针全部是无效的
00401703 6A FF push -1 //下面开始来手动查找IAT指针
00401705 68 00254000 push UnPackMe.00402500
0040170A 68 86184000 push UnPackMe.00401886
0040170F 64:A1 00000000 mov eax,dword ptr fs:
00401715 50 push eax
00401716 64:8925 0000000>mov dword ptr fs:,esp
0040171D 83EC 68 sub esp,68
00401720 53 push ebx
00401721 56 push esi
00401722 57 push edi
00401723 8965 E8 mov dword ptr ss:,esp
00401726 33DB xor ebx,ebx
00401728 895D FC mov dword ptr ss:,ebx
0040172B 6A 02 push 2
0040172D FF15 90214000 call dword ptr ds: //注意此句,我们在命令行出入 D 402190
━━━━━━━━━━━━━━━━━━━━━━━━━━
00402190 77C0537C msvcrt.__set_app_type //此时停在此处
00402194 77C05C94 msvcrt._except_handler3 //拉动滚动跳找代码全0以下的
00402198 77C1EE2F msvcrt._controlfp
0040219C 77C04DF8 msvcrt._onexit
004021A0 77C04E51 msvcrt.__dllonexit
━━━━━━━━━━━━━━━━━━━━━━━━━━
00401FF8 00000000
00401FFC 00000000
00402000 7C80B6A1 kernel32.GetModuleHandleA //这里即是我们的RVA
00402004 7C801EEE kernel32.GetStartupInfoA //现在我们在打开我们的importRCE修复
00402008 7FFFFFFF //OEP:1700 RVA:2000 大小:1000
0040200C 73D98D67 MFC42.#4486 //说下大小填1000就可以啦,不用刻意去计算
00402010 73D35EF1 MFC42.#2554 //直接获取输入表,出现有无效指针,直接剪切掉即可,修复可以运行手工
dumped脱壳后

小生我怕怕 发表于 2008-9-21 23:42

又研究了一种方法,应该算快一点的方法啦
断点:bp LoadLibraryA
━━━━━━━━━━━━━━━━━━━━━━━━━━
0040955C >60 pushad //OD载入
0040955DEB 04jmp short UnPackMe.00409563//下断 bp LoadLibraryA
0040955F625CE9 F1bound ebx,qword ptr ds: //shift+f9运行6次后返回
0040956387EB xchg ebx,ebp
00409565EB 03jmp short UnPackMe.0040956A
00409567^ E0 BBloopdne short UnPackMe.00409524
00409569B8 87EB83ECmov eax,EC83EB87
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801D77 >8BFF mov edi,edi //shift+f9运行1次后
7C801D7955 push ebp//如下几次变化均在堆栈窗口可见
7C801D7A8BEC mov ebp,esp //不要认为这里没有变
7C801D7C837D 08 00 cmp dword ptr ss:,0
7C801D8053 push ebx
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801D77 >8BFF mov edi,edi //shift+f9运行2次后
7C801D7955 push ebp
7C801D7A8BEC mov ebp,esp
7C801D7C837D 08 00 cmp dword ptr ss:,0
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801D77 >8BFF mov edi,edi //shift+f9运行3次后
7C801D7955 push ebp
7C801D7A8BEC mov ebp,esp
7C801D7C837D 08 00 cmp dword ptr ss:,0
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801D77 >8BFF mov edi,edi //shift+f9运行4次后
7C801D7955 push ebp
7C801D7A8BEC mov ebp,esp
7C801D7C837D 08 00 cmp dword ptr ss:,0
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801D77 >8BFF mov edi,edi //shift+f9运行5次后

7C801D7955 push ebp
7C801D7A8BEC mov ebp,esp
7C801D7C837D 08 00 cmp dword ptr ss:,0
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801D77 >8BFF mov edi,edi//shift+f9运行6次后
7C801D7955 push ebp //ait+b取消断点
7C801D7A8BEC mov ebp,esp//紧接着ait+f9返回程序领空
7C801D7C837D 08 00 cmp dword ptr ss:,0
━━━━━━━━━━━━━━━━━━━━━━━━━━
004001C995 xchg eax,ebp //ait+f9返回后停在此处
004001CA8B07 mov eax,dword ptr ds: //f8单步几步走
004001CC40 inc eax
004001CD^ 78 F3js short UnPackMe.004001C2
004001CF75 03jnz short UnPackMe.004001D4//还是老规矩此处为向下跳,但是跳下去后不久程序就运行
004001D1FF63 0Cjmp dword ptr ds: //这里即跳向OEP,f4运行到所选,紧跟着单步一步f8
004001D450 push eax
004001D555 push ebp
━━━━━━━━━━━━━━━━━━━━━━━━━━
0040170055push ebp //此处就是oep,运行lordpe脱壳,在运行lmportrce修复
004017018BECmov ebp,esp//修复时发现我们的指针全部是无效的
004017036A FF push -1//下面开始来手动查找IAT指针
0040170568 00254000 push UnPackMe.00402500
0040170A68 86184000 push UnPackMe.00401886
0040170F64:A1 00000000mov eax,dword ptr fs:
0040171550push eax
0040171664:8925 0000000>mov dword ptr fs:,esp
0040171D83EC 68 sub esp,68
0040172053push ebx
0040172156push esi
0040172257push edi
004017238965 E8 mov dword ptr ss:,esp
0040172633DBxor ebx,ebx
00401728895D FC mov dword ptr ss:,ebx
0040172B6A 02 push 2
0040172DFF15 90214000 call dword ptr ds://注意此句,我们在命令行出入 D 402190
━━━━━━━━━━━━━━━━━━━━━━━━━━
0040219077C0537Cmsvcrt.__set_app_type //此时停在此处
0040219477C05C94msvcrt._except_handler3 //拉动滚动跳找代码全0以下的
0040219877C1EE2Fmsvcrt._controlfp
0040219C77C04DF8msvcrt._onexit
004021A077C04E51msvcrt.__dllonexit
━━━━━━━━━━━━━━━━━━━━━━━━━━
00401FF800000000
00401FFC00000000
004020007C80B6A1kernel32.GetModuleHandleA //这里即是我们的RVA
004020047C801EEEkernel32.GetStartupInfoA//现在我们在打开我们的importRCE修复
004020087FFFFFFF//OEP:1700 RVA:2000 大小:1000
0040200C73D98D67MFC42.#4486 //说下大小填1000就可以啦,不用刻意去计算
0040201073D35EF1MFC42.#2554 //直接获取输入表,出现有无效指针,直接剪切掉即可,修复可以运行手工


unpack脱壳后

A-new 发表于 2008-9-22 09:01

BP LoadLibraryA

Shift + F9 5次 ALT+ F9 返回,到达这里

004001C9 95 xchg eax, ebp
004001CA 8B07 mov eax, dword ptr
004001CC 40 inc eax
004001CD ^ 78 F3 js short 004001C2
004001CF 75 03 jnz short 004001D4
004001D1 FF63 0C jmp dword ptr
004001D4 50 push eax
004001D5 55 push ebp
004001D6 FF53 14 call dword ptr
004001D9 AB stos dword ptr es:
004001DA ^ EB EE jmp short 004001CA
红色区,F2下断F9,F8一下,直达OEP

小李通讯 发表于 2008-9-22 11:03

首些查壳,普通扫描是yoda's Protector v1.02 (.dll,.ocx) -> Ashkbiz Danehkar (h) *

核心扫描是FSG 2.0 -> bart/xt

打开OD载入,用内存镜象法

首先在 0040B000 下断,然后F9运行,然后在00408000下断,继续F9,在00401000下断,继续F9

0040015DA4movs byte ptr es:,byte ptr>来到这里,F8单部走....
0040015EB6 80 mov dh,80
00400160FF13call dword ptr ds:
00400162^ 73 F9 jnb short UnPackMe.0040015D
0040016433C9xor ecx,ecx
00400166FF13call dword ptr ds:
0040016873 16 jnb short UnPackMe.00400180
0040016A33C0xor eax,eax
0040016CFF13call dword ptr ds:
0040016E73 1F jnb short UnPackMe.0040018F
00400170B6 80 mov dh,80
0040017241inc ecx
00400173B0 10 mov al,10
00400175FF13call dword ptr ds:
0040017712C0adc al,al
00400179^ 73 FA jnb short UnPackMe.00400175
0040017B75 3A jnz short UnPackMe.004001B7
0040017DAAstos byte ptr es:
0040017E^ EB E0 jmp short UnPackMe.00400160
00400180FF53 08 call dword ptr ds:
0040018302F6add dh,dh
0040018583D9 01 sbb ecx,1
0040018875 0E jnz short UnPackMe.00400198
0040018AFF53 04 call dword ptr ds:
0040018DEB 24 jmp short UnPackMe.004001B3
0040018FAClods byte ptr ds:
00400190D1E8shr eax,1
0040019274 2D je short UnPackMe.004001C1
0040019413C9adc ecx,ecx
00400196EB 18 jmp short UnPackMe.004001B0
0040019891xchg eax,ecx
0040019948dec eax
0040019AC1E0 08 shl eax,8
0040019DAClods byte ptr ds:
0040019EFF53 04 call dword ptr ds:
004001A13B43 F8 cmp eax,dword ptr ds:
004001A473 0A jnb short UnPackMe.004001B0
004001A680FC 05 cmp ah,5
004001A973 06 jnb short UnPackMe.004001B1
004001AB83F8 7F cmp eax,7F
004001AE77 02 ja short UnPackMe.004001B2
004001B041inc ecx
004001B141inc ecx
004001B295xchg eax,ebp
004001B38BC5mov eax,ebp
004001B5B6 00 mov dh,0
004001B756push esi
004001B88BF7mov esi,edi
004001BA2BF0sub esi,eax
004001BCF3:A4 rep movs byte ptr es:,byte>
004001BE5Epop esi
004001BF^ EB 9F jmp short UnPackMe.00400160
004001C15Epop esi
004001C2ADlods dword ptr ds:
004001C397xchg eax,edi
004001C4ADlods dword ptr ds:
004001C550push eax
004001C6FF53 10 call dword ptr ds:; kernel32.LoadLibraryA
004001C995xchg eax,ebp
004001CA8B07mov eax,dword ptr ds:
004001CC40inc eax
004001CD^ 78 F3 js short UnPackMe.004001C2 这里大家应该很熟悉吧,玩过FSG的应该都知道
004001CF75 03 jnz short UnPackMe.004001D4
004001D1FF63 0C jmp dword ptr ds: 这里F4,然后F8单部就到OEP了.......
004001D450push eax
004001D555push ebp
004001D6FF53 14 call dword ptr ds:
004001D9ABstos dword ptr es:
004001DA^ EB EE jmp short UnPackMe.004001CA


0040170055push ebp这里就是我们要找的OEP了........
004017018BECmov ebp,esp
004017036A FF push -1
0040170568 00254000 push UnPackMe.00402500
0040170A68 86184000 push UnPackMe.00401886; jmp 到 msvcrt._except_handler3
0040170F64:A1 00000000mov eax,dword ptr fs:
0040171550push eax
0040171664:8925 0000000>mov dword ptr fs:,esp
0040171D83EC 68 sub esp,68
0040172053push ebx
0040172156push esi
0040172257push edi
004017238965 E8 mov dword ptr ss:,esp
0040172633DBxor ebx,ebx
00401728895D FC mov dword ptr ss:,ebx
0040172B6A 02 push 2
0040172DFF15 90214000 call dword ptr ds:我们就找这种CALL来查找RVA....
0040173359pop ecx
00401734830D 2C314000 F>or dword ptr ds:,FFFFFF>


然后用LordPE修复,再修复....

这种壳大家应该知道是要手动查找RVA的

0040172DFF15 90214000 call dword ptr ds:我们就找这种CALL来查找RVA....

在命令行输入 d 402190 然后回车

然后一直往上走,走到为零的地方

00401FFC00000000
004020007C80B731kernel32.GetModuleHandleA这里就是 RVA 了...(开始地址)
004020047C801EF2kernel32.GetStartupInfoA
004020087FFFFFFF
0040200C73D98D67mfc42.#4486
0040201073D35EF1mfc42.#2554
0040201473D497A0mfc42.#2512
0040201873D4224Emfc42.#5731
0040201C73DC9FEDmfc42.#3922
0040202073D41CF0mfc42.#1089
0040202473D41273mfc42.#5199
0040202873D40CC9mfc42.#2396
0040202C73D31300mfc42.#3346
0040203073D35126mfc42.#5300下面还有很多,就不复制了

查找大小有2中方法,一种是往下拉,拉到为零的地方,然后用 结束地址-开始地址=大小了


另一种就是懒方法,我们都很常用的,大小就填1000,不过会有很多无效指针...,剪切掉就OK了


OEP1700

RVA2000

大小 1000

OK,修复完成!!!


注明:查找OEP是参考小生哥的,修复纯自己搞的。所以钱就不要了,留个脚印。

下雪天 发表于 2008-9-22 11:27

【破文标题】吾爱破解的UnPackMe脱壳
【破文作者】小小菜鸟
【作者邮箱】
【作者主页】
【破解工具】ODLordPE_hhImportREC_fix_HH
【破解平台】XP SP2
【软件名称】吾爱第二次脱壳练习
【软件大小】13.0 KB
【原版下载】http://www.52pojie.cn/read.php?tid-10607.html
【保护方式】FSG 2.0 -> bart/xt
【软件简介】吾爱第二次脱壳练习
【破解声明】练习专用 呵呵
------------------------------------------------------------------------
【破解过程】0040955C >60 pushad-----------------堆栈操作
0040955DEB 04jmp short UnPackMe.00409563-------数据窗口跟随数据区下硬件写入 DWORD断点 F9运行
ESP定律
004095A941 inc ecx----------删除断点
004095AA60 pushad
004095ABEB 04jmp short UnPackMe.004095B1----------继续ESP定律
数据窗口跟随数据区下硬件写入 DWORD断点 F9运行

0040B26A55 push ebp ; kernel32.7C800000
到这里删除断点
0040B26BFFD6 call esi
0040B26DFFD0 call eax
0040B26F890424 mov dword ptr ss:,eax
接下来 还是很多危险
我说明下 下面单步跟踪的原则
CALL 后面带字母的 下面的一句 F2下断F9运行清除断点继续
带数字的F7跟入
往回跳的 下面的一步 F2下断F9运行清除断点继续举几个例子 具体的很多就不说了
0040B26A55 push ebp ; kernel32.7C800000
0040B26BFFD6 call esi
0040B26DFFD0 call eax
0040B26F890424 mov dword ptr ss:,eax------ F2下断F9运行清除断点继续

0040B28355 push ebp ; kernel32.7C800000
0040B284FFD6 call esi
0040B286FFD0 call eax
0040B2886A 00push 0-------------F2下断F9运行清除断点继续
0040B28AE8 0B000000call UnPackMe.0040B29A----------F7

0040B4D1^\0F85 60FFFFFFjnz UnPackMe.0040B437----------往回跳
0040B4D757 push edi---------------F2下断F9运行清除断点继续
0040B4D856 push esi


0040B5F1894424 04mov dword ptr ss:,eax
0040B5F5FFD6 call esi ; kernel32.GetProcAddress

千万不要跟入会迷失在系统领空的
0040B5F783EC 08sub esp,8---------------F2下断F9运行清除断点继续


经过了N久之后
0040B63147 inc edi
0040B6324F dec edi
0040B63387DF xchg edi,ebx
0040B635E8 00000000call UnPackMe.0040B63A
0040B63A60 pushad
0040B63B43 inc ebx
0040B63C4B dec ebx
0040B63D61 popad
0040B63EC3 retn
0040B63F0000 add byte ptr ds:,al
RETN 两次之后 返回到一个大跳转
004001548725 24A94000xchg dword ptr ds:,esp
0040015A61 popad
0040015B94 xchg eax,esp
0040015C55 push ebp
0040015DA4 movs byte ptr es:,byte ptr ds:
0040015EB6 80mov dh,80

继续单步往回跳的在下面一处-----------------F2下断F9运行清除断点继续例如

0040017E^\EB E0jmp short UnPackMe.00400160
00400180FF53 08call dword ptr ds:----F2下断F9运行清除断点继续
到了
004001C6FF53 10call dword ptr ds:---------堆栈数据迅速变化
004001C995 xchg eax,ebp

终于到了 最关键的地方
004001CF /75 03jnz short UnPackMe.004001D4-------本来往下跳的 .但是跳了就跑飞了
经历N次失败后 明白不能跳
004001D1 |FF63 0Cjmp dword ptr ds:---------此处下断-------F2下断F9运行清除断点继续 飞向 OEP
004001D4 \50 push eax
删除分析后可以看到OEP

0040170055 push ebp ; SHELL32.#599
004017018BEC mov ebp,esp
004017036A FFpush -1
0040170568 00254000push UnPackMe.00402500
0040170A68 86184000push UnPackMe.00401886 ; jmp to msvcrt._except_handler3
0040170F64:A1 00000000 mov eax,dword ptr fs:
0040171550 push eax
0040171664:8925 00000000 mov dword ptr fs:,esp
0040171D83EC 68sub esp,68
0040172053 push ebx
0040172156 push esi
0040172257 push edi
004017238965 E8mov dword ptr ss:,esp
0040172633DB xor ebx,ebx
00401728895D FCmov dword ptr ss:,ebx
0040172B6A 02push 2
0040172DFF15 90214000call dword ptr ds: ; msvcrt.__set_app_type

然后是LordPE_hh 修正镜象大小完整转存
接下来就是 IAT修复了

OEP处填了1700 自动查找获取输入表 10个 有效显然不对
修复转存后 运行出错
查阅 资料三人行大大的教程有 手动 修复IAT应用如下

0040170055 push ebp ; SHELL32.#599
004017018BEC mov ebp,esp
004017036A FFpush -1
0040170568 00254000push UnPackMe.00402500
0040170A68 86184000push UnPackMe.00401886 ; jmp to msvcrt._except_handler3
0040170F64:A1 00000000 mov eax,dword ptr fs:
0040171550 push eax
0040171664:8925 00000000 mov dword ptr fs:,esp
0040171D83EC 68sub esp,68
0040172053 push ebx
0040172156 push esi
0040172257 push edi
004017238965 E8mov dword ptr ss:,esp
0040172633DB xor ebx,ebx
00401728895D FCmov dword ptr ss:,ebx
0040172B6A 02push 2
0040172DFF15 90214000call dword ptr ds: ; msvcrt.__set_app_type
----------------------------------------关键处显然是跳向 IAT的
0040173359 pop ecx
00401734830D 2C314000 FF or dword ptr ds:,FFFFFFFF
0040173B830D 30314000 FF or dword ptr ds:,FFFFFFFF
00401742FF15 8C214000call dword ptr ds: ; msvcrt.__p__fmode
光标移向数据窗口

右键点击----------菜单-------前往------->表达式填入402190---确定
向上翻找到

00401FF000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
00402000A1 B6 80 7C EE 1E 80 7C FF FF FF 7F 67 8D D9 73《

傻人有傻福 发表于 2008-9-22 11:45

**** Hidden Message *****

lqiulu 发表于 2008-9-23 10:05



两种方法进行处理:
方法一:

查找特征代码,popad
xchg eax,esp即二进制代码“6194”
ctrl + G到400000,ctrl + B 查找“6194”到这里:

0040015A61popad
0040015B94xchg eax,esp//这里下断,F9运行。断下后看堆栈:
0040015C55push ebp
0040015DA4movs byte ptr es:,byte ptr ds:
0040015EB6 80 mov dh,80
00400160FF13call dword ptr ds:
00400162^ 73 F9 jnb short UnPackMe.0040015D

堆栈:
0040A928 004001E8UnPackMe.004001E8
0040A92C 004001DCUnPackMe.004001DC
0040A930 004001DEUnPackMe.004001DE
0040A934 00401700UnPackMe.00401700 //这里就是OEP。到OEP地址下硬件执行断点,断下后dump后修复。
0040A938 7C801D7Bkernel32.LoadLibraryA
0040A93C 7C80AE30kernel32.GetProcAddress

方法二:

下断点:bp GetModuleHandleA

F9运行程序,断下后ALT + F9返回,(我这里ALT + F9两次):

004001C995xchg eax,ebp
004001CA8B07mov eax,dword ptr ds:
004001CC40inc eax
004001CD^ 78 F3 js short UnPackMe.004001C2
004001CF75 03 jnz short UnPackMe.004001D4
004001D1FF63 0C jmp dword ptr ds://这里下断点,断下后就是跳往OEP的。
004001D450push eax
004001D555push ebp
004001D6FF53 14 call dword ptr ds:
004001D9ABstos dword ptr es:
004001DA^ EB EE jmp short UnPackMe.004001CA
004001DC33C9xor ecx,ecx
004001DE41inc ecx


0040170055push ebp ;//程序OEP.
004017018BECmov ebp,esp
004017036A FF push -1
0040170568 00254000 push UnPackMe.00402500
0040170A68 86184000 push UnPackMe.00401886 ; jmp to msvcrt._except_handler3
0040170F64:A1 00000000mov eax,dword ptr fs:

修复:
OEP:1700
RAV:1FFC
SIZE:1E0(21E0-2000)

00401FFC00000000
004020007C80B731kernel32.GetModuleHandleA
......................................................................
004021DC77D2F3C2USER32.SendMessageA
004021E07FFFFFFF
页: [1] 2
查看完整版本: 吾爱专题脱壳练习----压缩壳练习之二