找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 2072|回复: 1

IAT修复方法

[复制链接]

9

主题

48

回帖

68

牛毛

初生牛犊

积分
68
发表于 2008-10-11 17:21:50 | 显示全部楼层 来自 河北省石家庄市
不错,继续发扬,多发精品贴

3

主题

17

回帖

27

牛毛

初生牛犊

积分
27
 楼主| 发表于 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有详细的手动修复方法
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

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

GMT+8, 2025-1-16 01:34 , Processed in 0.164830 second(s), 32 queries , Yac On.

Powered by Discuz! X3.5

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