BOOL CompareAPage(DWORD dwBaseAddr, DWORD dwValue)
{
// 读取1页内存
BYTE arBytes[4096];
if(!::ReadProcessMemory(g_hProcess, (LPVOID)dwBaseAddr, arBytes, 4096, NULL))
return FALSE; // 此页不可读 // 在这1页内存中查找
DWORD* pdw;
for(int i=0; i<(int)4*1024-3; i++)
{
pdw = (DWORD*)&arBytes[i];
if(pdw[0] == dwValue) // 等于要查找的值?
{
    .....
                      .....
}
} return TRUE;
}
这个函数是在指定的地址空间中查找一个值 如1234,我的问题是:
在进程地址空间中,值1234是什么类型存放的?是占几个字节?
假如1234是占4个字节,与DWORD一样,那么查找可以成功。但是如果1234占2个字节呢,那么这个函数不就查找不到这个值吗?能不能具体解释一下,先谢谢了!

解决方案 »

  1.   

    你用DWORD存放,并进行了强制转换,肯定是4个字节
      

  2.   

    如果1234是用两个字节来进行存放,那么楼主这个方法就未必可以了,因为1234的高位两个字节未必是0。
    按照你的方法只能是高位两字节是0的1234这样的DWORD才能匹配。所以如果楼主可以确定那个数字所占的内存大小,还是最好能够把范围缩小吧,比如找1234用unsigned short。
      

  3.   

    我用了DWORD类型来存放要查找的值,但是要查找的值在进程的地址空间中不一定占用4个字节啊,不知我这样说对不对?
      

  4.   

    不对在内存buffer中,查找一个DWORD,就是4个字节。你总需要一个变量保存你的值,哪怕是一个1,你所用的类型决定字节数,而不是你这个常量值决定你可以把1保存到BYTE类型,那么就是查找一个字节,保存到short,就是查找2个字节,保存到long,就是4个字节。是类型决定大小,而不是值决定大小。
      

  5.   

    00000000 10000000 00000000 00000001  00000010 ......
    假如我查找1(比如它占用两个字节 short,红色部分),那用我上面的那个函数不就查不到了吗,即使我给的查找参数类型是dword,但是内存中的目标数字的存放方式不确定啊?将byte数组转换成dword数组,是不是有问题。
      

  6.   

    楼上的都说完了,这段代码找的就是高位为0的1234。2楼说的对,应该尽量缩小查找的范围。内存里的东西是什么谁也说不好。最好是确定你要找的东西多长,是1 byte 还是word 又或是dword。==只能找到完全一样的值~
      

  7.   


    if(pdw[0] == dwValue) // 这两个类型都是DWORD,当然只会4个字节一组的比较根据你的需要,你是希望字节或者两个字节比较吗?如果是,就不要使用DWORD。
    字节比较,就用BYTE。
    双字节比较,就用WORD.