【发布时间】:2009-10-26 22:07:04
【问题描述】:
我正在编写一个被另一个程序调用的 .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
结束转储尝试..
如果我再次运行相同的函数,而不是在第一部分看到值 0,我会再次看到值 1。我以为它改变了 0x7f793db70040 的值,但显然它又回到了旧值。
另外,0xf793db70040 是通过调试器获得的。有没有办法查看“符号”或类似的东西是否指向该地址,以及在我的代码中使用它的方法?
【问题讨论】:
-
您究竟为什么要这样做?以这种方式使用常量内存地址在很多层面上都是错误的......你想达到什么目的?
-
您是否知道根据您的操作系统,相同的逻辑地址可能会出现多次?几乎所有操作系统都进行内存映射,而您正在使用的操作系统也可能会这样做,至少我不知道没有 MM 的 64 位操作系统。因此,您启动的每个进程都会有一个“7f793db70040”,并且 ist 可能总是映射到不同的物理内存位置。如果您的进程结束,内存将被重新映射,您的更改将消失。
标签: c reflection memory struct