- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个由另一个程序调用的 .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 是通过调试器获得的。有没有办法查看“符号”或类似的东西是否指向该地址,以及在我的代码中使用它的方法?
最佳答案
您正在设置一个完全任意的内存地址,并且您希望发生有意义的事情?内存一直在变化。除非您真的知道该内存的用途,否则您插入的值会被覆盖也就不足为奇了。
现在,考虑到那里的高值,它可能是堆栈上的一个值,这意味着它将是:
如果内存地址有一个符号(堆栈或堆上不会有地址),并且它已导出(不太可能用于可执行文件),则可以使用 dlsym
获取它。 - 如果没有导出,并且可执行文件没有被删除,您可能能够解析ELF header 来找到它(这非常困难。您本质上是在实现一个调试器)。
一般来说,像这样灌输值(value)观几乎从来都不是正确的做事方式。事实上,通常在可执行文件中编辑代码比尝试像这样在内存中确定值要容易一些。您真正想要实现什么目标?
编辑:如果您想设置调试变量,两个更好的选择是:
.so
。正常访问(即主应用只有 extern int foo;
, .so
具有真正的 int foo;
)extern int foo;
在 .so
,并且(重要!)通过 -Wl,-E
至gcc
或g++
链接可执行文件(这将允许可执行文件反向导出符号)。.so
中的函数,传递变量的地址。 .so
然后可以将地址存储在以后可以找到的地方。此选项不要求变量是全局变量。不要使用调试器派生的地址。它可能是错误的地址,即使它是正确的地址,如果您重新编译任何内容,它也会发生变化。由于ASLR,它甚至可能在同一系统上两次运行相同的二进制文件之间发生变化。 。你根本不能依赖这个工作。
关于通过 C 中的 SO 更改内存中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1627613/
我是一名优秀的程序员,十分优秀!