找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 684|回复: 1

菜鸟也脱未知加密壳诀窍

[复制链接]

633

主题

3624

回帖

9063

牛毛

论坛管理员

堕落天使

积分
11301
QQ
发表于 2008-10-30 18:56:51 | 显示全部楼层
天无意中发现了这个东东,试了一下很简单的,适合我等新手练习练习。

点击浏览该文件

第一步:寻找OEP

用IsDebug 1.4插件去掉Ollydbg的调试器标志,设置Ollydbg忽略除了“内存访问异常”之外的所有异常选项。

F9运行,程序中断在异常处,然后按4次Shift+F9跳过异常

003C27278B00MOV EAX,DWORD PTR DS:[EAX]//第一次异常

003C14BC /7C 03 JL SHORT 003C14C1 //第二次异常

003C2AF36285 F4290000 BOUND EAX,QWORD PTR SS:[EBP+29F4] //第三次异常

0040D46F8700XCHG DWORD PTR DS:[EAX],EAX //第四次异常,够了,再按一次程序就运行了!


这是看看堆栈的内容

0012FF94 00000206指针到下一个 SEH 记录
0012FF98 0040D06ESE 句柄 //不用说了吧,就去这里下断吧。
0012FF9C 0040F41CUnpackMe.0040F41C


在0040D06E处下断,Shift+F9来到此处

0040D06E8B5C24 0C MOV EBX,DWORD PTR SS:[ESP+C]

0040D07281AB B8000000 2>SUB DWORD PTR DS:[EBX+B8],24//Context.eip-24,此时堆栈值0040D46F-24=0040D44B
0040D07C33C0XOR EAX,EAX //表示已修复,可以从异常处继续执行
0040D07EC3RETN //系统取Context内容,下一步将从Context.eip处执行。


0040D07281AB B8000000 2>SUB DWORD PTR DS:[EBX+B8],24//减法指令

运行到这一行,你就可以看到DS:[EBX+B8]的值为0040D46F,执行这条指令后,不就是0040D46F-24=0040D44B

注意这里千万不能返回,因为这个RET并非是一个CALL的结束,它的作用是返回系统异常执行处理程序里,系统取堆栈里的
Context环境结构内容,使线程继续执行。

好了,剩下的内容大家都知道怎么做了吧。

去往0040D44B处断,F9运行

不用慢慢手动步过,命令行下命令

Tc eip<40D000

呵,停在Oep处。

0040D44BB8 55010000 MOV EAX,155
0040D45056PUSH ESI
0040D4518DB5 80000000 LEA ESI,DWORD PTR SS:[EBP+80]
0040D457B9 CB030000 MOV ECX,3CB
0040D45C3006XOR BYTE PTR DS:[ESI],AL
0040D45E46INC ESI
0040D45F^ E2 FB LOOPD SHORT UnpackMe.0040D45C
0040D4615EPOP ESI
0040D462^ E9 19FCFFFF JMP UnpackMe.0040D080//往上跳

