gpt4 book ai didi

c - 如何打印以小端存储的十六进制值?

转载 作者:行者123 更新时间:2023-11-30 16:23:20 25 4
gpt4 key购买 nike

我似乎因 Endianess 而陷入困境。我的机器是带有 Ryzen 3 处理器的 64 位机器。报告为小端。

我正在用 C 编写一个小程序,它遍历进程虚拟内存并解析 MSDOS header 并检查 header 签名中的 MZ。

取 self 的代码:

int pid = 10964;
DWORD_PTR addr = 0x7FF7BD730000;
MEMORY_BASIC_INFORMATION64 mbi;
IMAGE_NT_HEADERS header;

HANDLE pHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (pHandle == NULL)
{
printf("Error getting handle for process %i. Failed with error: %i", pid, GetLastError());
return -1;
}

/*
* Retrieve information on virtual address space
*/
BOOL vqeResult = VirtualQueryEx(pHandle, addr, &mbi, sizeof(MEMORY_BASIC_INFORMATION64));
if (!vqeResult)
{
printf("Error querying virtual memory: %i", GetLastError());
return -1;
}

PrintMemoryBasicInformation64(&mbi);

/*
* Read the DOS header
*/
BOOL rpmResult = ReadProcessMemory(pHandle, (LPCVOID)mbi.BaseAddress, (LPVOID)&header, sizeof(header), 0);
if (!rpmResult) {
printf("Error reading memory address: %i. Failed with error: %i", mbi.BaseAddress, GetLastError());
return -1;
}

一切正常,除了当我尝试打印签名时:

printf("Signature: %x", header.Signature);

它给出了一个不正确的十六进制值,基本上是 MZ 的倒转:

Signature: 0x785a4d

由于我的系统是小端字节序,这是有道理的,但是我如何正确打印它?

我已附加图像来显示存储在 headers.Signature 中的值:

enter image description here

最佳答案

@Arkuu 是正确的,这不是字节序问题。

更新

我对下面的解决方案不满意。我觉得我还缺少一些东西。我应该使用 IMAGE_DOS_HEADER 而不是 IMAGE_NT_HEADERS,因为我正在检查 DOS stub 而不是 PE header 。

IMAGE_DOS_HEADER header;
...
printf("Signature: %#x\n", header.e_magic);
<小时/><删除>我解决这个问题的方法是使用 [_byteswap_ulong][1] ,如下所示: #包括 ... printf("签名:%#lx\n", _byteswap_ulong(header.Signature));该宏将反转字节顺序。根据[文档](https://learn.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_image_nt_headers)签名是: 将文件标识为 PE 镜像的 4 字节签名。字节为“PE\0\0”。在小端系统上,这将是相反的顺序,就像我的情况一样。使用“_byteswap_ulong”宏反转字节并返回我期望的值。

关于c - 如何打印以小端存储的十六进制值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54029646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com