加壳工具:找TELock加壳的Import Table的思路方法

  目:在内存中将FlashFXP未被破坏IT完整地提取出来(至于找TELockOEP、修复思路方法等zombieys、hying、liotta已经讲得很详细了)

  第步:找到IT位置

  找IT自然要依赖于IT结构特征IT是个每个元素是如下个结构(# <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 not bound,
// -1 bound, and real date ime stamp
// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT ( BIND)
// O.W. date/time stamp of DLL bound to (Old BIND)
DWORD ForwarderChain; // -1 no forwarders
DWORD Name; //DLL name
DWORD FirstThunk; // RVA to IAT ( 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中相应地址填入IATFirstThunk就是指向IAT

typedef struct _IMAGE_IMPORT_BY_NAME {
WORD H;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
  找IT位置过程和上面过程有些相反利用调试器设bpx LoadLibraryA、bpx GetProcAddress断点我们能够直接得到条件是DLL文件名串及该串内存地址、每个H内存地址、IAT位置(即GetProcAddress返回值所要写入位置)这样就至少有3条途径可以找到IT位置是根据DLL Name(在看雪教学中已有详细描述)第 2条途径是根据H地址第 3条则是根据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

  它不可能提前把下个DLLIMAGE_IMPORT_DESCRIPTOR结构清掉)

  3、再尝试第2条途径注意到第VariantChangeTypeExH地址是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由于该IATRVA为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..
  第 2步:找到破坏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 //清除指向每个DLLNameRVA值
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强



Tags:  exe加壳 加壳免杀 加壳软件 加壳工具

延伸阅读

最新评论

发表评论