0040D08064:8F05 0000000>POP DWORD PTR FS:[0] //条到这里,以下全用F8带过
0040D08783C4 04 ADD ESP,4
0040D08A8DB5 50060000 LEA ESI,DWORD PTR SS:[EBP+650]
0040D09056PUSH ESI
0040D091FF95 38060000 CALL DWORD PTR SS:[EBP+638]
0040D0970BC0OR EAX,EAX
0040D09975 07 JNZ SHORT UnpackMe.0040D0A2
0040D09B56PUSH ESI
0040D09CFF95 3C060000 CALL DWORD PTR SS:[EBP+63C]
0040D0A250PUSH EAX
0040D0A38D9D B8040000 LEA EBX,DWORD PTR SS:[EBP+4B8]
0040D0A953PUSH EBX
0040D0AA50PUSH EAX
0040D0ABFF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D0B18985 C6040000 MOV DWORD PTR SS:[EBP+4C6],EAX
0040D0B758POP EAX
0040D0B850PUSH EAX
0040D0B98D9D CA040000 LEA EBX,DWORD PTR SS:[EBP+4CA]
0040D0BF53PUSH EBX
0040D0C050PUSH EAX
0040D0C1FF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D0C78985 E0040000 MOV DWORD PTR SS:[EBP+4E0],EAX
0040D0CD58POP EAX
0040D0CE50PUSH EAX
0040D0CF8D9D E4040000 LEA EBX,DWORD PTR SS:[EBP+4E4]
0040D0D553PUSH EBX
0040D0D650PUSH EAX
0040D0D7FF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D0DD8985 F0040000 MOV DWORD PTR SS:[EBP+4F0],EAX
0040D0E358POP EAX
0040D0E450PUSH EAX
0040D0E58D9D F4040000 LEA EBX,DWORD PTR SS:[EBP+4F4]
0040D0EB53PUSH EBX
0040D0EC50PUSH EAX
0040D0EDFF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D0F38985 FD040000 MOV DWORD PTR SS:[EBP+4FD],EAX
0040D0F958POP EAX
0040D0FA8D9D 11050000 LEA EBX,DWORD PTR SS:[EBP+511]
0040D10053PUSH EBX
0040D10150PUSH EAX
0040D102FF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D1088985 20050000 MOV DWORD PTR SS:[EBP+520],EAX
0040D10E8DB5 AD040000 LEA ESI,DWORD PTR SS:[EBP+4AD]
0040D11456PUSH ESI
0040D115FF95 38060000 CALL DWORD PTR SS:[EBP+638]
0040D11B0BC0OR EAX,EAX
0040D11D75 07 JNZ SHORT UnpackMe.0040D126
0040D11F56PUSH ESI
0040D120FF95 3C060000 CALL DWORD PTR SS:[EBP+63C]
0040D1268D9D 01050000 LEA EBX,DWORD PTR SS:[EBP+501]
0040D12C53PUSH EBX
0040D12D50PUSH EAX
0040D12EFF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D1348985 0D050000 MOV DWORD PTR SS:[EBP+50D],EAX
0040D13A8D9D 4C050000 LEA EBX,DWORD PTR SS:[EBP+54C]
0040D14053PUSH EBX
0040D141FF95 C6040000 CALL DWORD PTR SS:[EBP+4C6]
0040D1478B85 91040000 MOV EAX,DWORD PTR SS:[EBP+491]
0040D14D83F8 01 CMP EAX,1
0040D1500F85 D7000000 JNZ UnpackMe.0040D22D//跳了

