关于鹅肠某射击游戏 无驱动读写的方法研究
最近在学习windows 内核 想仿照写一个某F的保护 于是查询了一些资料 发现某F是注册一个 回调函数来保护自己游戏不被附加 于仿照做了一个 效果就是图一所示核心代码
OB_PREOP_CALLBACK_STATUS
ProcessProtect(
PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pOperationInformation
)
{
ULONG pid = (ULONG)(PsGetProcessId((PEPROCESS)pOperationInformation->Object)); //返回回调进程的pid判断 如果是我们要保护的进程 那么进行操作 如果不是=== return
UNREFERENCED_PARAMETER(RegistrationContext);
ULONG PPid = 5652;
KdPrint(("PPID:%d", PPid));
if (pid == PPid && PPid != 0)
{
pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess = 0;
}
return OB_PREOP_SUCCESS;
}
那么怎么能干掉这层保护呢 这里我的思路有两个
1. 思路就是 我们注册同样的 回调函数 给被ob保护的进程 只是我们这次的回调函数里面给我们特定进程满权限 那么他的保护不久被我们废了么
pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess = PROCESS_ALL_ACCESS;
核心代码就这么一句话 效果就是 图二
2.那么我们有没有其他思路呢 当然还是有的 他不是有回调么 我们直接在他的回调函数的入口处写一个 0xc3 问题不就解决了么 于是
VOID DisableObcalls(PVOID Address)
{
KIRQL irql;
CHAR PatchCode[] = "\x33\xC0\xC3";
if (!Address)
return;
if (MmIsAddressValid(Address))
{
irql = WPOFFx64();
memcpy(Address, PatchCode, 3);
WPONx64(irql);
}
}
VOID DownObcallBacks()
{
PLIST_ENTRY pCurrentEntry = NULL;
POB_CALLBACK pObCallback;
ULONG64 ObProcessCallBackListHead = *(PULONG64)PsProcessType + 0xC8;
ULONG64 ObThreadCallBacListkHead = *(PULONG64)PsProcessType + 0xC8;
KdPrint(("ObThreadCallBackListHead:[%p]\n", ObThreadCallBacListkHead));
pCurrentEntry = ((PLIST_ENTRY)ObThreadCallBacListkHead)->Flink;
do {
pObCallback = (POB_CALLBACK)pCurrentEntry;
if (pObCallback->ObHandle != 0)
{
DisableObcalls((PVOID)pObCallback->PostCall);
DisableObcalls((PVOID)pObCallback->PreCall);
}
pCurrentEntry = pCurrentEntry->Flink;
} while (pCurrentEntry != (PLIST_ENTRY)ObThreadCallBacListkHead);
KdPrint(("ObProcessCallBackListHead:[%p]\n", ObProcessCallBackListHead));
pCurrentEntry = ((PLIST_ENTRY)ObProcessCallBackListHead)->Flink;
do {
pObCallback = (POB_CALLBACK)pCurrentEntry;
if (pObCallback->ObHandle != 0)
{
DisableObcalls((PVOID)pObCallback->PostCall);
DisableObcalls((PVOID)pObCallback->PreCall);
}
pCurrentEntry = pCurrentEntry->Flink;
} while (pCurrentEntry != (PLIST_ENTRY)ObProcessCallBackListHead);
}
核心代码如上 这样也能达到我们想要的标准 但是你以为这样就完了么 你会发现你打开某F进程确实可以了 但是几秒之后
内存又读不到了 这是怎么回事呢 涉及到了句柄表 ,某F会遍历自己的句柄表 发现不是自己打开进程 那么同样会给权限降低
这里怎么解决 经过几天研究已经差不多搞了出来 但是还待优化 有时间 再发一贴讲解
同时欢迎各位大佬加群讨论 891652790
mubing666 发表于 2019-11-29 18:09
无 驱动读写 哥哥 你不够智能啊
你贴的代码都是内核代码,先不说这代码是不是你写的,你搞清楚什么是无驱读写没?{:tongue:} 过路的人 发表于 2019-11-29 17:42
笑死,你这代码是无驱动?
无 驱动读写 哥哥 你不够智能啊 所说驱动加载工具就是你家的驱动?真好 你把驱动代码拿出来讲无驱动 笑死,你这代码是无驱动?
页:
[1]