|
楼主 |
发表于 2008-10-9 22:34:41
|
显示全部楼层
|阅读模式
来自 广东省湛江市
适用范围比较窄的修复IAT方法
适用范围 只是部分压缩或加密后 原IAT结构没被破坏的壳,是给和我一样属于新手级的人看的 高手飘过
昨天下好那个200M的脱壳教程,今天打算慢慢学习的本来修复IAT只要ImportREC就可以了
一来总是ODDUMP,ImportREC修复 自动化的过程太没意思。。。二来想熟悉下PE结构 所以拿了一个简单的压缩壳试试手
被压缩或加密的文件 之所以系统载入的时候IAT没有自动被填充其实是因为 壳在PE头里把可选头里的 导入表 结构给替换
成自己的导入表假设一个壳只用LoadLibrary和GetProcessAddress这两个函数加密后的文件载入系统,系统根据PE结构
找到导入表(此时导入表已经是壳的导入表)所以系统填充的是壳所需的函数地址 再由壳来模仿系统 填入文件所需的函数地址
因为原IAT没被破坏 只是在PE头的偏移被覆盖了那么在系统装载前把PE头指向导入表的IMAGE_DIRECTORY_ENTRY_IMPORT
结构改回来 那么系统应该就会自动填充原文件的IAT,但是由于我们文件是被压缩过的,直接改的话那壳所需要的函数就因为没有地址
而无法运行 所以可以在DUMP后再改回原文件的IAT偏移就可以了。。。。。。。。那么再直接运行的话就可以了
废话不说了贴代码,可能有人没有下那个教程 样本放附件了
挑重要的贴 反正是简单壳 属于ESP就能解决的 相信一步一步跟 绝大多数人 都行的
0046A22EFFB5 7E32***00 PUSH DWORD PTR SS:[EBP+40***27E] ; IMAGEBASE入栈
0046A234FFB5 D83***00 PUSH DWORD PTR SS:[EBP+4032D8] ;注意这里入栈的就是原文件的IAT的RVA
可以看到源文件的IAT是第4个节
0046A23AE8 7F02***00 CALL UnPackMe.0046A4BE repairIAT 这个函数里第一个CALL就是修复IAT的函数
{
0046A4DC8B0EMOV ECX,DWORD PTR DS:[ESI];OriginalFirstThunk
0046A4DE8B7E 10 MOV EDI,DWORD PTR DS:[ESI+10] ;FirstThunk
0046A4E10BC9OR ECX,ECX
0046A4E375 02 JNZ SHORT UnPackMe.0046A4E7
0046A4E58BCFMOV ECX,EDI
0046A4E703CAADD ECX,EDX
0046A4E903FAADD EDI,EDX
0046A4EB8B01MOV EAX,DWORD PTR DS:[ECX]
0046A4ED0BC0OR EAX,EAX
0046A4EF74 76 JE SHORT UnPackMe.0046A567
0046A4F1A9 000****0080 TEST EAX,800****0000 检验是否以序号导入,不为0则以序号导入
0046A4F674 0E JE SHORT UnPackMe.0046A506
0046A4F88D85 D03***00 LEA EAX,DWORD PTR SS:[EBP+4032D0]
0046A4FE8985 863****4000 MOV DWORD PTR SS:[EBP+40***86],EAX
0046A504EB 0A JMP SHORT UnPackMe.0046A510
0046A50***40INC EAX ;IMAGE_IMPORT_BY_NAME.Hint
0046A50***40INC EAX
0046A50***03C2ADD EAX,EDXIMAGE_IMPORT_BY_NAME.Name1
0046A50A8985 863****4000 MOV DWORD PTR SS:[EBP+40***86],EAX
0046A5108B46 0C MOV EAX,DWORD PTR DS:[ESI+C]DLL名
0046A5130BC0OR EAX,EAX
0046A51***74 50 JE SHORT UnPackMe.0046A567
0046A51***03C2ADD EAX,EDX
0046A51***51PUSH ECX
0046A51A52PUSH EDX
0046A51B50PUSH EAX
0046A51CFF95 A03***00 CALL DWORD PTR SS:[EBP+4033A0] ; kernel32.LoadLibraryA
0046A5225APOP EDX
0046A52***59POP ECX
0046A5240BC0OR EAX,EAX
0046A52***74 41 JE SHORT UnPackMe.0046A569
0046A52***85 823****4000 MOV DWORD PTR SS:[EBP+40***82],EAX
0046A52E8B19MOV EBX,DWORD PTR DS:[ECX]
0046A53***83C1 04 ADD ECX,4
0046A5330BDBOR EBX,EBX
0046A53***74 30 JE SHORT UnPackMe.0046A567
0046A5378BC3MOV EAX,EBX
0046A539F7C3 000****0080 TEST EBX,800****0000检验是否以序号导入,不为0则以序号导入
0046A53F74 0A JE SHORT UnPackMe.0046A54B
0046A54***81E3 FFFF0000 AND EBX,0FFFF
0046A54***51PUSH ECX
0046A54***52PUSH EDX
0046A549EB 06 JMP SHORT UnPackMe.0046A551
0046A54B43INC EBX
0046A54C43INC EBX
0046A54D03DAADD EBX,EDX
0046A54F51PUSH ECX
0046A55***52PUSH EDX
0046A55***53PUSH EBX
0046A552FFB5 823****4000 PUSH DWORD PTR SS:[EBP+40***82]
0046A558FF95 A43***00 CALL DWORD PTR SS:[EBP+4033A4] GetProcaddress
0046A55E5APOP EDX
0046A55F59POP ECX
0046A5600BC0OR EAX,EAX
0046A56***74 05 JE SHORT UnPackMe.0046A569
0046A564ABSTOS DWORD PTR ES:[EDI]
0046A565^ EB C7 JMP SHORT UnPackMe.0046A52E
0046A567F8CLC
0046A568C3RETN
}
修复IAT后到达 OEP
0046A27***68 B07***00 PUSH UnPackMe.00***71B0 ;OEP
0046A27DC3RETN
用LOADPEdump(OD插件DUMP后 会自动修复IAT)
直接运行DUMP后的文件会出现初始化的错误换句话说需要自己修复IAT后才能正常运行
根据PE结构 找到IMAGE_DIRECTORY_ENTRY_IMPORT(就是PE HEADER偏移+80H的地方)将上面分析过程中的得到的原文件的IAT的RVA 60***00填入 注意 字节的顺序
运行
原理很简单不过 貌似 没什么用 毕竟强壳都是破坏了IAT结构的 权当加深PE结构的熟悉,发现手动修复一个 还是比自动化生产线修复更有成就感 ^_^
对于破坏IAT的 需要建新节根据PE结构自己填充,麻烦死。貌似加密解密3有详细的手动修复方法 |
|