【发布时间】:2020-03-31 19:37:04
【问题描述】:
我在正确计算 WORD、DWORD 等时遇到了一些麻烦。 我的脑子里有一种结,可能是在这个问题上坐得太久了。
我正在阅读 PE 部分的标题。到目前为止一切正常。 以下是随机 .exe 文件的示例输出:
File is 286 Kbytes large
PE-Signature [@ 0x108]
0x00000100: ........ ........ 504500
Collect Information (PE file header):
[WORD] Mashinae Type :014C
[WORD] Number of Sections :0006
[DWORD] TimeStamp :5C6ECB00
[DWORD] Pointer to symbol table:00000000
[DWORD] Number of Symbols :00000000
[WORD] Size of optional header:00E0
现在,如您所见,“可选”标头的大小为 0x00E0,因此我试图将其缓冲以备后用。 (公元前。阅读完整的标题会让事情变得更快)。
我遇到问题的地方是将小端值转换为实际整数。 我需要从后面读取值(因此第二个 WORD [00] 实际上是要读取的第一个值)。 然而,第二个值需要以某种方式移动(bc. 字节的重要性),这就是我苦苦挣扎的地方。我想解决方案并不难,我只是没智慧了哈哈。
这是我的草稿,该函数应该返回一个整数值,该值是:
//get a specific value and safe it for later usage
int getValue(char* memory, int start, int end)
{
if (end <= start)
return 0;
unsigned int retVal = 0;
//now just add up array fields
for (int i = end; i >= start; i--)
{
fprintf(stdout, "\n%02hhx", memory[i]);
retVal &= (memory[i] << 8 * (i- start));
}
fprintf(stdout, "\n\n\n%d",retVal);
return retVal;
}
换句话说,我需要将一个十六进制值(或字符)数组解析为一个实际的整数,但要考虑字节的重要性。
还有: [Pointer to symbol table] 和 [Number of Symbols] 似乎总是 0。我猜这是因为二进制文件中没有符号,但我不确定,因为我更擅长 Linux 二进制文件分析。我的假设正确吗?
【问题讨论】:
-
你能给我一个你想做的例子吗?输入和期望的输出
-
所以你的意思是如果传递的
char *是“00E0”,那retval应该等于14? -
您使用的是 C 还是 C++?如果您使用的是 C++,我建议您查看 cplusplus.com/reference/sstream/stringstream
-
可能想要
|=而不是&=——因为 retVal 从 0 开始,并且进入它永远不会改变它... -
@zlogdan 正在使用 C++,是的 stringstream 可以解决我的问题,然后 stoi 操作再次失败
标签: c++ binary hex portable-executable