- UID
- 34236
注册时间2007-8-13
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
适用范围 只是部分压缩或加密后 原IAT结构没被破坏的壳,是给和我一样属于新手级的人看的 高手飘过
昨天下好那个200M的脱壳教程,今天打算慢慢学习的 本来修复IAT只要ImportREC就可以了
一来 总是OD DUMP ,ImportREC修复 自动化的过程太没意思。。。二来想熟悉下PE结构 所以拿了一个简单的压缩壳试试手
被压缩或加密的文件 之所以系统载入的时候 IAT没有自动被填充 其实是因为 壳在PE头里把可选头里的 导入表 结构给替换
成自己的导入表 假设一个壳只用LoadLibrary和GetProcessAddress这两个函数 加密后的文件载入系统 ,系统根据PE结构
找到导入表(此时导入表已经是壳的导入表)所以系统填充的是壳所需的函数地址 再由壳来模仿系统 填入文件所需的函数地址
因为原IAT没被破坏 只是在PE头的偏移被覆盖了 那么在系统装载前把PE头指向导入表的IMAGE_DIRECTORY_ENTRY_IMPORT
结构改回来 那么系统应该就会自动填充原文件的IAT,但是由于我们文件是被压缩过的,直接改的话那壳所需要的函数就因为没有地址
而无法运行 所以可以在DUMP后再改回原文件的IAT偏移就可以了。。。。。。。。那么再直接运行的话就可以了
废话不说了 贴代码,可能有人没有下那个教程 样本放附件了
挑重要的贴 反正是简单壳 属于ESP就能解决的 相信一步一步跟 绝大多数人 都行的
0046A22E FFB5 7E324000 PUSH DWORD PTR SS:[EBP+40327E] ; IMAGEBASE入栈
0046A234 FFB5 D8324000 PUSH DWORD PTR SS:[EBP+4032D8] ;注意这里入栈的就是原文件的IAT的RVA
可以看到源文件的IAT是第4个节
0046A23A E8 7F020000 CALL UnPackMe.0046A4BE repairIAT 这个函数里第一个CALL就是修复IAT的函数
{
0046A4DC 8B0E MOV ECX,DWORD PTR DS:[ESI] ;OriginalFirstThunk
0046A4DE 8B7E 10 MOV EDI,DWORD PTR DS:[ESI+10] ;FirstThunk
0046A4E1 0BC9 OR ECX,ECX
0046A4E3 75 02 JNZ SHORT UnPackMe.0046A4E7
0046A4E5 8BCF MOV ECX,EDI
0046A4E7 03CA ADD ECX,EDX
0046A4E9 03FA ADD EDI,EDX
0046A4EB 8B01 MOV EAX,DWORD PTR DS:[ECX]
0046A4ED 0BC0 OR EAX,EAX
0046A4EF 74 76 JE SHORT UnPackMe.0046A567
0046A4F1 A9 00000080 TEST EAX,80000000 检验是否以序号导入,不为0则以序号导入
0046A4F6 74 0E JE SHORT UnPackMe.0046A506
0046A4F8 8D85 D0324000 LEA EAX,DWORD PTR SS:[EBP+4032D0]
0046A4FE 8985 86324000 MOV DWORD PTR SS:[EBP+403286],EAX
0046A504 EB 0A JMP SHORT UnPackMe.0046A510
0046A506 40 INC EAX ;IMAGE_IMPORT_BY_NAME.Hint
0046A507 40 INC EAX
0046A508 03C2 ADD EAX,EDX IMAGE_IMPORT_BY_NAME.Name1
0046A50A 8985 86324000 MOV DWORD PTR SS:[EBP+403286],EAX
0046A510 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C] DLL名
0046A513 0BC0 OR EAX,EAX
0046A515 74 50 JE SHORT UnPackMe.0046A567
0046A517 03C2 ADD EAX,EDX
0046A519 51 PUSH ECX
0046A51A 52 PUSH EDX
0046A51B 50 PUSH EAX
0046A51C FF95 A0334000 CALL DWORD PTR SS:[EBP+4033A0] ; kernel32.LoadLibraryA
0046A522 5A POP EDX
0046A523 59 POP ECX
0046A524 0BC0 OR EAX,EAX
0046A526 74 41 JE SHORT UnPackMe.0046A569
0046A528 8985 82324000 MOV DWORD PTR SS:[EBP+403282],EAX
0046A52E 8B19 MOV EBX,DWORD PTR DS:[ECX]
0046A530 83C1 04 ADD ECX,4
0046A533 0BDB OR EBX,EBX
0046A535 74 30 JE SHORT UnPackMe.0046A567
0046A537 8BC3 MOV EAX,EBX
0046A539 F7C3 00000080 TEST EBX,80000000 检验是否以序号导入,不为0则以序号导入
0046A53F 74 0A JE SHORT UnPackMe.0046A54B
0046A541 81E3 FFFF0000 AND EBX,0FFFF
0046A547 51 PUSH ECX
0046A548 52 PUSH EDX
0046A549 EB 06 JMP SHORT UnPackMe.0046A551
0046A54B 43 INC EBX
0046A54C 43 INC EBX
0046A54D 03DA ADD EBX,EDX
0046A54F 51 PUSH ECX
0046A550 52 PUSH EDX
0046A551 53 PUSH EBX
0046A552 FFB5 82324000 PUSH DWORD PTR SS:[EBP+403282]
0046A558 FF95 A4334000 CALL DWORD PTR SS:[EBP+4033A4] GetProcaddress
0046A55E 5A POP EDX
0046A55F 59 POP ECX
0046A560 0BC0 OR EAX,EAX
0046A562 74 05 JE SHORT UnPackMe.0046A569
0046A564 AB STOS DWORD PTR ES:[EDI]
0046A565 ^ EB C7 JMP SHORT UnPackMe.0046A52E
0046A567 F8 CLC
0046A568 C3 RETN
}
修复IAT后 到达 OEP
0046A278 68 B0714200 PUSH UnPackMe.004271B0 ;OEP
0046A27D C3 RETN
用LOADPE dump (OD插件DUMP后 会自动修复IAT )
直接运行DUMP后的文件 会出现初始化的错误 换句话说需要自己修复IAT后才能正常运行
根据PE结构 找到IMAGE_DIRECTORY_ENTRY_IMPORT(就是PE HEADER偏移+80H的地方)将上面分析过程中的得到的原文件的IAT的RVA 60000填入 注意 字节的顺序
运行
原理很简单 不过 貌似 没什么用 毕竟强壳都是破坏了IAT结构的 权当加深PE结构的熟悉,发现手动修复一个 还是比自动化生产线修复更有成就感 ^_^
对于破坏IAT的 需要建新节根据PE结构自己填充,麻烦死。貌似加密解密3有详细的手动修复方法
[ 本帖最后由 xhn1002 于 2008-9-2 19:05 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入我们
x
评分
-
查看全部评分
|