另类驱动读写办法
利用DuplicateHandle()无驱动的另类读写内存方法,理论上可以过游戏保护读写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()
{
HANDLEsrchandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 3656);
printf("handle = %d\n", (int)srchandle); //以十进制打印出句柄
DWORDnum;
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()
{
HANDLEcopyhandle = (HANDLE)240; // 目标进程中将被拷贝过来的句柄
HANDLE targethandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 14712); //目标进程句柄
HANDLE newhandle; //存放拷贝出来的新句柄
DuplicateHandle(targethandle, copyhandle, GetCurrentProcess(), &newhandle, 0, FALSE, DUPLICATE_SAME_ACCESS); //拷贝
DWORDnum;
ReadProcessMemory(newhandle, (LPCVOID)0xE805D8, &num, 4, NULL); //利用新句柄读写内存并打印
printf("%d\n", num);
system("pause");
return 0;
}虽然游戏进程无法打开,但是加载驱动保护游戏的进程却可以被打开,比如图中的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
建议来个开源例子最实在点 类驱动读写办法 [ 打开句柄=3天大礼包。 从CSDN板砖都不发一下出处 建议来个开源例子最实在点
页:
[1]