老文章档案 · 2003 年

找TELock加壳的Import Table的方法

天下资讯 · 破解文章 · 2003-06-12 · 作者:blowfish 人气: · 出处:嬴政天下整理收藏)

目的:在内存中将FlashFXP未被破坏的IT完整地提取出来

(至于找TELock的OEP、修复的方法等,zombieys、hying、liotta已经讲得很详细了)

第一步:找到IT的位置

找IT自然要依赖于IT的结构特征。IT是个数组,数组中的每个元素是如下的一个结构(#include <winnt.h>),对应着引入的一个DLL:

typedef struct _IMAGE_IMPORT_DESCRIPTOR {

union {

DWORD Characteristics; // 0 for terminating null import descriptor

DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA)

};

DWORD TimeDateStamp; // 0 if not bound,

// -1 if bound, and real date\time stamp

// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)

// O.W. date/time stamp of DLL bound to (Old BIND)

DWORD ForwarderChain; // -1 if no forwarders

DWORD Name; //DLL name

DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses)

} IMAGE_IMPORT_DESCRIPTOR;

PE Loader/unpacker在加载DLL时,过程大致如下:

1、先根据Name用LoadLibraryA加载一个DLL;

2、根据FirstThunk找到IMAGE_IMPORT_BY_NAME数组,用GetProcAddress取得该DLL中的相应函数的地址填入IAT。FirstThunk就是指向IAT。

typedef struct _IMAGE_IMPORT_BY_NAME {

WORD Hint;

BYTE Name[1];

} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

找IT的位置的过程和上面的过程有些相反。利用调试器设bpx LoadLibraryA、bpx GetProcAddress断点,我们能够直接得到的条件是DLL文件名

字符串及该串的内存地址、每个函数的Hint和函数名的内存地址、IAT的位置(即GetProcAddress的返回值所要写入的位置),这样就至少有3条途

径可以找到IT的位置,一是根据DLL Name(在看雪教学中已有详细描述),第二条途径是根据Hint和函数名的地址,第三条则是根据IAT的位置

,这3条途径用的是同一种方法(这是找IT的一种通用方法,并不限于TELock加的壳)。

1、用BPMB LoadLibraryA X DO "d *(esp+4)"设断点,看见加载oleaut32.dll:

0023:00533DBC 61656C6F 32337475 6C6C642E 00000000 oleaut32.dll....

0023:00533DCC 69726156 43746E61 676E6168 70795465 VariantChangeTyp

0023:00533DDC 00784565 61560000 6E616972 706F4374 eEx...VariantCop

0023:00533DEC 646E4979 00000000 69726156 43746E61 yInd....VariantC

0023:00533DFC 7261656C 00000000 53737953 6E697274 lear....SysStrin

0023:00533E0C 6E654C67 00000000 46737953 53656572 gLen....SysFreeS

0023:00533E1C 6E697274 00000067 52737953 6C6C4165 tring...SysReAll

0023:00533E2C 7453636F 676E6972 006E654C 79530000 ocStringLen...Sy

2、先尝试第一条途径。字符串"oleaut32.dll"的RVA为00133DBC,于是在内存中搜索这个RVA,希望能够找到存放有该RVA值的某个

IMAGE_IMPORT_DESCRIPTOR结构,也就等于是找到了IT。

:s cs:400000 l 178000 bc,3d,13,00

Pattern not found

没有找到。因为TELock已经把相应位置上的值清0了。(实际上也可以用下一个DLL的文件名来进行搜索,因为TELock此时尚未处理下一个DLL,

它不可能提前把下一个DLL的IMAGE_IMPORT_DESCRIPTOR结构清掉。)

3、再尝试第2条途径。注意到第一个函数VariantChangeTypeEx的Hint的地址是00533DCA,于是搜索RVA值00133DCA,希望能够找到FirstThunk

所指向的那个数组(其实该数组也就是IAT),进而再找到FirstThunk的位置。

:s cs:400000 l 178000 ca,3d,13,00

Pattern found at 001B:0053328C (0013328C)

找到之后看一下IAT。由于此时还未把GetProcAddress的返回值写入IAT,所以此时IAT中存放的都是指向IMAGE_IMPORT_BY_NAME的指针(RVA)

:dd 53328c

001B:0053328C 00133DCA 00133DE0 00133DF2 00133E02 .=...=...=...>..

001B:0053329C 00133E12 00133E22 00133E38 00000000 .>..">..8>......

001B:005332AC 00133E5A 00133E68 00133E76 00133E84 Z>..h>..v>...>..

001B:005332BC 00133E98 00000000 00133EBC 00133ECE .>.......>...>..

