首页
社区
课程
招聘
[求助]请教下一个关于内存数据类型的问题
发表于: 2010-7-29 01:28 4025

[求助]请教下一个关于内存数据类型的问题

2010-7-29 01:28
4025
我尝试从远处的进程的内存里读取一些数据,当这些数据是整型的时候,都能正常读出,
但我在读取到一个双精度浮点数据的时候,怎么读都是0.
我用OD跟了一下自己的程序,
push    0                                                           || pBytesRead = NULL
push    8                                                           || BytesToRead = 8
lea     edx, dword ptr [ebp-48]                                     ||
push    edx                                                         || Buffer = 0012FC94
mov     eax, dword ptr [42D000]                                     ||
push    eax                                                         || pBaseAddress => A53EA88
mov     ecx, dword ptr [42D02C]                                     ||
push    ecx                                                         || hProcess => 000000D0 (window)
call    dword ptr [<&KERNEL32.ReadProces>                           || ReadProcessMemory

从远进程读取的数据,放在本地的0x0012FC94当中,但当我跟着走到要调用EBP-48变量的时候
堆栈 ss:[0012FC94]=00000000
从远进程读取来的数据为0

因为是双精度,所以,我在读取的时候,设置的读取8个Bytes.下面是C++源码
::ReadProcessMemory(FarHandle,(LPCVOID)Addres2,&FloatData,8,NULL);

这个调用在读取4字节的DWORD的时候都很正常.能读取数据,只有我刚才碰到的这浮点读不出来.
怀疑跟ReadProcessMemory最后一个参数有关,于是翻了下MSDN,MSDN这样说的:
lpNumberOfBytesRead 
Pointer to the actual number of bytes transferred into the specified buffer. If lpNumberOfBytesRead is NULL, the parameter is ignored. 

但我把最后一个参数,带成一个DWORD的 指针的时候,我的程序变成如下:
DWORD dwData1;
::ReadProcessMemory(FarHandle,(LPCVOID)Addres2,&FloatData,8,&dwData1);

用OD跟了一下,发现dwData1里面就存了一个数据"8"
FloatData里面的数据还是0;
也就是说,还是没有把办法从内存那个位置,读取到内存中的双精度浮点数,到FloatData里面

FloatData里面的数据始终为0

求各位大大帮我看下呀


补充:

再次确认了下,用OD加载目标进程,内存窗口中转到A53EA88这个值都可以看到,是有数据的
内存窗口里看 A53EA88这个我要读取的目标进程内存地址的8个字节,是双精度浮点的,8位

0A53EA88  00 00 00 00 00 E0 77 40                          .....鄊@.

我用内存遍历器看到这个数值显示的是double=382
内存遍历器都能读出数值是382,我想应该是转换问题吧.内存遍历器是帮我转换成10进制来看的
但是C++中,怎么转换呢?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 998
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
最后一个参数是读取到的字节数。你看12fc94有啥用,那个是你用来接收数据的缓冲地址。你应该看下a55ea88指向的数据的值。
2010-7-29 11:06
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
::ReadProcessMemory  是从   pBaseAddress => A53EA88  里面读取数据放到 Buffer = 0012FC94 里的吧......

我用OD跟到::ReadProcessMemory执行完了以后,如果是整型的,那么Buffer = 0012FC94地址里就会有接受到的数据

但我读取浮点型的时候,Buffer = 0012FC94接收不到任何数据,::ReadProcessMemory执行完了以后,这个地址里面装的数据是 0
2010-7-29 16:08
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
回2楼 远进程地址这个值pBaseAddress => A53EA88 是有效的
用OD内存窗口转到这个值都可以看到,是有数据的
内存窗口里如下显示A53EA88的8个字节,是双精度浮点的,8位

0A53EA88  00 00 00 00 00 E0 6D 40                          .....鄊@.
2010-7-29 16:15
0
雪    币: 998
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
GetLastError()
2010-7-29 16:37
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我用内存遍历器都能读取出数值,但是我不知道内存遍历器是怎么转换的?

0A53EA88  00 00 00 00 00 E0 77 40     这个数值等于 double的382  ???

他是怎么转换的?
2010-7-29 16:50
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
按IEEE浮点数格式转换一下吧,我记得最高位是符号位,剩下的是指数和尾数,其它的都忘光了,汗……
2010-7-29 18:10
0
游客
登录 | 注册 方可回帖
返回
//