马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
早在大概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设备进行读取内容总之这个库的功能十分强大
外挂界的大哥?号称无法被检测的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++)
- {
复制代码- 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);
复制代码- 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[i], ppModuleMapEntry->vaBase, (PBYTE)&temp, 4);
- std::cout << "temp:" << temp << std::endl;
- temp = 0;
- VMMDLL_MemWrite(handle, pPIDs[i], ppModuleMapEntry->vaBase, (PBYTE)&temp, 4);
- VMMDLL_MemRead(handle, pPIDs[i], ppModuleMapEntry->vaBase, (PBYTE)&temp, 4);
- std::cout << "temp:" << temp << std::endl;
- }
- }
- else
- {
- std::cout << std::endl;
- }
复制代码- 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;
复制代码 拿到MZ 完全没问题
至此关于DMA的体验就结束了 因为我那台华南X79的主板兼容性很差 所以我也没有继续深入的体验了
栈回潮:如果你喜欢我的帖子可以帮忙点个关注 https://github.com/DragonQuestHero
这样等我去面试的时候 人家只要点开了我的个人页面 看到如此多的关注 谁会不迷糊 至少面子是有了 你说对吧(狗头)
|
温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
6、论坛仅限于交流探讨与转载分享,严禁在此发布违规违法帖子,否则后果自负!网站内容如有侵犯了您的权益,请及时联系我们予以删除!
|