找TELock加壳的Import Table的方法
2007-01-12 20:13:29 来源:WEB开发网核心提示:目的:在内存中将FlashFXP未被破坏的IT完整地提取出来(至于找TELock的OEP、修复的方法等,zombieys、hying、liotta已经讲得很详细了)第一步:找到IT的位置找IT自然要依赖于IT的结构特征,找TELock加壳的Import Table的方法,IT是个数组,数组中的每个元素是如下的一个结构(
目的:在内存中将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 ime 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加的壳)。
更多精彩
赞助商链接