1、多重指针通常是指多个指针的嵌套,每个指针里存放的是其他指针的地址,简单点说就是在一个变量中存入了一个数,而这个数正好是一个变量的地址,通过这个地址就可以去操作那个变量
2、注意事项:使用ReadProcessMemory读取指针是要注意读取的是该地址里的数据,这个数据表示一个地址
3、代码如下:实现的功能是读取CS1.6中自己的坐标。在读数据时需要注意,最后一层指针指向的就是我们需要的数据,所以千万不要再去读取最后一层指针的地址
#pragma once
#include<Windows.h>
#include<stdio.h>
#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("%0x\n", 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];
/*
//基地址
ReadProcessMemory(hProcess, (LPVOID)lpdstAddr[0], &lpBuffer[0],
sizeof(DWORD),
NULL);
//0
ReadProcessMemory(hProcess, (LPVOID)(lpBuffer[0]+lpdstAddr[1]), &lpBuffer[0],
sizeof(DWORD),
NULL);
//4B9C
ReadProcessMemory(hProcess, (LPVOID)(lpBuffer[0] + lpdstAddr[2]),
&lpBuffer[1], sizeof(DWORD), NULL);
//90 最后一级指针就是数据不用再进行操作
ReadProcessMemory(hProcess, (LPVOID)(lpBuffer[1] + lpdstAddr[3]),
&szBuffer[0], sizeof(FLOAT), NULL);
printf("第三级: %.2f\n", szBuffer[0]);
//dwRead = lpBuffer[0];
//printf("dwRead = %0x\n", dwRead);
*/
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("%.2f\n", szBuffer[j]);
}
/*
if (dwRead == 0)
{
printf("读内存失败\n");
return;
}
printf("%0x\n", dstAddr);
//FLOAT fBuffer[3] = { szBuffer[0], szBuffer[1], szBuffer[2] };
for (int i = 0; i < 3; i++)
{
printf("X: %0x\n", szBuffer[i]);
}
*/
}
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];
}