gpt4 book ai didi

C++如何读取函数的前几个字节? (32 位机器)

转载 作者:搜寻专家 更新时间:2023-10-31 01:29:54 25 4
gpt4 key购买 nike

假设我有一个这样的函数(完全随机,举个例子,我只是在 30 秒内写完)

bool exampleAuthetnication(char *a, char *b)
{
bool didAuthenticate = false;
if(strcmp(a, b) == 0)
{
didAuthenticate = true;
}

if(didAuthenticate)
{
return true;
}
else
{
stopExecutable();
return false;
}
}

我将如何读取此函数的前几个字节?

我想出了这个

int functionByteArray[10];
for (int i = 0; i < 10; i++)
{
functionByteArray[i] = *(int*)(((int)&exampleAuthetnication) + (0x04 * i));
}

其背后的逻辑是我们获取函数的内存地址(在本例中为 exampleAuthetnication())然后我们转换为 int 指针然后取消引用以获取当前字节行的值我们正在尝试读取然后存储在 functionByteArray 中,但它似乎无法正常工作。我究竟做错了什么?我正在努力实现的目标是否可行?

最佳答案

理论上(根据 C++11 标准)您甚至不能将函数指针转换为数据指针(在 Harvard architectures 上,代码和数据位于不同的内存和不同的地址空间中)。一些操作系统或处理器也可能禁止读取可执行文件 code segments (阅读有关 NX bit 的信息)。

实际上,在运行某些操作系统(如 Linux 或 Windows)的 x86-64(或 32 位 x86)上,函数代码是一个字节序列并且可以不对齐,并且位于( common) 其进程的虚拟地址空间。所以你至少应该有 char functionByteArray[40];你可以使用 std::memcpy来自 <string>并做一些

std::memcpy(functionByteArray, (char*)&exampleAuthetnication,
sizeof(functionByteArray));

最后你的代码是错误的,因为 - 在 x86-64 上尤其是 - int与指针的大小不同(因此 (int)&exampleAuthetnication 丢失了地址的高位字节)。你至少应该使用 intptr_t .和 int具有比代码更强的对齐约束。

顺便说一句,您可能还要求编译器显示生成的汇编代码。用GCC编译你的 exampleAhtetnication带有 g++ -O -fverbose-asm -S 的 C++ 代码并查看生成的 .s文件。

注意 C++ 编译器可能 optimize到从代码段“删除”某些功能的地步(例如,因为该功能已在各处内联),或将功能代码分成几部分,或将其放入 exampleAhtetnication在另一个函数“内部”编写代码...

关于C++如何读取函数的前几个字节? (32 位机器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49022765/

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