CE查找天龙八部血量基址以及内存读写代码
以下是本人查找天龙八部血量基址的过程,一边找一边截图,于是就有了这篇博文,查找到一半因为CE提示所有调试寄存器都被占用了,结果天龙八部游戏也非法操作退出了。不过之前的努力没白费,找到了3个偏移量1BC,
重新登陆游戏,得从血量值开始重新找一遍了,这回找出了所有偏移和基址。注意,基址和游戏版本密切相关,一旦游戏更新,基址就变了,得重新找,但那些偏移一般都不变。其实基址就相当于一个游戏人物属性结构体的起始地址,通过偏移访问结构中的域,只要结构域个数和顺序没变,偏移应该是不变,除非天龙更改了人物属性的结构。
工具:Cheat Engine 6.1 英文版
天龙八部版本:3.05.2701
人物属性:基址 0x8AB540
血量: [[[[0x8AB540]+70]+1BC]+4]+2414
编程工具:Visual Studio 2008
C++为例,读游戏内存的代码如下。这代码除了读血值外,还读了人物的最大血值,蓝值,最大蓝值,精力,人物坐标这些。当然,如果你有兴趣,可以慢慢把人物其它所有属性偏移都查出来,不过我是没兴趣差那么属性值。另外,坐标值是float类型,4个字节,查找的时候不能用exact
value,而用Value
between...因为浮点数是不能用等号来比较大小的。要差X坐标54,就要查找数值在53和55之间。我发现坐标可以在基址偏移70,在分别48和50的地方读到,但这个偏移有点怪,因为这不在最后一层的偏移上,不过每次我都可以从那得到坐标,随便试了几个地图都行。而且查坐标往往得到很多匹配,可能是游戏处理坐标在很多地方存放了值,所以查起来比血量这些值更花时间。反正我不想继续深究下去...
typedef struct tagCharacterData{
&DWORD MaxB
&DWORD MaxM
}CHARACTERDATA;
bool ReadCharacterData(HWND hWndTLBB,
CHARACTERDATA& CharacterData)
&DWORD CharacterBaseAddr = 0x008AB540;
&DWORD TempV
&if (!hWndTLBB)
&::GetWindowThreadProcessId(hWndTLBB,
&pid);&&&&&&&&&&&&&&
// 获得进程ID&&
&handle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE,
pid);& // 最高权限打开
&if (!handle){
&&_cprintf("Open process
failed\r\n");
&ReadProcessMemory(handle,
(LPVOID)CharacterBaseAddr, &Value, 4, NULL);
&ReadProcessMemory(handle, (LPVOID)(Value + 0x70),
&Value, 4, NULL);
&ReadProcessMemory(handle, (LPVOID)(Value +
0x1BC), &Value, 4, NULL);
&ReadProcessMemory(handle, (LPVOID)(Value + 0x4),
&Value, 4, NULL);
&ReadProcessMemory(handle, (LPVOID)(Value +
0x2414), &CharacterData.Blood, 4, NULL);
&ReadProcessMemory(handle, (LPVOID)(Value +
0x2488), &CharacterData.MaxBlood, 4, NULL);
&ReadProcessMemory(handle, (LPVOID)(Value +
0x2418), &CharacterData.Magic, 4, NULL);
&ReadProcessMemory(handle, (LPVOID)(Value +
0x248C), &CharacterData.MaxMagic, 4, NULL);
&ReadProcessMemory(handle, (LPVOID)(Value +
0x2430), &CharacterData.Energy, 4, NULL);
&ReadProcessMemory(handle,
(LPVOID)CharacterBaseAddr, &Value, 4, NULL);
&ReadProcessMemory(handle, (LPVOID)(Value + 0x70),
&Value, 4, NULL);
&ReadProcessMemory(handle, (LPVOID)(Value + 0x48),
&fValue, 4, NULL);
&CharacterData.X =
static_cast&int&(fValue);
&ReadProcessMemory(handle, (LPVOID)(Value + 0x50),
&fValue, 4, NULL);
&CharacterData.Y =
static_cast&int&(fValue);
&PrintCharacterData(CharacterData);
&CloseHandle(handle);
void PrintCharacterData(CHARACTERDATA&
CharacterData)
&_cprintf("CharacterData.Blood =
%d\r\n",CharacterData.Blood);
&_cprintf("CharacterData.MaxBlood =
%d\r\n",CharacterData.MaxBlood);
&_cprintf("CharacterData.Magic =
%d\r\n",CharacterData.Magic);
&_cprintf("CharacterData.MaxMagic =
%d\r\n",CharacterData.MaxMagic);
&_cprintf("CharacterData.Energy =
%d\r\n",CharacterData.Energy);
&_cprintf("CharacterData.X =
%d\r\n",CharacterData.X);
&_cprintf("CharacterData.Y =
%d\r\n",CharacterData.Y);
执行结果如下:
直接上图:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。