0040D22D33C0XOR EAX,EAX//跳到这里,继续按F8带过
0040D22F8B8D 74050000 MOV ECX,DWORD PTR SS:[EBP+574]
0040D2358BB5 70050000 MOV ESI,DWORD PTR SS:[EBP+570]
0040D23B03B5 71040000 ADD ESI,DWORD PTR SS:[EBP+471]
0040D2418D4481 43 LEA EAX,DWORD PTR DS:[ECX+EAX*4+43]
0040D2453006XOR BYTE PTR DS:[ESI],AL
0040D247D40AAAM
0040D24946INC ESI
0040D24A^ E2 F5 LOOPD SHORT UnpackMe.0040D241 //循环
0040D24CE8 F9000000 CALL UnpackMe.0040D34A //按F4来到这里
0040D2516A 04 PUSH 4
0040D25368 00100000 PUSH 1000
0040D25868 00100000 PUSH 1000
0040D25D6A 00 PUSH 0
0040D25FFF95 44060000 CALL DWORD PTR SS:[EBP+644]
0040D2658985 89040000 MOV DWORD PTR SS:[EBP+489],EAX
0040D26B8BB5 79040000 MOV ESI,DWORD PTR SS:[EBP+479]
0040D27103B5 71040000 ADD ESI,DWORD PTR SS:[EBP+471]
0040D2778B3EMOV EDI,DWORD PTR DS:[ESI]
0040D27985FFTEST EDI,EDI
0040D27B0F84 8B000000 JE UnpackMe.0040D30C
0040D28103BD 71040000 ADD EDI,DWORD PTR SS:[EBP+471]
0040D28783C6 05 ADD ESI,5
0040D28A56PUSH ESI
0040D28BFF95 38060000 CALL DWORD PTR SS:[EBP+638]
0040D29185C0TEST EAX,EAX
0040D29375 07 JNZ SHORT UnpackMe.0040D29C
0040D29556PUSH ESI
0040D296FF95 3C060000 CALL DWORD PTR SS:[EBP+63C]
0040D29C8985 85040000 MOV DWORD PTR SS:[EBP+485],EAX
0040D2A246INC ESI
0040D2A38A0EMOV CL,BYTE PTR DS:[ESI]
0040D2A584C9TEST CL,CL
0040D2A7^ 75 F9 JNZ SHORT UnpackMe.0040D2A2//循环
0040D2A946INC ESI//按F4下来
0040D2AA8A0EMOV CL,BYTE PTR DS:[ESI]
0040D2AC0AC9OR CL,CL
0040D2AE75 0A JNZ SHORT UnpackMe.0040D2BA
0040D2B08A4E 03 MOV CL,BYTE PTR DS:[ESI+3]
0040D2B380F9 80 CMP CL,80
0040D2B674 02 JE SHORT UnpackMe.0040D2BA
0040D2B8EB 4C JMP SHORT UnpackMe.0040D306
0040D2BA8B06MOV EAX,DWORD PTR DS:[ESI]
0040D2BC3D 00000080 CMP EAX,80000000
0040D2C176 0B JBE SHORT UnpackMe.0040D2CE
0040D2C325 FFFFFF0F AND EAX,0FFFFFFF
0040D2C850PUSH EAX
0040D2C983C6 04 ADD ESI,4
0040D2CCEB 08 JMP SHORT UnpackMe.0040D2D6
0040D2CE56PUSH ESI
0040D2CF46INC ESI
0040D2D08A0EMOV CL,BYTE PTR DS:[ESI]
0040D2D284C9TEST CL,CL
0040D2D4^ 75 F9 JNZ SHORT UnpackMe.0040D2CF//循环
0040D2D6FFB5 85040000 PUSH DWORD PTR SS:[EBP+485] //按F4下来
0040D2DCFF95 34060000 CALL DWORD PTR SS:[EBP+634]
0040D2E28B8D 89040000 MOV ECX,DWORD PTR SS:[EBP+489]
0040D2E8890FMOV DWORD PTR DS:[EDI],ECX
0040D2EAC601 B8 MOV BYTE PTR DS:[ECX],0B8
0040D2ED41INC ECX
0040D2EE8901MOV DWORD PTR DS:[ECX],EAX
0040D2F083C1 04 ADD ECX,4
0040D2F366:C701 FFE0MOV WORD PTR DS:[ECX],0E0FF
0040D2F883C1 02 ADD ECX,2
0040D2FB898D 89040000 MOV DWORD PTR SS:[EBP+489],ECX
0040D30183C7 04 ADD EDI,4
0040D304^ EB A3 JMP SHORT UnpackMe.0040D2A9 //向上跳,又是一个大循环,仔细观察发现0040D2B8处可
跳出这个循环
0040D30646INC ESI //按F4下来
0040D307^ E9 6BFFFFFF JMP UnpackMe.0040D277//继续循环,发现0040D27B处可跳出此循环
0040D30C6A 00 PUSH 0 //按F4下来
0040D30E54PUSH ESP
0040D30F6A 04 PUSH 4
0040D31168 00100000 PUSH 1000
0040D316FFB5 71040000 PUSH DWORD PTR SS:[EBP+471]
0040D31CFF95 20050000 CALL DWORD PTR SS:[EBP+520]
0040D32283C4 04 ADD ESP,4
0040D3258B85 71040000 MOV EAX,DWORD PTR SS:[EBP+471]
0040D32B8B58 3C MOV EBX,DWORD PTR DS:[EAX+3C]
0040D32E03D8ADD EBX,EAX
0040D33083C3 16 ADD EBX,16
0040D33366:810B 0020OR WORD PTR DS:[EBX],2000
0040D33861POPAD //哈哈,见到阳光了
0040D3398B85 75040000 MOV EAX,DWORD PTR SS:[EBP+475]
0040D33F5DPOP EBP
0040D34050PUSH EAX
0040D341C3RETN//返回004010CC

004010CC55PUSH EBP//这里就是OEP了。因为这个壳会修改PE头,只好用LordPE DUMP了
004010CD8BECMOV EBP,ESP
004010CF83EC 44 SUB ESP,44
004010D256PUSH ESI
004010D3FF15 E4634000 CALL DWORD PTR DS:[4063E4]
004010D98BF0MOV ESI,EAX
004010DB8A00MOV AL,BYTE PTR DS:[EAX]
004010DD3C 22 CMP AL,22
004010DF75 1B JNZ SHORT UnpackMe.004010FC
004010E156PUSH ESI
004010E2FF15 F4644000 CALL DWORD PTR DS:[4064F4]
004010E88BF0MOV ESI,EAX


第二步:修复

至于修复最简单的就是用ImporREC了,用追踪层次3可以全部修复指针。



当然也可以手动修复,下断
bp GetProcAddress

慢慢往下跟就会发现MOV [EDI],ECX等这几行代码,此时EAX中是GetProcAddress返回地址,EDI是指向IAT,将其改为MOV
[EDI],EAX,这样外壳就会将正确的地址填充到IAT结构中。

脱壳后的程序过大,用FileScan优化一下就行了。

633

主题

3624

回帖

9063

牛毛

论坛管理员

堕落天使

积分
11301
QQ
 楼主| 发表于 2008-10-30 18:56:20 | 显示全部楼层 |阅读模式
【背景介绍】

