早在大概20年左右 我就注意到了github dma的项目
也就是这个 https://github.com/slack2450/csgo-dma-overlay
该项目使用了DMA来绕过反作弊
实际原理比这个更加复杂一些 不过这篇帖子只讨论关于DMA部分的内容
其实DMA全称Direct Memory Access,即直接存储器访问
也就是利用PCIE设备来直接读写物理内存
这种方式绕过了操作系统 做到了可以在目标机上没有任何代码运行的情况下做到读写内存的操作
这个项目是DMA的发源地 https://github.com/ufrisk/pcileech
具体关于DMA物理读写设备的原理都可以参考这个项目
包括上面那个CSGO的读写绘制也是依赖了pcileech
大概年前 通过一位朋友拿到了一块DMA读写设备 拿回来了以后一直压箱底 没有去玩 不得不说万能的朋友圈真是啥都有
今天有空于是拿出来试了试
首先是下载DMA依赖 或者我喜欢称之为基础库
因为DMA只能读物理内存
但当前的操作系统都有虚拟内存到物理内存的转换
一个物理内存可以对应多个虚拟内存等等知识不再具体聊下去了
所以pcileech这个装备库就帮你完成了绝大多数的工作
你可以直接输入虚拟内存 然后他会自动帮你转换再通过DMA设备进行读取内容
总之这个库的功能十分强大
import memprocfs
vmm = memprocfs.Vmm(['-device', 'existingremote'])
for process in vmm.process_list():
for entry in process.maps.pte():
if '-rwx' in entry['flags']:
print(str(process.pid) + ': ' + process.name + ': ' + str(entry))
这部分是自带的python代码 当然我跑的是win32环境
你可以看到库里还能直接帮你枚举进程列表
实际上他原理大概类似特征定位
只要定位到了ntos的地址 剩下的都好说
不过说起来简单想实现这个库还是挺难的
因为我的测试机是个破旧的华南X79
在经历了一大堆麻烦事以后才终于跑通了这份代码
并且我这台电脑上装的还是python27
于是乎我直接导入头文件 开个测试工程 开始试一下到底好不好用
char* temp_str[] = { "","-device","FPGA" };
VMM_HANDLE handle = VMMDLL_Initialize(3, temp_str);
SIZE_T pcPIDs;
VMMDLL_PidList(handle, nullptr, &pcPIDs);
DWORD* pPIDs = (DWORD*)new char[pcPIDs * 4];
VMMDLL_PidList(handle, pPIDs, &pcPIDs);
for (int i = 0; i < pcPIDs; i++)
{
}
不得不说这个库的功能的确齐全
你只需要初始化 然后去获取PID列表即可
拿到PID以后 下一步是进程名
VMMDLL_PROCESS_INFORMATION ProcessInformation = { 0 };
ProcessInformation.magic = VMMDLL_PROCESS_INFORMATION_MAGIC;
ProcessInformation.wVersion = VMMDLL_PROCESS_INFORMATION_VERSION;
SIZE_T pcbProcessInformation = sizeof(VMMDLL_PROCESS_INFORMATION);
VMMDLL_ProcessGetInformation(handle, pPIDs[i], &ProcessInformation, &pcbProcessInformation);
std::cout << pPIDs[i] << "---" << ProcessInformation.szName;
VMMDLL_MAP_MODULEENTRY* ppModuleMapEntry = nullptr;
VMMDLL_Map_GetModuleFromNameU(handle, pPIDs[i], ProcessInformation.szName, &ppModuleMapEntry,VMMDLL_MODULE_FLAG_NORMAL);
std::cout << "---" << ppModuleMapEntry->uszFullName << std::endl;
进程名 包括进程完整名都可以直接读取
u1s1 这东西方便的地方在于 即便是进程的EPROCESS和PEB等他都给你写出来了 直接看这个结构体
typedef struct tdVMMDLL_PROCESS_INFORMATION {
ULONG64 magic;
WORD wVersion;
WORD wSize;
VMMDLL_MEMORYMODEL_TP tpMemoryModel; // as given by VMMDLL_MEMORYMODEL_* enum
VMMDLL_SYSTEM_TP tpSystem; // as given by VMMDLL_SYSTEM_* enum
BOOL fUserOnly; // only user mode pages listed
DWORD dwPID;
DWORD dwPPID;
DWORD dwState;
CHAR szName[16];
CHAR szNameLong[64];
ULONG64 paDTB;
ULONG64 paDTB_UserOpt; // may not exist
struct {
ULONG64 vaEPROCESS;
ULONG64 vaPEB;
ULONG64 _Reserved1;
BOOL fWow64;
DWORD vaPEB32; // WoW64 only
DWORD dwSessionId;
ULONG64 qwLUID;
CHAR szSID[MAX_PATH];
VMMDLL_PROCESS_INTEGRITY_LEVEL IntegrityLevel;
} win;
} VMMDLL_PROCESS_INFORMATION, *PVMMDLL_PROCESS_INFORMATION;
同时VMMDLL_Map_GetModuleFromName这个函数还能获取模块地址以及模块大小等等信息
typedef struct tdVMMDLL_MAP_MODULEENTRY {
QWORD vaBase;
QWORD vaEntry;
DWORD cbImageSize;
BOOL fWoW64;
union { LPSTR uszText; LPWSTR wszText; }; // U/W dependant
DWORD _Reserved3;
DWORD _Reserved4;
union { LPSTR uszFullName; LPWSTR wszFullName; }; // U/W dependant
VMMDLL_MODULE_TP tp;
DWORD cbFileSizeRaw;
DWORD cSection;
DWORD cEAT;
DWORD cIAT;
DWORD _Reserved2;
QWORD _Reserved1[3];
PVMMDLL_MAP_MODULEENTRY_DEBUGINFO pExDebugInfo; // not included by default - use VMMDLL_MODULE_FLAG_DEBUGINFO to include.
PVMMDLL_MAP_MODULEENTRY_VERSIONINFO pExVersionInfo; // not included by default - use VMMDLL_MODULE_FLAG_VERSIONINFO to include.
} VMMDLL_MAP_MODULEENTRY, *PVMMDLL_MAP_MODULEENTRY;
那下一步当然就是读内存了
VMMDLL_MemRead(handle, pPIDs[i], ppModuleMapEntry->vaBase, (PBYTE)&temp, 4);
拿到MZ 完全没问题
至此关于DMA的体验就结束了 因为我那台华南X79的主板兼容性很差 所以我也没有继续深入的体验了
不过在我朋友的朋友的朋友的帮助下 我还拿到了一份特殊的硬件图 不得不说神奇的朋友还是给力 并且是整个硬件设计图全在 光压缩包就老大了

