首页
社区
课程
招聘
ReadProcessMemory参数问题,求解答疑惑~~
发表于: 2013-2-17 12:46 4974

ReadProcessMemory参数问题,求解答疑惑~~

2013-2-17 12:46
4974
int fk;
ReadProcessMemory(open, (HMODULE)(0x18A2BC), (LPVOID)&fk, 4, NULL);

从内存中读取地址0x18A2BC处的数据,当fk定义为int类型时,读取的值是正确的
可是当fk类型定义为float类型时,为什么就读不出来呢?
float类型也是4个字节啊,作为接收数据存储空间,也够大了
为啥不行呢?请各位帮忙解答一下,谢谢了。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
BOOL NTAPI ReadProcessMemory        (        IN HANDLE         hProcess,
IN LPCVOID         lpBaseAddress,
IN LPVOID         lpBuffer,
IN SIZE_T         nSize,
OUT SIZE_T *         lpNumberOfBytesRead
)       
这是函数原型,第3个参数是数据缓冲区的指针,你用float不成功的原因,可能是float的数据组织方式和int不一样,它没法将4个字节全部使用以致出现错误。
这是我自己的理解。
2013-2-17 13:17
0
雪    币: 149
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我还遇到过读取数组时,也是弄的一头雾水。
byte bt[11][19];
ReadProcessMemory(open, (HMODULE)(0x18A2BC), (LPVOID)bt, 11*19, NULL);

如果我把bt类型换成int类型
int bt[11][19],bt存储的数据也不是正确的。
我都弄弄糊涂了,数据类型该怎么选择才好呢?
2013-2-17 13:38
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
ReadProcessMemory这个函数读取的是连续的数据,内存中可能就不是数组的形式,读出来肯定有问题的。
2013-2-17 14:27
0
雪    币: 21023
活跃值: (4220)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
我先写了一个简单的程序 :
        float test = 1.00;
        printf("%f\n",test);
        getch();
        test = 2.00;
        printf("%f\n",test);
        getch();
        test = 2.1;
        printf("%f\n",test);
        getch();
        test = 2.2;
        printf("%f\n",test);
        getch();
然后,用CE查ProcID和(float)test的地址(每次启动地址不一样)。
程序不要退出,因为每次启动地址不一样。

又写一个程序readprocessmemory读test的地址,没问题啊 !!
float test;
ReadProcessMemory(hProcess,(LPCVOID)0x34f8cc,&test,4,NULL);

你肯定地址没变,都是0x18A2BC???

你自己跟我一样,写简单程序测试一下。。
希望能帮上你的忙。
2013-2-17 15:07
0
雪    币: 115
活跃值: (46)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
楼上的你读的地址都是float的,当然成功
不同类型高低位不一样,存放位置和占长也不同

不过有点不懂,像&char中CPU怎么知道它的长度和结构
是通过寄存器说明还是有块表存放内存信息
2013-2-17 16:44
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
楼主问题没说清楚,是读取失败,还是读取成功,但float没有正确的值?
2013-2-17 17:18
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
写程序也先有基本的系统知识好不好?

我:
int x=12345;

char y[4]=0;

RtlMemory(y,&x,sizeof(x));

难道会失败么????

所谓数据类型,那全是给编译器看的。编译成最终的二进制机器码后,CPU只认内存地址和长度,不存在任何int,char等等数据类型。

一言以蔽之,所谓数据类型,纯粹是给人以及编译器看的,与电脑CPU半毛钱关系都没有。
2013-2-17 20:55
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
9
float型在内存中是按一定标准存储的(并不像整形那样单纯地把值存到内存里),如果你内存地址处原本的数据就符合float的存储规范,则直接读入float变量没有问题。

如果原本内容是一个int型,你想读出值后把它当float型使用,则先读入一个int型变量再作强制类型转换即可,方法如下:

int intfk;
float fltfk;
ReadProcessMemory(open, (HMODULE)(0x18A2BC), (LPVOID)&fk, 4, NULL);
fltfk = (float)intfk;


另附float存储标准(摘自http://blog.csdn.net/adream307/article/details/7246993):

float一共32位,其结构定义如下:
|-------- 31 -------|------------ 30-23 ------------ |------------ 22-0 ------------|
符号位(sign) 指数部分(exp) 小数部分(mag)
sign:符号位就一位,0表示正数,1表示负数
exp: 指数部分,无符号正数
mag:小数部分,定点小数,小数点在最左边。
float的表达式 : pow(-1,sign) * (1+mag) * pow(2,exp-127)
2013-2-17 21:13
0
雪    币: 21023
活跃值: (4220)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
楼上给了漂亮和正确的答复!
赞 !
2013-2-18 07:09
0
雪    币: 78
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
@Naylon 赞一个
2013-2-18 13:08
0
游客
登录 | 注册 方可回帖
返回
//