将字符数组转换为整数值
Convert char array to integer value
我在弄清楚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,所以我试图缓冲它以供以后使用。 (Bc.只阅读完整的标题会使事情变得更快(。
我遇到问题的地方是我将小端值转换为实际整数的地方。 我需要从后面读取值(所以第二个 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, "nnn%d",retVal);
return retVal;
}
换句话说,我需要将十六进制值(或字符(数组解析为实际整数,但要考虑字节的重要性。
也: [指向符号表的指针]和[符号数]似乎始终为0。我猜这是因为二进制文件被剥夺了符号,但我不确定,因为我更像是 Linux 二进制分析方面的专家。我的假设是否正确?
我真的希望这对你有所帮助。根据我目前的理解,这将获取开始到结束范围内的字节,并将它们放在一个整数中:
// here I am converting the chars from hex to int
int getBitPattern(char ch)
{
if (ch >= 48 && ch <= 57)
{
return ch - '0';
}
else if (ch >= 65 && ch <= 70)
{
return ch - 55;
}
else
{
// this is in case of invalid input
return -1;
}
}
int getValue(const 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, j = 0; i >= start; i--, ++j)
{
fprintf(stdout, "n%02hhx", memory[i]);
// bitshift in order to insert the next set of 4 bits into their correct spot
retVal |= (getBitPattern(memory[i]) << (4*j));
}
fprintf(stdout, "nnn%d", retVal);
return retVal;
}
boyanhristov96 通过指出 OR 运算符而不是 AND 的使用提供了很多帮助,正是他/她的努力导致了这个解决方案
在转移之前还必须对(未签名的字符(进行石膏转换。
如果没有,变量将简单地移动到其最大正范围内,
从而产生值
0xFFFFE000 (4294959104(
而不是所需的0x0000E000 (57344(
我们必须左移 8,因为我们想一次移动 2 个 16 位值,就像
0x00FF00 <<8 ;//操作后0xFF0000
最后一个函数也使用 OR,这里是它:
//now with or operation and cast
int getValue(const 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, j = end-start; i >= start; i--, --j)
{
fprintf(stdout, "n%02hhx", memory[i]);
retVal |= ((unsigned char)(memory[i]) << (8 * j));
}
fprintf(stdout, "nnn%u", retVal);
return retVal;
}
非常感谢您的帮助
编辑16.12.2019:
返回此处以获取函数的更新版本; 出于两个原因,有必要重写它: 1( PE-Header 的偏移量取决于目标二进制文件,因此我们必须首先获取此值(在位置 0x3c(。然后,使用指针从那里从一个值移动到另一个值。 2(混乱的计算,我纠正了它们,现在它应该按预期工作。第二个参数是字节长度,例如 DWORD - 4 字节
给你:
//because file shambles
int getValuePNTR(const char* memory, int &start, int size)
{
DWORD retVal = 0;
//now just add up array fields
for (int i = start + size-1,j = size-1; j >= 0; --j ,i--)
{
fprintf(stdout, "ncycle: %d, memory: [%x]", j, memory[i]);
if ((unsigned char)memory[i] == 00 && j > 0)
retVal <<= 8;
else
retVal |= ((unsigned char)(memory[i]) << (8 * j));
//else
//retVal |= ((unsigned char)(memory[i]));
}
//get the next field after this one
start += size;
return retVal;
}
- 努力将整数转换为链表。不知道我在这里做错了什么
- 如何在C++中将整数转换为其数字数组
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 将最小值整数转换为无符号长整型
- 为什么我们不能将使用异或运算找到的整数转换为字符?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 将74位整数转换为以31为底的整数
- 独立于实现的浮点/整数转换
- 以最少的步骤将给定整数转换为另一个整数
- 浮点到整数转换出错(即使浮点数已经是整数)
- 了解双精度转换与整数转换中的整数与截断关系
- 禁止具有精度损失的整数转换
- 将任意整数转换为 void*
- 将 32 位大端有符号整数转换为有符号小端整数
- char a[0] 使用 itoa() 将整数转换为字符串的目的
- 使用函数时从整数转换为字符串
- 尝试从整数转换为字符串的月份
- 如何在C++中将整数转换为字节,以便 Unity 在通过 UDP 传输后能够理解它们
- 如何将 Q 格式的整数转换为浮点数(反之亦然)
- 如何避免字符串到整数转换情况下的无效参数异常