以下寫在DLL的對話框的,地址沒有問題,權限沒有問題
1
.這樣寫全局變量DWORD *BagNub1=(DWORD*)(*(DWORD*)0x08CBEE8+0x30),為什么調用的程序無法運行
這樣寫全局變量DWORD *BagNub1
        并緊接著寫BagNub1=*(DWORD*)(*(DWORD*)0x08CBEE8+0x30),編驛器通不過,說出錯
這樣寫全局變量DWORD *BagNub1
   然后在ONPAINT里面BagNub1=*(DWORD*)(*(DWORD*)0x08CBEE8+0x30),這樣是行的
這樣寫全局變量DWORD *BagNub1
在OnInitDialog里面BagNub1=*(DWORD*)(*(DWORD*)0x08CBEE8+0x30),這樣也會出錯行的
到底全局變量的初始化,和ONPAINT,OnInitDialog等這些函數的先后執行順序是怎么樣的,我想要做的是
在對話框剛啟動的時候讓BagNub1指向一個地址的里面的內容(也是一個地址)加上一個偏移之后的地址.
2.注入后用指針讀取數據的問題
char *p=(char*)Base;
*p是所有的字符串
TYBE *p=(TYBE*)Base;
*p是一個字節
DWORD *p=(DWORD*)Base;
*p是四個字節的
我現在想用指針從Base開始讀取19個字節,
我想的辦法是用一個19個字節長變量申明指針,好像沒有這樣的變量啊,結構體行不行啊
幫我用指針的方式寫最最簡單的代碼讀取BASE開始的19個字節;
DWORD *p=(DWORD*)Base;
這樣可以讀4個字節,但是好像讀出的來的數據和內存中的順序是不一樣,高高低低的
怎么處理成一樣的順序呢?
3.sizeof(MEMORY_BASIC_INFORMATION))和
MEMORY_BASIC_INFORMATION.SIZE_T RegionSize
有啥區別啊,打個比方行不,謝謝

