利用DuplicateHandle()无驱动的另类读写内存方法,理论上可以过游戏保护读写

突发奇想出的原创思路在理论上经过完善应该可以做到过游戏保护无驱动读写内存

首先看一下MSDN对这个函数的定义

BOOL DuplicateHandle(
  HANDLE   hSourceProcessHandle,
  HANDLE   hSourceHandle,
  HANDLE   hTargetProcessHandle,
  LPHANDLE lpTargetHandle,
  DWORD    dwDesiredAccess,
  BOOL     bInheritHandle,
  DWORD    dwOptions
);

这个API实现的是跨进程拷贝内核对象,比如进程句柄、文件句柄都是可以拷贝的对象,如果目标进程中存在这样的对象,则可以将该对象拷贝到另一个进程中去使用。

第一个参数为要拷贝的目标进程句柄

第二个参数为目标进程中要拷贝的句柄

第三个参数为当前进程句柄

第四个参数传出拷贝出的新句柄,并且在当前进程中可以使用该句柄

首先举个例子解释一下这个用法

A进程正在运行,B进程有权限读写他并且已经打开了A进程,C进程拷贝B进程中打开A进程后的句柄来读写A进程内存

B进程代码如下:

#include <stdio.h>
#include <Windows.h>

int main()
{
	HANDLE  srchandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 3656);
	printf("handle = %d\n", (int)srchandle); //以十进制打印出句柄
	DWORD  num;
	ReadProcessMemory(srchandle, (LPCVOID)0xE805D8, &num, 4, NULL);
	printf("%d", num);  //打印出读出的内容

	system("pause");
	return 0;
}

运行结果:

由图可知,B进程读A进程内容为100,句柄十进制为240

此时我们运行C进程,代码如下

#include <Windows.h>
#include <stdio.h>

int main()
{
	HANDLE  copyhandle = (HANDLE)240; // 目标进程中将被拷贝过来的句柄
	HANDLE targethandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 14712); //目标进程句柄
	HANDLE newhandle; //存放拷贝出来的新句柄
	DuplicateHandle(targethandle, copyhandle, GetCurrentProcess(), &newhandle, 0, FALSE, DUPLICATE_SAME_ACCESS); //拷贝
	DWORD  num;
	ReadProcessMemory(newhandle, (LPCVOID)0xE805D8, &num, 4, NULL); //利用新句柄读写内存并打印
	printf("%d\n", num);
	system("pause");
	return 0;
}

首先我们知道了要拷贝的句柄十进制为240,并且获得了目标进程句柄,利用DuplicateHandle拷贝到新的句柄newhandle,并利用该句柄成功读出了A进程0xE805D8地址内容为100,并与B进程读出的结果一致。(注意此过程并没有打开A进程

至此,成功完成了跨进程拷贝句柄并读内存

可能大家会有以下几个疑问:

1.已经知道了B打开A进程的句柄为十进制240,为什么不HANDLE handle = (HANDLE)240然后直接利用handle?

2.在过保护方面有什么可用之处?

3.在对抗游戏保护时如何得到这个打开的句柄?

4.如何取得目标进程句柄,即加载驱动保护游戏的进程的句柄?

 

我的解答是:

1.如果直接利用handle = (HANDLE)240这个句柄读会出现下图的情况

因为B进程得到的句柄并不能直接给C进程用,必须要利用DuplicateHandle()拷贝过来才行

 

2.为什么在过保护方面有用,因为很多游戏保护都是像下图这样的

虽然游戏进程无法打开,但是加载驱动保护游戏的进程却可以被打开,比如图中的TslGame_BE.exe,而通常保护游戏的进程都是可以打开游戏的进程的,或者说在加载驱动之前就已经打开了游戏的进程,因此可以利用这个句柄

3.如何打开保护游戏的进程的句柄比如TslGame_BE.exe的句柄,很明显在第二点已经说过了,该进程并没有被保护,CE可以看见图标就意味着可以被打开

 

4.如何取得TslGame_BE.exe中打开游戏进程的句柄?很明显我们可以注入DLL下钩子,钩住TslGame_BE.exe中的OpenProcess() API,并传出句柄。向TslGame_BE.exe注入DLL比向游戏进程注入简单,游戏进程在加载前驱动已经加载好了因此除了ring0层之外很难注入,但是TslGame_BE.exe却可以被注入,只要摘掉该进程对LoadLibrary的钩子便可,然后利用DLL隐藏技术隐藏自身,HOOK API并传回句柄,再卸载掉注入的DLL。

 

注:以上只是博主今天突发奇想而出的一种思路,可能有纰漏之处需要改正,理论上可行但具体对抗保护方面未经过实践,只是指出了一条思路,因为在网上也并有看到有类似的方法,如果可行也希望各大游戏安全部门引以为戒。

 

评论 4 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

CalvinXu17

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值