所以,我已经在一个进程(游戏)中注入了一个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查看),但之后一切都错了,你能帮助我吗?我坚持这个,我尝试过很多东西......:/
提前谢谢你,
答案 0 :(得分:5)
我假设您希望将指针增加OFFSET
和BASETIME
个字节。如果是这样,您的代码不会以字节为单位递增。相反,它增加了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;
}
}