gpt4 book ai didi

通过 C 中的 SO 更改内存中的值

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

我正在编写一个由另一个程序调用的 .SO,并且我希望能够通过 .SO 中的函数翻转内存中的值

到目前为止我所拥有的是:

int 
axptrace( int numArguments, char* pMessageBuffer, int* pMessageBufferSize,
char* pData[], int* pDataLength[] )
{
printf("Beginning dump attempt..\n");
unsigned int* wkptr =(int*)0x7f793db70040;
printf("At %llx, the value was %d\n\n",(long long)wkptr,*wkptr);
if(*wkptr == 1){
printf("Switching the value.\n");
*wkptr = 0;
printf("At %llx, the value is now %d\n\n",(long long)wkptr,*wkptr);
printf("Switched!\n\n");
}
printf("Ending dump attempt..\n");
}

随着程序运行,我收到了预期的消息:

开始转储尝试..
在 7f793db70040 处,值为 1

切换值。
在 7f793db70040 处,该值现在为 0

切换!

结束转储尝试..

开始转储尝试..

在 7f793db70040 处,值为 0

结束转储尝试..

如果我再次运行相同的函数,我会再次看到值 1,而不是在第一部分中看到值 0。我以为它已经改变了0x7f793db70040处的值,但显然它又回到了旧值。

此外,0xf793db70040 是通过调试器获得的。有没有办法查看“符号”或类似的东西是否指向该地址,以及在我的代码中使用它的方法?

最佳答案

您正在设置一个完全任意的内存地址,并且您希望发生有意义的事情?内存一直在变化。除非您真的知道该内存的用途,否则您插入的值会被覆盖也就不足为奇了。

现在,考虑到那里的高值,它可能是堆栈上的一个值,这意味着它将是:

  1. 经常改变
  2. 用于多种目的
  3. 在不同地址用于相同目的

如果内存地址有一个符号(堆栈或堆上不会有地址),并且它已导出(不太可能用于可执行文件),则可以使用 dlsym 获取它。 - 如果没有导出,并且可执行文件没有被删除,您可能能够解析ELF header 来找到它(这非常困难。您本质上是在实现一个调试器)。

一般来说,像这样灌输值(value)观几乎从来都不是正确的做事方式。事实上,通常在可执行文件中编辑代码比尝试像这样在内存中确定值要容易一些。您真正想要实现什么目标?

编辑:如果您想设置调试变量,两个更好的选择是:

  1. 全局调试变量放入 .so 。正常访问(即主应用只有 extern int foo;.so 具有真正的 int foo; )
  2. 反之亦然;将全局调试变量放入exe中,使用 extern int foo;.so ,并且(重要!)通过 -Wl,-Egccg++链接可执行文件(这将允许可执行文件反向导出符号)。
  3. 让可执行文件调用 .so 中的函数,传递变量的地址。 .so然后可以将地址存储在以后可以找到的地方。此选项不要求变量是全局变量。

不要使用调试器派生的地址。它可能是错误的地址,即使它是正确的地址,如果您重新编译任何内容,它也会发生变化。由于ASLR,它甚至可能在同一系统上两次运行相同的二进制文件之间发生变化。 。你根本不能依赖这个工作。

关于通过 C 中的 SO 更改内存中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1627613/

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