没错 这正是帖子开头 做csgo dma项目的那个硬件图
不过我看不懂这个图
随后我还有机会跟他们交流了一下
他们也是一个团队 成员都来自欧洲
正是有了pcileech这个项目以后才有了这个想法 不过他们除了利用dma设备 还将一些其他硬件融合在了同一块PCIE板上
但PCIE也不是无敌的
早在20 21年 PCIE刚刚问世 那时候了解这个玩意的人也不多
国外有个反作弊是叫瓦兰特还是什么来着具体我忘了 反作弊检测十分严格 似乎是白名单模式
于是就有了利用PCIE宿主机的方式来绕过反作弊 在当时简直就是乱杀 没人了解这是什么 也没人清楚他是怎么工作的 甚至不知道该如何对抗 他在操作系统内没有任何代码运行 并且他只读内存 从来不修改 你根本无法检测到他的存在
但仅仅一年后 对方很快察觉到了PCIE这种作弊方式 并且祭出了脉冲信号的方式检测PCIE设备 进行了一次账号封禁
其实这个名字是我瞎编的 我也不记得叫什么了 原文是英文
随后还有一些其他的手段检测 这里不具体展开
也就是说PCIE并不是无敌的
但就目前来说 基于DMA手段的作弊依旧是大哥大
据我的了解 相当多游戏对这种方式的检测都是一片空白 包括某极其火热的FPS游戏
哪怕这个项目已经出现了3年多 也仅仅有极少数反作弊注意到并且针对DMA进行了加强
OK 帖子最后是关于内核交流群的问题
好多人说搜不到了
其实群并不是随时开放的 去年到现在进群的人数也不超过30 现在总人数也就130 因为原本这个群就是几个朋友加同事一起喷公司领导瞎指挥的小群
要求是必须提供有效的在校证明或者在职证明 如果群里有同公司的还需要一次内部验证
以前没这么严格 但是有人伪造公司混进来过 于是就越来越严格了
有意进群的还是直接发私信吧 发群号其实也没有意义
也有这个群是不需要验证的 可以随便进 729338597
群组织在这里 https://github.com/ClassicalMusicClub
最后忘记补充了 并不是只有内核方向 逆向和渗透我们都欢迎 但手里有裤子的就还是不要申请了吧 不然搞的人心惶惶的
栈回潮:如果你喜欢我的帖子可以帮忙点个关注 https://github.com/DragonQuestHero
这样等我去面试的时候 人家只要点开了我的个人页面 看到如此多的关注 谁TM不迷糊 至少面子是有了 你说对吧(狗头)

[培训]《安卓高级研修班(网课)》月薪三万计划
最后于 2023-3-31 04:25
被章鱼C编辑
,原因: