外挂界的大哥?号称无法被检测的DMA物理读写内存设备到底是个啥
本帖最后由 最后的戴托纳 于 2023-3-31 04:24 编辑早在大概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;
VMMDLL_PidList(handle, pPIDs, &pcPIDs);
for (int i = 0; i < pcPIDs; i++)
{
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, &ProcessInformation, &pcbProcessInformation);
std::cout << pPIDs << "---" << ProcessInformation.szName;
VMMDLL_MAP_MODULEENTRY* ppModuleMapEntry = nullptr;
VMMDLL_Map_GetModuleFromNameU(handle, pPIDs, ProcessInformation.szName, &ppModuleMapEntry,VMMDLL_MODULE_FLAG_NORMAL);
if (ppModuleMapEntry)
{
std::cout << "---" << ppModuleMapEntry->uszFullName << std::endl;
if (ProcessInformation.szName == std::string("dwm.exe"))
{
std::cout << "IMAGE:"<<std::hex << ppModuleMapEntry->vaBase << std::endl;
ULONG temp = 0;
VMMDLL_MemRead(handle, pPIDs, ppModuleMapEntry->vaBase, (PBYTE)&temp, 4);
std::cout << "temp:" << temp << std::endl;
temp = 0;
VMMDLL_MemWrite(handle, pPIDs, ppModuleMapEntry->vaBase, (PBYTE)&temp, 4);
VMMDLL_MemRead(handle, pPIDs, ppModuleMapEntry->vaBase, (PBYTE)&temp, 4);
std::cout << "temp:" << temp << std::endl;
}
}
else
{
std::cout << std::endl;
}
}
不得不说这个库的功能的确齐全
你只需要初始化 然后去获取PID列表即可进程名 包括进程完整名都可以直接读取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;
CHAR szNameLong;
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;
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;
BOOLfWoW64;
union { LPSTRuszText; LPWSTR wszText; }; // U/W dependant
DWORD _Reserved3;
DWORD _Reserved4;
union { LPSTRuszFullName; LPWSTR wszFullName; }; // U/W dependant
VMMDLL_MODULE_TP tp;
DWORD cbFileSizeRaw;
DWORD cSection;
DWORD cEAT;
DWORD cIAT;
DWORD _Reserved2;
QWORD _Reserved1;
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;拿到MZ 完全没问题
至此关于DMA的体验就结束了 因为我那台华南X79的主板兼容性很差 所以我也没有继续深入的体验了
栈回潮:如果你喜欢我的帖子可以帮忙点个关注 https://github.com/DragonQuestHero
这样等我去面试的时候 人家只要点开了我的个人页面 看到如此多的关注 谁会不迷糊 至少面子是有了 你说对吧(狗头)
本帖最后由 smile1110 于 2023-4-1 07:41 编辑
冥界3大法王 发表于 2023-3-31 09:36
@smile1110不来做最终点评?
咱们不说那些常规的apc,remote等等,就说尖端的,csgo最早大概七八年前是usb驱动,后来是伪装成随机硬盘串口,就类似本文这种pci设备,再后来是第三方启动,比如咱们开发的注入到网易云音乐中,再后来是win10卡巴漏洞,注入到卡巴斯基杀毒软件中,利用内核保护,再后来是内核漏洞,就是openprocess和来宾用户有关等,再后来是cpu缓存漏洞,苏紫姐姐当年根据我要求开发了好多个注入器,直到今天还有一个苏紫9号检测不到,这还是19年左右的技术,20年之后开始模拟键鼠的ai训练,21年后出现了云注入,23年出现了全新的cl作弊指令漏洞,今天还未修复,期间各种afk,obs插件脚本就不说了,各种技术全用上了。这月csgo2马上推出,这些技术都淘汰了,老哥,你不跟我们一起玩,你不知道19年之后都干了什么,问@眷恋 哥们就知道了,在csgo大陀螺顶级参数咱们有五万套,国内前10的参,到专门在陀螺服欺负陀螺,我天天和谐各种大陀螺模块出来,俄国和英国的这些大陀螺开发者都是我朋友,国内最著名的大陀螺,咱们就是pupu,sasa孤儿组,世界前15的喵喵老师,大佬asd天天一起玩,西装暴徒和蝴蝶这两套著名顶参就是我开发的,还开发出了属于咱们自己的小陀螺。什么叫横着走,老哥你都无法想象咱们在csgo外挂方面多强,秒天秒地秒空气。飞扬跋扈,从禽纵酒,我都想不太起来了太多光景了,哈哈哈。nb就完了。
@最后的戴托纳 少吹nb,标题大言不惭,技术也不够格,我不做大哥很多年,江湖却永远流传着大哥的传说 netspirit 发表于 2023-3-31 04:45
那这玩意是不是还可以在主机平台实现外挂?
拆开里面不一定有PCIE系统 而且有的机器架构不同 不是IA32 看不懂,还是支持一下 看不太懂有点 zadmg 发表于 2023-4-1 20:45
pupu在20年的时候封了我3万库存,当时我打着5E,突然出现了大陀螺(当时ta定制挂没这功能),紧接着三天 ...
能咨询一下关于DMA的问题,我也想弄没有人带 膜拜大佬下。 那这玩意是不是还可以在主机平台实现外挂? 开挂体验 yyds 学习了 好像很强大 但是一行代码都看不懂 这是今天早上碰到的第二个好帖,感谢提供,收藏备用。 这个比较高深啊 大佬厉害了