0
点赞
收藏
分享

微信扫一扫

如何使用ReadProcessMemory读取多重指针

_LEON_ 2022-02-25 阅读 64
c++

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];
}
举报

相关推荐

0 条评论