外挂界的大哥?号称无法被检测的DMA物理读写内存设备到底是个啥
作者:Melody 日期:2023-04-01 08:14:15 浏览:50 分类:技术教程
早在大概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++)
{
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;
}
}
不得不说这个库的功能的确齐全
你只需要初始化 然后去获取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[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
这样等我去面试的时候 人家只要点开了我的个人页面 看到如此多的关注 谁会不迷糊 至少面子是有了 你说对吧(狗头)
猜你还喜欢
- 11-16 2024剪映电脑版进阶拔高案例实操
- 11-16 15天学会抖音图文带货保姆级教程,千粉变现5位数+
- 05-12 揭秘私域大佬的截流方法!真不封号!
- 05-11 7B2 PRO主题5.2.0版本hosts方式绕过方法
- 05-04 生财有术最新资料 2023-2024
- 02-22 麻将高手快速提升胜率教学
- 02-22 手机摄影技巧:从0到1用手机拍出酷炫短视频Vlog
- 02-21 支付宝无人直播项目,日入一千以上,保姆级教程,适合小白
- 02-21 抖音小说无人3.0玩法 隔壁收费1280 轻松日入500+
- 02-21 2024最新今日头条利用ai生成原创爆款文章,不违规,新手小白直接上手操作
- 02-20 12000套AI绘画关键词+教程
- 02-20 C++游戏编程实例精讲--3D射击游戏作弊
- 最近发表