C ++读存储器地址/指针&偏移

时间:2015-04-30 02:02:50

标签: c++ pointers memory offset

所以,我已经在一个进程(游戏)中注入了一个DLL,以便我可以从进程内存中读取。

我想获得当前的游戏时间,并且我找到了静态基地址&使用Cheat Engine偏移它:

"的Game.exe&#34 + 0158069C

抵消:14

这是我尝试获取浮动值的代码(当前游戏计时器):

//Offsets
#define BASETIME 0x158069C
#define OFFSET 0x14

void CurrentTime() {

    float *time;
    DWORD *BaseAddress = (DWORD*)GetModuleHandle(NULL);
    DWORD *BaseTimeAddress = (DWORD*)(BaseAddress + BASETIME);
    time = (float*)(BaseTimeAddress + OFFSET);

    if (BaseTimeAddress && time) //Check the addresses, not values.
    {
        std::cout << "Base Address : " << BaseAddress << endl; // Correct
        std::cout << "Base Time Address &: " << &BaseTimeAddress << endl; // Not correct
        std::cout << "Base Time Address : " << BaseTimeAddress << endl; // Not correct
        std::cout << "Time Value : " << *time << endl; // Not correct
    }
}

基地址的cout是正确的(我可以用Cheat Engine查看),但之后一切都错了,你能帮助我吗?我坚持这个,我尝试过很多东西......:/

提前谢谢你,

2 个答案:

答案 0 :(得分:5)

我假设您希望将指针增加OFFSETBASETIME个字节。如果是这样,您的代码不会以字节为单位递增。相反,它增加了sizeof(DWORD) * OFFSET个字节。

原因是基本指针类型为DWORD*,并且n递增此类型的指针将使您从一开始就n * sizeof(DWORD)。这不会起作用。

最简单的解决方案是在执行指针算术时转换为char *,以便增量前进sizeof(char),而不是sizeof(DWORD)

 DWORD *BaseTimeAddress = (DWORD*)((char *)BaseAddress + BASETIME);
 time = (float*)((char *)BaseTimeAddress + OFFSET);

现在,无论你最终到底是你想要的数据,这是我无法回答的。但是,如果您的目标是逐个字节地增加,那么您应该进行如上所示的更正。

答案 1 :(得分:2)

谢谢PaulMcKenzie我明白了,

所以对于那些像我一样挣扎的人来说,这才是实际工作的最终代码:

public class Test {
    public static void main(String[] args) 
    {
        String text = "Python is a cool language but Java \n" +
        "is also cool since it is purely object oriented language ";
        String[] keys = text.split(" ");
        String[] uniqueKeys;
        int count = 0;
        System.out.println(text);
        uniqueKeys = getUniqueKeys(keys);
        int line2 = text.indexOf('\n');

        for(String key: uniqueKeys)
        {
            if(null == key)
            {
                break;
            }           
            for(String s : keys)
            {
                if(key.equals(s))
                {
                    count++;
                }               
            }

            System.out.println(count +" "+ key);
            count=0;
        }
    }

    private static String[] getUniqueKeys(String[] keys)
    {
        String[] uniqueKeys = new String[keys.length];

        uniqueKeys[0] = keys[0];
        int uniqueKeyIndex = 1;
        boolean keyAlreadyExists = false;

        for(int i=1; i<keys.length ; i++)
        {
            for(int j=0; j<=uniqueKeyIndex; j++)
            {
                if(keys[i].equals(uniqueKeys[j]))
                {
                    keyAlreadyExists = true;
                }
            }           

            if(!keyAlreadyExists)
            {
                uniqueKeys[uniqueKeyIndex] = keys[i];
                uniqueKeyIndex++;               
            }
            keyAlreadyExists = false;
        }       
        return uniqueKeys;
    }
}