一个加密保护壳,用PEID未查出壳类型,《加密与解密》二版上的东西,说是因为篇幅没有贴教程,但附有脱壳要点,然而本人太菜,看不懂要点,也不知道要点怎么去操作,只得自己摸索,结果三弄两弄,竟然成功脱了,一看文件8M多,心想发了,可惜脱出来的既不是黄金也不是裸女

【详尽步骤】(限于篇幅就不贴代码了)

1。OD载入,选否,按F9运行,按3次SHIFT+F9(第4次就运行了!);
2。ALT+M,在00401000 code 在这行按F2下断,按SHIFT+F9断下;
3。然后小心而使用大胆的使用F7,F8,F4,直到来到004010CC这行;
4。用LordPE dump出来(如果用OD dump会提示出错);
5。关闭OD,运行未脱壳的文件,用IMPROTREC载入进程;(不关OD importrec修复时没反应);
6。OEP处填000010CC,点IAT AUTOSEARCH, 再点 GET Imports;
7。点 Show Invalid ,在选中的函数上点右键,点 Trace Level3(Trap Flag),等待一会;
8。看到全部都是Valid:YES了,点Fix Dump修复脱出来的文件吧!

【个人心得】
1.高手们的经验是菜鸟们进步的财富;
2.不断更新的工具是成功当然也是偷懒的捷径;
3.其实我早该会的,只是……(我的意思是新手尽量不要花太长的不必要的时间在一些基本的简单问题上)


【转载自原文的脱壳要点】(供深入研究者参考,我本人是没有看的)

1、找OEP大概11个SEH调用后,再跟几步就能找到。
2、DUMP取数据
由于UnpackMe.exe内存映像有9M之多,因此Dump后必须将其减肥。将Dump取的境像文件最后两个区块删除(即
偏移地址为0xd000后的数据全删)

或直接抓取前0xD000大小的数据:PAGEIN D 400000 D000 \\??\\C:\\dump.exe

3、输入表
外壳模拟Windows装载器填充IAT时,会对IAT成员加密(即Hook API),此时IAT的成员指向的是外壳代码。
由于加入了许多垃圾代码干扰,此时用ImportREC是不能重建得到输入表的。
所以第一步就是要得到没加密的IAT。

方法如下:

bpm 4062E4(记事本程序的IAT位置是4062E4)
同时观察数据窗口DD 4062E4 变化

或用这个断点:bpx getprocadress

会来到如下代码处:
001B:0040D2A946INC ESI
001B:0040D2AA8A0EMOV CL,[ESI]
001B:0040D2AC0AC9ORCL,CL
001B:0040D2AE750AJNZ 0040D2BA
001B:0040D2B08A4E03MOV CL,[ESI+03]
001B:0040D2B380F980CMP CL,80
001B:0040D2B67402JZ0040D2BA
001B:0040D2B8EB4CJMP 0040D306
001B:0040D2BA8B06MOV EAX,[ESI]
001B:0040D2BC3D00000080CMP EAX,80000000
001B:0040D2C1760BJBE 0040D2CE
001B:0040D2C325FFFFFF0FAND EAX,0FFFFFFF
001B:0040D2C850PUSHEAX
001B:0040D2C983C604ADD ESI,04
001B:0040D2CCEB08JMP 0040D2D6
001B:0040D2CE56PUSHESI
001B:0040D2CF46INC ESI
001B:0040D2D08A0EMOV CL,[ESI]
001B:0040D2D284C9TESTCL,CL
001B:0040D2D475F9JNZ 0040D2CF
001B:0040D2D6FFB585040000PUSHDWORD PTR [EBP+00000485]
001B:0040D2DCFF9534060000CALL[EBP+00000634]
001B:0040D2E28B8D89040000MOV ECX,[EBP+00000489]
001B:0040D2E8890FMOV [EDI],ECX// 此行,下A命令改成mov [edi],eax
001B:0040D2EAC601B8MOV BYTE PTR [ECX],B8
001B:0040D2ED41INC ECX
001B:0040D2EE8901MOV [ECX],EAX
001B:0040D2F083C104ADD ECX,04
001B:0040D2F366C701FFE0MOV WORD PTR [ECX],E0FF
001B:0040D2F883C102ADD ECX,02
001B:0040D2FB898D89040000MOV [EBP+00000489],ECX
001B:0040D30183C704ADD EDI,04
001B:0040D304EBA3JMP 0040D2A9

在001B:0040D2E8一行,此时EAX中是getprocadress返回的函数地址,EDI指向的IAT,因此将代码改成mov [edi],eax,这样外壳会将正确
的函数地址填充到IAT结构中。程序运行后,再用ImportREC重建输入表。
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-4-28 09:11 , Processed in 0.135853 second(s), 37 queries .

Powered by Discuz! X3.5

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