简单的内存读取问题,已困惑我百多天!!!!!

hhhero 2004-04-30 11:15:48
不是我太笨,是明师太少。求教各位,请点一二!

我已取得一内存地址0x022C5458,然后我想取得这个地址的一个十进制的数据.
现在我的部分源程序如下,但是现在当我取2位数时,一切正常,取3位数就不能正常显示了,就显示出负数。 我对内存读取这一块不熟悉,请大虾给我分析一二,在下感激不尽.另外, 在下特笨,好问问题,分数已快散尽,所以,只能给大虾20分了,原谅一二...


//得到线程id
GetWindowThreadProcessId(hWnd,&hProcId);

//取得线程
nOK = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,hProcId);

//写入内存
Writeed =0x2B; //要修改的数值
WriteProcessMemory(nOK,(LPVOID)0x022C5458,&Writeed,1,NULL);

//读取内存
OK=ReadProcessMemory(nOK,(LPCVOID)0x022C5458,&buffer[0],1,NULL);

if(OK==TRUE)
{
//设定字样式
SetTextColor(hdc,RGB(0,255,0));
SetBkColor(hdc,RGB(0,0,0));
SetBkMode(hdc,OPAQUE);

// print the message
sprintf(msg_buf,"%d",buffer[0]);
TextOut(hdc,380,120,msg_buf,strlen(msg_buf));
return(0);
}
...全文
71 18 点赞 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hhhero 2004-04-30
虽然我没明白,但是非常感谢各位老大,可能是我太笨了,我来好好烟酒烟酒.....
  • 打赏
  • 举报
回复
王国凡 2004-04-30
一个例子:

#include <iostream.h>

void main()
{
int array[9];
int *p = array;

for (int i=0; i<9; i++) array[i] = i*2; //初始化
for (int j=0; j<9; j++)
{
// 输出地址和值
cout << "&array[" << j << "]:" << p << " = " << *p << endl;
++p;
}
}
  • 打赏
  • 举报
回复
王国凡 2004-04-30
0x022C5458 是你要取的值所在的内存地址吗?
  • 打赏
  • 举报
回复
hhhero 2004-04-30
不是啊,这个内存里本来就有我想要取的内容,不是我写进去的,

我现在是想把这个内存地址里的内容取出来,显示到屏幕上,但是我不明白怎么取内存里的数据,比如我现在想取这个内存里的一个十进制3位数,我怎么取,再把它显示到屏幕上?
如果可能的话,能告诉我下原理,感激不尽
  • 打赏
  • 举报
回复
王国凡 2004-04-30
版主已经搞定了嘛 :-)

就是先取地址,然后把地址所在的内容赋值了。
  • 打赏
  • 举报
回复
hhhero 2004-04-30
回复人: he_zhidan(何志丹:风云伐日) ( ) 信誉:

OK=ReadProcessMemory(nOK,(LPCVOID)0x022C5458,&buffer[0],1,NULL);

=============
int * p = 0x022C5458 ;
int x = *p;

大虾,啥意思,我笨,麻烦你再说明一下意思,在下谢了
  • 打赏
  • 举报
回复
OK=ReadProcessMemory(nOK,(LPCVOID)0x022C5458,&buffer[0],1,NULL);

=============
int * p = 0x022C5458 ;
int x = *p;
  • 打赏
  • 举报
回复
hhhero 2004-04-30
刚发错了,应该不要写入内存的那句

这个地址的内存本来就有了一个10进制的3位数,我现在的目的就是想把它取出来,并显示到屏幕上

重发一次,、谢谢大虾再看一下
//得到线程id
GetWindowThreadProcessId(hWnd,&hProcId);

//取得线程
nOK = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,hProcId);



//读取内存
OK=ReadProcessMemory(nOK,(LPCVOID)0x022C5458,&buffer[0],4,NULL);

if(OK==TRUE)
{
//设定字样式
SetTextColor(hdc,RGB(0,255,0));
SetBkColor(hdc,RGB(0,0,0));
SetBkMode(hdc,OPAQUE);

// print the message
sprintf(msg_buf,"%d",buffer[0]);
TextOut(hdc,380,120,msg_buf,strlen(msg_buf));
return(0);
}
  • 打赏
  • 举报
回复
icr_mio 2004-04-30
从你的程序看来是写了1个字节,又把他取出来,

看不出来以下描述的东西啊:
取2位数时,一切正常,取3位数就不能正常显示了,就显示出负数
  • 打赏
  • 举报
回复
hhhero 2004-04-30
非常感谢各位老大的答案,再次谢谢 ,我会好好研究!!!向牛人们学习!!!向同志们致敬!!!!
感谢各位在百忙之中回答我的问题!!!!!!!!!!!
  • 打赏
  • 举报
回复
icanfeeling 2004-04-30
……
  • 打赏
  • 举报
回复
jimlei76 2004-04-30
1.你是要读个3位10进制数(不会是3字节的吧)
2.你的数的类型是int?UINT? WORD?.....等等,具体什么类型?
3.假定你是个int,你的char buf[4];zaz在你成功读后可以这样得到个2字节的数(3位10进制需要2个字节)---short int a; short int* p=(short int*)buf; a=*p;
不知道能不能满足你的要求。符合你的本来意愿不?
  • 打赏
  • 举报
回复
madhappy 2004-04-30
int * p = 0x022C5458 ;
int x = *p;

这样就可以了阿。告诉你以整型方式读取这块0x022C5458地址,如果地址可用,则把地址的整型值赋给x这个变量。

还有我不明白,什么叫取2位,什么叫取3位?
  • 打赏
  • 举报
回复
Pipi0714 2004-04-30
你的代码中的写内存的时候出现了错误,应该是4个字节而你的参数中为1。
WriteProcessMemory(hProcess,(LPVOID)dwAddress,&dwValue,4/*此处*/,NULL);
我试了,写入1000,0,100读出来的都正确。不知道你什么地方错了。
我的操作系统为window2000
  • 打赏
  • 举报
回复
Pipi0714 2004-04-30
你说的什么两位数,三位数的。我试了100,读出来也是100
  • 打赏
  • 举报
回复
icr_mio 2004-04-30
但是如果你不敢确定这个地址的保护属性的话,也只有用ReadProcessMemory了
  • 打赏
  • 举报
回复
icr_mio 2004-04-30
楼上老大的意思是说,如果你不是必须用到ReadProcessMemory这个函数就尽量不要用,别的方法也可以实现读取固定地址的内存
  • 打赏
  • 举报
回复
icr_mio 2004-04-30
你的buffer是怎么定义的?是 int 吗?改成 UINT 试试。
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC
加入

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-04-30 11:15
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……