将十六进制地址传递给指针变量

3

我知道如何使用指针。但我不知道如何做到这一点:

我有一个十六进制地址,它当然具有来自任何应用程序的任何值。

我知道如何找到我想要的地址。 我想编写C代码将此地址传递给指针变量,然后我可以从该地址捕获值等等。

例如:

hex 0x00010010
int *pointer;

我该如何将这个地址传递给指针,有什么语法吗?
2个回答

7
通过使用int*,您假设您指向的数据是一个int(在大多数操作系统上为4个字节)。
我们不应该使用void*吗?稍后,如果您想使用特定类型访问其数据,您只需要进行转换。
void *addr = (void*)0x0023FF74; // valid memory address within my app

printf("Address: %p\n", addr);
getchar();

printf("Data (4bytes): %d\n", *(int*)addr); // print the first 4 bytes of data as int
getchar();

编辑:

请帮我理解你想做什么,因为这句话让我感到困惑:

有一个应用程序使用了那个地址,我知道它的值,但是(int)指针无法访问该值。

你是想编写一个应用程序,以修改正在运行系统的另一个应用程序的内存吗?你目前的方法行不通,原因如下:当操作系统将您的应用程序加载到进程中时,它会保留一块内存区域供进程使用,并为该区域分配一系列虚拟地址。这些虚拟地址不能直接映射到RAM中的内存地址,因此操作系统必须为其保留内部表格。

在Windows上,每个已加载的进程都接收相同范围的虚拟地址,但是这个区域只对在其中运行的进程可见。例如,在Windows上,进程被加载到内存地址0x00400000,这意味着每个进程都有自己的内存地址0x00400000,因此您不能将X内存地址分配给应用程序中的指针,并期望Windows神奇地知道您正在引用另一个应用程序内部的地址X。

您想实现的称为代码注入,网络上有很多相关信息。


现在我改成了void类型。他将十六进制地址传递给指针变量。第一个打印确认了这一点。他正确地显示了指针地址。问题是无法访问该值。有一个应用程序使用该地址,我知道其中的值,但是*(int*)pointer无法访问该值。 - Jacklyin
@Jacklyin 更新我的回答。对我们来说,你审查所有问题并接受最佳答案非常重要。每个答案旁边都有一个小复选框,请单击它以选择正式答案回答你的问题。 - karlphillip
哦,非常感谢你。我会在谷歌上搜索关于代码注入的信息。对于我的错误编辑,非常抱歉,这是我第一次来这里。谢谢大家。再见。 - Jacklyin

4

在典型的现代操作系统中,无法访问另一个进程(应用程序)的地址空间。这些地址是虚拟的,因此同样的数值对于不同的进程具有不同的含义。

如果您使用的是真正的“平坦”地址空间的系统(其中进程直接使用实际物理内存地址),例如基于680x0芯片的Amiga OS,则可以执行以下操作:

int *pointer = (int *) 0x00010010;

实际上我正在使用win7。我尝试了这段代码并进行了测试以显示值,但程序崩溃了。 - Jacklyin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接