1、多重指针通常是指多个指针的嵌套,每个指针里存放的是其他指针的地址,简单点说就是在一个变量中存入了一个数,而这个数正好是一个变量的地址,通过这个地址就可以去操作那个变量
2、注意事项:使用ReadProcessMemory读取指针是要注意读取的是该地址里的数据,这个数据表示一个地址
3、代码如下:实现的功能是读取CS1.6中自己的坐标。在读数据时需要注意,最后一层指针指向的就是我们需要的数据,所以千万不要再去读取最后一层指针的地址
#pragma once #include#include #include "iHook.h" void ReadFBmem(HANDLE hProcess, PDWORD dstAddr, DWORD dwCount); HANDLE iOpenProcess(DWORD PID); int main() { LPCSTR szAppName = "Counter-Strike"; LPCSTR szModName = "cstrike.exe"; DWORD bsAddr = 0; DWORD PID = 0; DWORD dstAddr = 0; DWORD offSet[] = {0x00, 0x0, 0x4B9C, 0x88 }; DWORD cOffset = sizeof(offSet) / sizeof(DWORD); FindPID(szAppName, PID); iDumpModule(szModName, bsAddr, PID); offSet[0] = bsAddr + 0x95A244; HANDLE hProcess = iOpenProcess(PID); while (1) { ReadFBmem(hProcess, offSet, cOffset); Sleep(100); } //printf("%0xn", offSet[0]); //CloseHandle(hProcess); return 0; } void ReadFBmem(HANDLE hProcess, PDWORD lpdstAddr, DWORD dwCount) { FLOAT szBuffer[4] = { 0 }; DWORD dwRead = lpdstAddr[0]; DWORD lpBuffer[2]; for (int i = 0; i < dwCount - 1; i++) { if (i != 0) { //需要加偏移 dwRead = lpBuffer[0] + lpdstAddr[i]; } ReadProcessMemory(hProcess, (LPVOID)dwRead, &lpBuffer[0], sizeof(DWORD), NULL); } //最后一级指针是数据 ReadProcessMemory(hProcess, (LPVOID)(lpBuffer[0] + lpdstAddr[dwCount - 1]), &szBuffer, 3*sizeof(FLOAT), NULL); for (int j = 0; j < 3; j++) { printf("%.2fn", szBuffer[j]); } } HANDLE iOpenProcess(DWORD PID) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); if (hProcess == INVALID_HANDLE_VALUE) { printf("打开进程句柄失败"); return 0; } return hProcess; }
多级指针的读写
多级指针写内存(地址指针, 数组大小)
{
地址缓存数组 = {0};
中转变量 = 地址指针[0];
//读指针
循环(I =0 ; I < 数组大小 – 1; i++)
{
if(I != 0)
中转变量 = 地址缓存[0] + 地址指针[i];
读内存(中转变量);
}
//读数据
读内存(地址缓存数组[0] + 地址指针[数组大小 - 1];
}



