|
正如你所见,我计划只用2个节,一个用于代码,一个用于所有剩余的东西(数据、常量和输入目录等)。没有重定位和象资源之类其它东西。我也不用BSS节并将变量“written”放入已初始化数据。文件和RAM中的节对齐都是一样的(32字节);这将有助于使任务简单,否则我就得来回地计算RVA很多次。 现在我们设置数据目录,开始于0xb8字节,有0x80字节长: 地址 大小 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_EXPORT(0) ???????? ???????? ;IMAGE_DIRECTORY_ENTRY_IMPORT(1) 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_RESOURCE(2) 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_EXCEPTION(3) 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_SECURITY(4) 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_BASERELOC(5) 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_DEBUG(6) 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_COPYRIGHT(7) 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_GLOBALPTR(8) 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_TLS(9) 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG(10) 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT(11) 00000000 00000000 ;IMAGE_DIRECTORY_ENTRY_IAT(12) 00000000 00000000 ;13 00000000 00000000 ;14 00000000 00000000 ;15 仅使用输入目录。 下一个使节头。首先我们做代码节的,代码节将包含前面所编的汇编语句。它有32字节长,所以代码节也就是这么长。节头从0x138处开始,有0x28字节长: Name 2e636f6465000000 ;".code"的ASCII码值 VirtualSize 00000000 ;未用 VirtualAddress ???????? ;待定 SizeOfRawData 20000000 ;代码的大小 PointerToRawData ???????? ;待定 PointerToRelocations00000000 ;未用 PointerToLinenumbers00000000 ;未用 NumberOfRelocations 0000 ;未用 NumberOfLinenumbers 0000 ;未用 Characteristics 20000060 ;代码节,可执行,可读 第二节将包含数据。节头开始于0x160处,有0x28字节长:
|