xhn1002 发表于 2008-9-2 18:55:13

适用范围比较窄的修复IAT方法

适用范围 只是部分压缩或加密后 原IAT结构没被破坏的壳,是给和我一样属于新手级的人看的 高手飘过
昨天下好那个200M的脱壳教程,今天打算慢慢学习的本来修复IAT只要ImportREC就可以了
一来总是ODDUMP,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:                                       ; IMAGEBASE入栈
0046A234    FFB5 D8324000   PUSH DWORD PTR SS:                                     ;注意这里入栈的就是原文件的IAT的RVA
                                                                                              可以看到源文件的IAT是第4个节
0046A23A    E8 7F020000   CALL UnPackMe.0046A4BE                                             repairIAT 这个函数里第一个CALL就是修复IAT的函数
{
0046A4DC    8B0E            MOV ECX,DWORD PTR DS:                                                                                                                                                                        ;OriginalFirstThunk
0046A4DE    8B7E 10         MOV EDI,DWORD PTR DS:                                       ;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:
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:
0046A4FE    8985 86324000   MOV DWORD PTR SS:,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:,EAX
0046A510    8B46 0C         MOV EAX,DWORD PTR DS:                                        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:                                       ; 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:,EAX
0046A52E    8B19            MOV EBX,DWORD PTR DS:                                          
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:
0046A558    FF95 A4334000   CALL DWORD PTR SS:                                               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:
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

用LOADPEdump(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 编辑 ]

暗里着迷 发表于 2008-9-2 22:17:26

牛人啊。沙发。学习中。。。

zhjd 发表于 2008-9-8 21:07:31

这是什么教程里面的,楼主可否放个链接。

老海 发表于 2008-9-14 23:39:52

很好的文章,又学习了。
页: [1]
查看完整版本: 适用范围比较窄的修复IAT方法