001B:005332CC 00133EE2 00133EF6 00133F06 00133F14 .>...>...?...?..

001B:005332DC 00133F24 00133F36 00133F44 00133F58 $?..6?..D?..X?..

001B:005332EC 00133F70 00000000 00133F96 00133FA2 p?.......?...?..

001B:005332FC 00133FAE 00133FBA 00133FC6 00133FDC .?...?...?...?..

4、再看究竟是哪个FirstThunk指向了上面的IAT。由于该IAT的RVA为0013328C,故

:s cs:400000 l 178000 8c,32,13,00

Pattern found at 001B:0053304C (0013304C)

5、这样就找到了oleaut32.dll所对应的FirstThunk的位置是0053304C。在此位置附近看一下,就可以找到IT的起始位置为00533000

,长度为0x1CC(问号表示未被映射的内存空间;最初的4个IMAGE_IMPORT_DESCRIPTOR结构已经被清除了一部分):

001B:00532FE0 ???????? ???????? ???????? ???????? ................

001B:00532FF0 ???????? ???????? ???????? ???????? ................

001B:00533000 00000000 00000000 00000000 00000000 ................

001B:00533010 001331CC 00000000 00000000 00000000 .1..............

001B:00533020 00000000 0013326C 00000000 00000000 ....l2..........

001B:00533030 00000000 00000000 0013327C 00000000 ........|2......

001B:00533040 00000000 00000000 00000000 0013328C .............2..

001B:00533050 00000000 00000000 00000000 00133E4C ............L>..

001B:00533060 001332AC 00000000 00000000 00000000 .2..............

001B:00533070 00133EAE 001332C4 00000000 00000000 .>...2..........

001B:00533080 00000000 00133F88 001332F4 00000000 .....?...2......

001B:00533090 00000000 00000000 001346D4 0013349C .........F...4..

第二步:找到破坏IT的代码

由于TELock清除了IT中指向DLL文件名的RVA,故只要设个bpm断点,看它什么时候清这个文件名的,就可以找到破坏IT的代码。

第一个DLL文件名的RVA存放在0053300C处,故BPM 00533000+0C W do "dd 533000",

001B:00576C16 8B95BEAF4000 MOV EDX,[EBP+0040AFBE]

001B:00576C1C 8BB5AEAF4000 MOV ESI,[EBP+0040AFAE]

001B:00576C22 85F6 TEST ESI,ESI

001B:00576C24 0F849D030000 JZ 00576FC7

001B:00576C2A 03F2 ADD ESI,EDX

001B:00576C2C 83A5AAB0400000 AND DWORD PTR [EBP+0040B0AA],00

001B:00576C33 8B460C MOV EAX,[ESI+0C]

001B:00576C36 83660C00 AND DWORD PTR [ESI+0C],00 //清除指向每个DLL的Name的RVA值

001B:00576C3A 85C0 TEST EAX,EAX

001B:00576C3C 0F8485030000 JZ 00576FC7

001B:00576C42 03C2 ADD EAX,EDX

001B:00576C44 8BD8 MOV EBX,EAX

001B:00576C46 50 PUSH EAX

001B:00576C47 FF9518AF4000 CALL [EBP+0040AF18]

001B:00576C4D 85C0 TEST EAX,EAX

001B:00576C4F 0F858C000000 JNZ 00576CE1

001B:00576C55 53 PUSH EBX

在第一次执行上面CS:00576C36处的AND之前将533000~535FFF之间的内容(共0x3000字节,不仅包含IT,还包含IAT等)dump出来就行了。

所以觉得TELock目前还没有ASProtect强 (出处:嬴政天下整理收藏)

相关资讯:

·怎样脱用 Aspack2.12 加的壳(适合初学者)

·EZIP1.0脱壳手记

·脱pecompact1.71加的壳

·PEPack1.0脱壳手记

·手动脱壳的教程(由petite v2.2加壳)

·论 彩票快车白金版v90 的脱壳+爆破

·Aspack的壳

·对PECompact.exe v1.34的手动脱壳

·Petite 脱壳“标准”解决方法

·Petite 2.x 脱壳

相关软件:

·NetConch(网络贝壳) 1.1

·甲壳虫进销存 V3.20

·甲壳虫医药版 V3.82

·甲壳虫服装鞋帽版 V3.92

·甲壳虫超市版 V3.70

·花生壳(PeanutHull) V2.0 正式版

·甲壳虫XP插件版 2.0.5

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright ? 1998-2003 winzheng.com

All Rights Reserved.

特别感谢 蓝芒科技 提供下载站及论坛服务器

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史