这些 Windows 可执行元数据特征是否意味着我认为它们的作用?
Do these Windows executable meta data traits mean what I think they do?
我正在学习汇编作为恶意软件分析项目的一部分,并尝试使用一些 Node.js 库从 GitHub 中抓取可执行文件并反汇编它们。
具体来说,我专注于 x86-64 PE。
但是 the one I chose 等反汇编程序不一定能找到特定可执行格式(如 PE)中的指令。
除了首先需要知道我的指令应该从哪里开始,当我开始使用反汇编程序时,我意识到我还需要为程序设置一个特定的 RIP 值作为开始。我不完全理解为什么有些程序以不同的内存偏移量开始,但据推测这是为了允许其他协作进程将内存放在同一块中。或者类似的东西。
所以我的目标是知道:
- RIP 的正确起始值
- 查找第一条指令的正确字节,超出 header。
所以我使用 a library 来查找元数据,如下所示:
let metaData = await executableMetadata.getMetadataObjectFromExecutableFilePath_Async(execPath);
当传递带有 header 的 exe 时,如下所示:
0: 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00
16: b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
32: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
48: 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
64: 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68
80: 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f
96: 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20
112: 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00
128: 50 45 00 00 4c 01 03 00 91 3f 9a ef 00 00 00 00
144: 00 00 00 00 e0 00 22 00 0b 01 30 00 00 12 00 00
告诉我们:
{
format: 'PE',
pe_header_offset_16le: 128,
machine_type: 332,
machine_type_object: {
constant: 'IMAGE_FILE_MACHINE_I386',
description: 'Intel 386 or later processors and compatible processors'
},
number_of_sections: 3,
timestamp: -275103855,
coff_symbol_table_offset: 0,
coff_number_of_symbol_table_entries: 0,
size_of_optional_header: 224,
characteristics_bitflag: 34,
characteristics_bitflags: [
{
constant: 'IMAGE_FILE_EXECUTABLE_IMAGE',
description: 'Image only. This indicates that the image file is valid and can be run. If this flag is not set, it indicates a linker error.',
flag_code: 2
},
{
constant: 'IMAGE_FILE_LARGE_ADDRESS_AWARE',
description: 'Application can handle > 2-GB addresses.',
flag_code: 32
}
],
object_type_code: 267,
object_type: 'PE32',
linker: { major_version: 48, minor_version: 0 },
size_of_code: 4608,
size_of_initialized_data: 2048,
size_of_uninitialized_data: 0,
address_of_entry_point: 12586,
base_of_code: 8192,
windows_specific: {
image_base: 4194304,
section_alignment: 8192,
file_alignment: 512,
major_os_version: 4,
minor_os_version: 0,
major_image_version: 0,
minor_image_version: 0,
major_subsystem_version: 6,
minor_subsystem_version: 0,
win32_version: 0,
size_of_image: 32768,
size_of_headers: 512,
checksum: 0,
subsystem: {
constant: 'IMAGE_SUBSYSTEM_WINDOWS_CUI',
description: 'The Windows character subsystem',
subsystem_code: 3
},
dll_characteristics: 34144,
dll_characteristic_flags: [ [Object], [Object], [Object], [Object], [Object] ]
},
base_of_data: 16384
}
由此,我想也许我找到了我需要的两条信息:
- 第一个指令字节:
windows_specific.size_of_headers
(512)
- RIP 起始值:
address_of_entry_point
(12586)
但我基本上是在猜测。任何更熟悉此元数据的人都可以解释要查看的正确属性以获取我需要的信息吗?
Windows 可执行文件以 16 位 DOS 存根开头。文件偏移量 60 处的双字包含 DWORD PE 签名的偏移量,在您的示例中它是 60: 80 00 00 00
,即十进制的 128。
PE 签名后紧跟 COFF 文件 header(文件偏移量 132)。
您可能想用汇编语言中的 headers 结构来处理您的十六进制转储。 COFF_FILE_HEADER.Machine 是 132: 4C 01
,即 0x14C
,表示 32 位可执行文件。在 64 位可执行文件中,它将是 0x8664
.
文件 header 后跟 COFF 部分 headers。您对那些在 COFF_SECTION_HEADER.Characteristics.
中设置位 SCN_MEM_EXECUTE=0x2000_0000
的部分感兴趣
COFF_SECTION_HEADER.PointerToRawData 指定代码开始的文件偏移量。
剖析从该文件偏移量开始的 .SizeOfRawData
字节,并将该部分代码提交给您的反汇编程序。
请注意,在 run-time 上,代码实际上将映射到 .VirtualAddress
,不同于 .PointerToRawData
。
我正在学习汇编作为恶意软件分析项目的一部分,并尝试使用一些 Node.js 库从 GitHub 中抓取可执行文件并反汇编它们。
具体来说,我专注于 x86-64 PE。
但是 the one I chose 等反汇编程序不一定能找到特定可执行格式(如 PE)中的指令。
除了首先需要知道我的指令应该从哪里开始,当我开始使用反汇编程序时,我意识到我还需要为程序设置一个特定的 RIP 值作为开始。我不完全理解为什么有些程序以不同的内存偏移量开始,但据推测这是为了允许其他协作进程将内存放在同一块中。或者类似的东西。
所以我的目标是知道:
- RIP 的正确起始值
- 查找第一条指令的正确字节,超出 header。
所以我使用 a library 来查找元数据,如下所示:
let metaData = await executableMetadata.getMetadataObjectFromExecutableFilePath_Async(execPath);
当传递带有 header 的 exe 时,如下所示:
0: 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00
16: b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
32: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
48: 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
64: 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68
80: 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f
96: 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20
112: 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00
128: 50 45 00 00 4c 01 03 00 91 3f 9a ef 00 00 00 00
144: 00 00 00 00 e0 00 22 00 0b 01 30 00 00 12 00 00
告诉我们:
{
format: 'PE',
pe_header_offset_16le: 128,
machine_type: 332,
machine_type_object: {
constant: 'IMAGE_FILE_MACHINE_I386',
description: 'Intel 386 or later processors and compatible processors'
},
number_of_sections: 3,
timestamp: -275103855,
coff_symbol_table_offset: 0,
coff_number_of_symbol_table_entries: 0,
size_of_optional_header: 224,
characteristics_bitflag: 34,
characteristics_bitflags: [
{
constant: 'IMAGE_FILE_EXECUTABLE_IMAGE',
description: 'Image only. This indicates that the image file is valid and can be run. If this flag is not set, it indicates a linker error.',
flag_code: 2
},
{
constant: 'IMAGE_FILE_LARGE_ADDRESS_AWARE',
description: 'Application can handle > 2-GB addresses.',
flag_code: 32
}
],
object_type_code: 267,
object_type: 'PE32',
linker: { major_version: 48, minor_version: 0 },
size_of_code: 4608,
size_of_initialized_data: 2048,
size_of_uninitialized_data: 0,
address_of_entry_point: 12586,
base_of_code: 8192,
windows_specific: {
image_base: 4194304,
section_alignment: 8192,
file_alignment: 512,
major_os_version: 4,
minor_os_version: 0,
major_image_version: 0,
minor_image_version: 0,
major_subsystem_version: 6,
minor_subsystem_version: 0,
win32_version: 0,
size_of_image: 32768,
size_of_headers: 512,
checksum: 0,
subsystem: {
constant: 'IMAGE_SUBSYSTEM_WINDOWS_CUI',
description: 'The Windows character subsystem',
subsystem_code: 3
},
dll_characteristics: 34144,
dll_characteristic_flags: [ [Object], [Object], [Object], [Object], [Object] ]
},
base_of_data: 16384
}
由此,我想也许我找到了我需要的两条信息:
- 第一个指令字节:
windows_specific.size_of_headers
(512) - RIP 起始值:
address_of_entry_point
(12586)
但我基本上是在猜测。任何更熟悉此元数据的人都可以解释要查看的正确属性以获取我需要的信息吗?
Windows 可执行文件以 16 位 DOS 存根开头。文件偏移量 60 处的双字包含 DWORD PE 签名的偏移量,在您的示例中它是 60: 80 00 00 00
,即十进制的 128。
PE 签名后紧跟 COFF 文件 header(文件偏移量 132)。
您可能想用汇编语言中的 headers 结构来处理您的十六进制转储。 COFF_FILE_HEADER.Machine 是 132: 4C 01
,即 0x14C
,表示 32 位可执行文件。在 64 位可执行文件中,它将是 0x8664
.
文件 header 后跟 COFF 部分 headers。您对那些在 COFF_SECTION_HEADER.Characteristics.
中设置位SCN_MEM_EXECUTE=0x2000_0000
的部分感兴趣
COFF_SECTION_HEADER.PointerToRawData 指定代码开始的文件偏移量。
剖析从该文件偏移量开始的 .SizeOfRawData
字节,并将该部分代码提交给您的反汇编程序。
请注意,在 run-time 上,代码实际上将映射到 .VirtualAddress
,不同于 .PointerToRawData
。