第三章计算机病毒结构分枥(2)
第三章 计算机病毒结构分析(2)
(6)引入表( Import Table) ·两个概念: 引入函数:是被某模块调用的但又不在调用者模块中的函数,因 而命名为 mport(引入)函数。引入函数实际位于一个或者更多 的DL。调用者模块里只保留一些函數信息,包括函数名及箕 驻留的DLL名。 - Data Directory: Optional Heade最后。个成员就是 DataDirectory,它 个 IMAGE DATA DIRECTORY结构数组 共有15个成员。 Data Directory包含了PE文件中各重要数据结构 个重要数据结构的信息 Data Directory EK个成员都是 IMAGE DA谷R巨CTORⅤ结构 类型,其定义如下所示 IMAGE DATA DIRECTORY STRUCT irtualAddress dd∥/数据结构的相对虚拟地址(RVA size dd irtualAddress所指向数据结构的字节数 IMAGE DATA DIRECTORY ENDS
(6)引入表(Import Table) • 两个概念: – 引入函数:是被某模块调用的但又不在调用者模块中的函数,因 而命名为Import(引入)函数。引入函数实际位于一个或者更多 的DLL里。调用者模块里只保留一些函数信息,包括函数名及其 驻留的DLL名。 – Data Directory:Optional Header最后一个成员就是 DataDirectory,它是一个IMAGE_DATA_DIRECTORY结构数组, 共有15个成员。Data Directory包含了PE文件中各重要数据结构 的位置和尺寸信息。每个成员包含了一个重要数据结构的信息。 Data Directory的每个成员都是IMAGE_DATA_DIRECTORY结构 类型,其定义如下所示: • IMAGE_DATA_DIRECTORY STRUCT – VirtualAddress dd //数据结构的相对虚拟地址(RVA) – isize dd //VirtualAddress所指向数据结构的字节数 • IMAGE_DATA_DIRECTORY ENDS
5个成员 序号便移 包含信息 简介 96 Export symbols 导出表 104 Import symbols 导入表 Resources 资源 120 Exception 异常 128 Security 安全 36 Base relocation 重定位表 144 Debug 调试信息 Copyright string 版权信息 160 GlobalPTR 全局指针相对虚拟地址表 168 Thread local storage(Tls 本地线程存储 172 Load configuration 装载配置表 180 Bound Import 具体资料不祥 12 188 Import Address Table 引入函数的地址(宿主程序中的地址)表 Delay Import 具体资料不祥 14 200 COM descriptor COM描述子 208 Reserved 未使用
15个成员 序号 便移 包含信息 简介 0 96 Export symbols 导出表 1 104 Import symbols 导入表 2 112 Resources 资源 3 120 Exception 异常 4 128 Security 安全 5 136 Base relocation 重定位表 6 144 Debug 调试信息 7 152 Copyright string 版权信息 8 160 GlobalPTR 全局指针相对虚拟地址表 9 168 Thread local storage (TLS) 本地线程存储 10 172 Load configuration 装载配置表 11 180 Bound Import 具体资料不祥 12 188 Import Address Table 引入函数的地址(宿主程序中的地址)表 13 192 Delay Import 具体资料不祥 14 200 COM descriptor COM描述子 15 208 Reserved 未使用
引入表:实际上是一个 IMAGE IMPORT DESCRIPTOR结构数组。每个结构包含PE 文件引入函数的一个相关DLL的信息。如果该PE文件从10个不同的DLL中引入函数 那么这个数组就有10个成员。该数组以一个全0的成员结尾。 MAGE IMPORT DESCRIPTOR结构的定义如下 IMAGE MPORT DESCRIPTOR STRUCT Characteristics dd OriginalFirst Thunk dd Ends Time Date Stamp dd Forwarder Chain dd Name dd FirstThunk dd IMAGE IMPORT DESCRIPTOR ENDS OriginalFirst Thunk含有指向一个 MAGE THUNK DATA结构数组的RVA。 First Thunk与 OriginalFirst Thunk的结构相同,只是作用不同
• 引入表:实际上是一个 IMAGE_IMPORT_DESCRIPTOR 结构数组。每个结构包含PE 文件引入函数的一个相关DLL的信息。如果该PE文件从10个不同的DLL中引入函数, 那么这个数组就有10个成员。该数组以一个全0的成员结尾。 IMAGE_IMPORT_DESCRIPTOR结构的定义如下: • IMAGE_IMPORT_DESCRIPTOR STRUCT – Union • Characteristics dd • OriginalFirstThunk dd – Ends – TimeDateStamp dd – ForwarderChain dd – Name dd – FirstThunk dd • IMAGE_IMPORT_DESCRIPTOR ENDS • OriginalFirstThunk含有指向一个IMAGE_THUNK_DATA结构数组的RVA。 • FirstThunk与OriginalFirstThunk的结构相同,只是作用不同
· IMAGE THUNK DATA是一个指向 MAGE IMPORT BY NAME结构 的指针。注意 IMAGE THUNK DATA包含了指向 IMAGE MPORT BY NAME结构的指针,而不是结构本身。 MAGE IMPORT BY NAME结构保存着一个引入函数的相关信息。 MAGE MPORT BY NAME结构的定义 JAGE IMPORT BY NAME STRUCT · Hint dw//引入函数在原d11中的索引号 · Name db//引入函数在原d11中的名字 MAGE IMPORT BY NAME ENDS 假设有几个 IMAGE IMPORT BY NAME结构,我们收集起这些结 构的RVA(= MAGE THUNK DATAS)组成一个数组,并以0结尾,然 后再将数组的RVA放入 OriginalFirst Thunl
• IMAGE_THUNK_DATA是一个指向IMAGE_IMPORT_BY_NAME结构 的指针。注意 IMAGE_THUNK_DATA 包含了指向一个 IMAGE_IMPORT_BY_NAME 结构的指针,而不是结构本身。 • IMAGE_IMPORT_BY_NAME结构保存着一个引入函数的相关信息。 IMAGE_IMPORT_BY_NAME 结构的定义: – IMAGE_IMPORT_BY_NAME STRUCT • Hint dw //引入函数在原dll中的索引号 • Name db //引入函数在原dll中的名字 – IMAGE_IMPORT_BY_NAME ENDS • 假设有几个 IMAGE_IMPORT_BY_NAME 结构,我们收集起这些结 构的RVA(=IMAGE_THUNK_DATAs)组成一个数组,并以0结尾,然 后再将数组的RVA放入OriginalFirstThunk
Firstthunk与 OriginalFirstThunk区 别 OriginaFirstthunk IMAGE IMPORT BY FirstThunk NAME IMAGE THUNK DATA Function 1 IMAGE THUNK DATA IMAGE THUNK DATA Function 2 IMAGE THUNK DATA IMAGE THUNK DATA---> Function 3 IMAGE THUNK DATA IMAGE THUNK DATA Function 4 <-- IMAGE THUNK DATA IMAGE THUNK DATA Function n IMAGE THUNK DATA PE文件执行前
FirstThunk与OriginalFirstThunk区 别 OriginalFirstThunk IMAGE_IMPORT_BY_ NAME FirstThunk | | IMAGE_THUNK_DATA ---> Function 1 Function 2 Function 3 Function 4 ... Function n <--- IMAGE_THUNK_DATA PE文件执行前
IMAGE IMPORT DESCRIPTOR OriginalfirstThunk TimeDatesta Forwardercha in Name Kerne 132 d11 First Thunk IMAGE IMPORT BY NAME IMAGE THUNK DATA D2F6 ExitProcessk+IMAGE_THUNK_DATA IMAGE THUNK DATA IMAGE_THUNK DATA 002B Writefile IMAGE THUNK_DATA 80000010H(strcmp) 30000010H(strcmp 0(结束符) 匚0(结束符)
OriginalFirstThunk TimeDateStamp ForwarderChain Name FirstThunk IMAGE_THUNK_DATA IMAGE_THUNK_DATA IMAGE_THUNK_DATA 80000010H(strcmp) 0(结束符) IMAGE_THUNK_DATA IMAGE_THUNK_DATA IMAGE_THUNK_DATA 80000010H(strcmp) 0(结束符) 02F6 ExitProcess 0111 ReadFile 002B WriteFile IMAGE_IMPORT_DESCRIPTOR IMAGE_IMPORT_BY_NAME Kernel32.dll
OriginalFirstthunk IMAGE IMPORT BY NA Firstthunk ME IMAGE THUNK DATA Function 1 Address of function 1 IMAGE THUNK DATA Function 2 Address of function 2 IMAGE THUNK DATA Function 3 Address of function 3 IMAGE THUNK DATA Function 4 Address of function 4 IMAGE THUNK DATA Function n Address of function n PE文件执行时
PE文件执行时 OriginalFirstThunk IMAGE_IMPORT_BY_NA ME FirstThunk | | IMAGE_THUNK_DATA ---> Function 1 Address of Function 1 IMAGE_THUNK_DATA ---> Function 2 Address of Function 2 IMAGE_THUNK_DATA ---> Function 3 Address of Function 3 IMAGE_THUNK_DATA ---> Function 4 Address of Function 4 ... ---> ... ... IMAGE_THUNK_DATA ---> Function n Address of Function n
IMAGE MPORT DESCR IPTOR Kernel 32. d11 Originalfirst Thunk TimeDatestamp ForwarderChain Name jmp dword prt [ol FirstThunk jmp dword prt [1] dword prt [21 jmp dword prt [3] IMAGE IMPORT BY NAME IMAGE THUNK DATA 02F6 XitProcess ExitProcess的入口地址 IMAGE_THUNK DATAL o111 Readfile Readfile的入口地址 IMAGE_ THUNK_ DATAH00 B Writefile k WriteFile的入口地址 80000010H(strcmp) strcmp的入口地址 0(结束符) 0(结束符)
OriginalFirstThunk TimeDateStamp ForwarderChain Name FirstThunk IMAGE_THUNK_DATA IMAGE_THUNK_DATA IMAGE_THUNK_DATA 80000010H(strcmp) 0(结束符) ExitProcess的入口地址 ReadFile的入口地址 WriteFile的入口地址 strcmp的入口地址 0(结束符) 02F6 ExitProcess 0111 ReadFile 002B WriteFile IMAGE_IMPORT_DESCRIPTOR IMAGE_IMPORT_BY_NAME Kernel32.dll jmp dword prt [0] jmp dword prt [1] jmp dword prt [2] jmp dword prt [3]
用函数名调用: IMAGE IMPORT BY NAME 用序号调用:| MAGE THUNK DATA值的 低位字指示函数序数,而最高二进制位 MSB)设为1 例如,如果一个函数只由序数引出且其序数是 1234H,那么对应该函数的 IMAGE THUNK DATA值是80001234H
• 用函数名调用: IMAGE_IMPORT_BY_NAME • 用序号调用:IMAGE_THUNK_DATA值的 低位字指示函数序数,而最高二进制位 (MSB)设为1 。 – 例如,如果一个函数只由序数引出且其序数是 1234H,那么对应该函数的 IMAGE_THUNK_DATA值是80001234H