解决方案 »

  1.   

    0x08CBEE8是哪个函数的地址,调用的时候,这个函数是否可用了?
      

  2.   

    1,如果定义了指针 DWORD *BagNub1;
      那么*(DWORD*)(*(DWORD*)0x08CBEE8+0x30);一定是错的,想都不用想
      你说在OnPain里正常,我觉得你在骗人,或者其他的过程你没给全  至于说为啥不运行,你有问你自己了,你说地址全限没问题,那么计算呢
      你保证你的扩号位置没有错误?2 你所说的:char *p=(char*)Base;*p是所有的字符串
      那只是你自以为的猜想.
      要取19个字节,总得有地方放
      方法一:
      char buf[19];
      char *p=(char*)Base;
      memcpy(buf,p,19);
      方法二:
      typedef struct XXX
      {
         char buf[19];
      };
      XXX *p=(XXX*)Base;
      p->buf就是你需要的结果3 sizeof是规定按字节计算的,比如人的重量
      MEMORY_BASIC_INFORMATION.SIZE_T RegionSize
      根据MEMORY_BASIC_INFORMATION的定义不同可能会有不同的计量单位
      那么如果 
      sizeof(你)=60 表示你有60公斤
      sizeof(你老婆)=50 表示你老婆有50公斤
      显然 sizeof(你两口子)=110;
      那么如果 MEMORY_BASIC_INFORMATION是按人头算呢
      显然, 按人头算,你和你老婆分别是1,一起算就是2
      你说一样不一样  
      

  3.   

    补充一下:MEMORY_BASIC_INFORMATION我没用过
    按字面意思应该是基本内存的信息那么如果sizeof(你) 表示取你的重量
    那么MEMORY_BASIC_INFORMATION可能相当于sizeof(你全家)
      

  4.   

    謝謝您,memcpy我知道了,和下面的答案一樣,謝謝
      

  5.   

    0x08CBEE8里面是一個地址,不是函數謝謝
      

  6.   

    毫無疑問,你說的對我最有用,非常感謝你.第二三個問題我知道答案了,
    第一個,是我根據實際情況而說的.地址我有CE加好的,每次附加進程之后都是正確的,
    所以不會錯,權限是注入之后讀取,應該也不可能錯,我是用OD找的,然后用CE添加指針的,
    本人菜鳥,請大俠告知為什么你認為肯定是不對的呢?空指針嗎?因為整個程序需要用到它,
    所以我只能聲明成全局變量,
      

  7.   

    你取这个值的意义和实际情况我不清楚
    所以不能最直接回答和解决你的问题
    只能凭你给的信息和常规信息DWORD *BagNub1;是定义的一个数据的指针
    而*(.....)是取的指针的值
    所以:
    BagNub1= *(DWORD*)(*(DWORD*)0x08CBEE8+0x30);
    翻译成中文意思就是: 指针=值;
    这就是我肯定是错的理由,谁家编译器能编译通过那才是怪事
    所以正确状况一定是: BagNub1=(DWORD*)....现在来看:DWORD *BagNub1=(DWORD*)(*(DWORD*)0x08CBEE8+0x30)
    毫无疑问这句的语法格式是对的,可行的
    关键是(*(DWORD*)0x08CBEE8+0x30)是不是正确表达了我们要的东西那么,这个变数就很大了,我怎么知道你要啥呢?(DWORD*)0x08CBEE8+0x30
    (DWORD*)(0x08CBEE8+0x30)
    *(DWORD*)0x08CBEE8+0x30
    *(DWORD*)(0x08CBEE8+0x30)
    *((DWORD*)0x08CBEE8+0x30)
    *((DWORD*)(0x08CBEE8+0x30))等仅仅是扩号的区别,但实际值的意义却是天壤之别之别
    那个才是你想要的,只有你自己才知道所以,0x08CBEE8
      

  8.   

    所以,0x08CBEE8 可能是对的,权限也够
    但你保证0x08CBEE8+0x30了吗?
    就算0x08CBEE8+0x30正常
    你能保证(DWORD*)0x08CBEE8+0x30吗
    就酸(DWORD*)0x08CBEE8+0x30正常
    你能保证*(DWORD*)0x08CBEE8+0x30吗?也许你要的是*((DWORD*)(0x08CBEE8+0x30))
    也能保证正常,
    但你写成了 *(DWORD*)0x08CBEE8+0x30
    这就不在你的保证范围了,你还能保证吗?
      

  9.   

    所以,你应该描述清楚:
    1, 0x08CBEE8 代表啥
    2, 为啥要加0x30, 是直接加,还是取和0x08CBEE8有关系的数来加
    3, 你最后需要啥就用你的例来说
    DWORD *BagNub1=(DWORD*)(*(DWORD*)0x08CBEE8+0x30)我理解的意思就是0x08CBEE8代表一个地址
    *(DWORD*)0x08CBEE8代表该地址保存的一个DWORD的数据
    把这个数据作为一个新的基地址
    取该基地址偏移0x30处的数做为最后地址
    这个地址指向的内存保存的那个数才是你最后要的数你自己看着办
      

  10.   

    謝謝你,你太神了,我剛看了一下,在ONPAINT 是這樣寫的
    BagNub=(DWORD*)(*(DWORD*)0x08CBEE8+0x30);正常編譯要是把BagNub=(DWORD*)(*(DWORD*)0x08CBEE8+0x30);寫在
    OnInitDialog里,就是編譯出錯;
    'BagNub' : undeclared identifier
    '=' : cannot convert from 'unsigned long *' to 'int'
     'BagNub' : 'unsigned long *' differs in levels of indirection from 'int'
    何解啊這樣是對的(DWORD*)(*(DWORD*)0x08CBEE8+0x30);
    我的原意是這樣1.取得地址0x08CBEE8的值,取到的值假設為A,(A也是一個地址)
                 2.把A加上0X30得到另一個值B ,B也是一個地址
                 3.把指針BagNub對准B
                 4.*BagNub就是地址B里面的值 
      

  11.   

    是不是這樣的
    全局變量的初始化在OnInitDialog后面,在ONPAINT前面.
      

  12.   

    按你的描述BagNub=(DWORD*)(*(DWORD*)0x08CBEE8+0x30);就是对的了
    但你说在OnInitDialog使用出错说明多半是你的变量BagNub定义有问题
    你是如何定义全局变量的呢?
    有没有和局部变量重名呢?
      

  13.   

    另外:假如*(DWORD*)0x08CBEE8>=0xFFFFFFdF会有什么问题发生呢?
      

  14.   

    'BagNub' : undeclared identifier
    在哪定义的这个变量
      

  15.   

    我明白了,我的變量定義有問題,先后順序的問題,
    我是定義在DLG.CPP里的,但是OnInitDialog這個函數在前面,我這個DWORD *BagNub,定義到了
    他的后面,而我添加的ONPAINT函數在最最后面,這樣子問題就出來啦,哈哈我明白了,謝謝樓上的几位大
    哥,我感謝你們,特別鳴謝gz_qmc(二农戏猪) 
      

  16.   

    二农戏猪高手,幫我看看以下這個貼子,什么問題
    http://topic.csdn.net/u/20110711/21/5c181475-90ad-4359-a63c-b312b6256a58.html