MiniDumpWriteDump 学习杂记

发布于 2024-09-02 19:35:05 字数 4123 浏览 18 评论 0

为什么叫杂记主要是我词穷了好久没写博客了随便水水,因为一些原因需要临时写一个绕过 AV dump lsass,直接用系统调用这种方法就不用说了,这种方法对于 R3 HOOK 还行。对于采用降权操作的 AV 来说这招没用

我们需要用到的东西有某哈游驱动,ReactOS,VS,思路是我们通过直接重写整个 MiniDumpWriteDump 函数(包括 MiniDumpWriteDump 内部调用的函数),替换整个 dump 过程中所有使用 ReadProcessMemory 函数的地方,将 ReadProcessMemory 函数换成我们自己用驱动实现的进程内存读取

为了方便可以使用这个项目中的部分代码 https://github.com/w1u0u1/minidump

这个项目已经照着 ReactOS 重写了 MiniDumpWriteDump 函数的部分代码并且他部分函数如 ReadProcessMemory,OpenProcess 等等都使用了系统调用的方式重写,不过这对我们来说没什么用可以忽略直接改回正常的就行,因为他 MiniDumpWriteDump 函数重写的不完全,所以我们要做的就是补全剩下所有的函数并且将所有调用 ReadProcessMemory 函数的地方替换成我们自己用驱动实现的 ReadProcessMemory

具体举个例子

比如原作者重写了 fetch_modules_info 函数但是 fetch_modules_info 函数里调用的 EnumerateLoadedModulesW64 函数他就没有重写而我们就得重写因为这个函数里有别的函数调用了 ReadProcessMemory

image.png

BOOL WINAPI my_EnumerateLoadedModulesW64(HANDLE hProcess,PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback,PVOID UserContext)
{
HMODULE* hMods;
WCHAR baseW[256], modW[256];
DWORD i, sz;
MODULEINFO mi;

hMods = (HMODULE*)HeapAlloc(GetProcessHeap(), 0, 256 * sizeof(hMods[0]));
if (!hMods) return FALSE;

if (!my_EnumProcessModules(hProcess, hMods, 256 * sizeof(hMods[0]), &sz))
{
/* hProcess should also be a valid process handle !! */
printf("If this happens, bump the number in mod\n");
HeapFree(GetProcessHeap(), 0, hMods);
return FALSE;
}
sz /= sizeof(HMODULE);
for (i = 0; i < sz; i++)
{
if (!myGetModuleInformation(hProcess, hMods[i], &mi, sizeof(mi)) ||
!myGetModuleBaseNameW(hProcess, hMods[i], baseW, ARRAY_SIZE(baseW)))
continue;
module_fill_module(baseW, modW, ARRAY_SIZE(modW));
EnumLoadedModulesCallback(modW, (DWORD_PTR)mi.lpBaseOfDll, mi.SizeOfImage,
UserContext);
}
HeapFree(GetProcessHeap(), 0, hMods);

return sz != 0 && i == sz;
}

需要注意的因为 EnumerateLoadedModulesW64 函数内部调用了 EnumProcessModules,GetModuleInformation,GetModuleBaseNameW 这三个函数而这三个函数内部调用了 ReadProcessMemory 所以这三个函数也要重写

替换如图所示

image.png

稍微要提一下的是这个驱动读内存没有对是否成功进行返回所以我们需要自己通过验证缓冲区值是否改变来以此当作一个判断标准

image.png

这里我就拿卡巴做一下示范

image.png

更多的细节都在源码和驱动中自己去看吧我也实在是懒的继续细写了

https://github.com/WBGlIl/mhydump bin 文件在 zip 里因为是临时写的比较匆忙代码有些乱

最后呢说几句题外话,dump lsass 有必要 dump 全部内存和加载的模块吗,能不能将需要的部分 dump 下来这样可以大大减少 dump 文件的体积,这个问题就和 mimikatz 加载 dump 文件搜索 hash 密码相关了。我们重写 MiniDumpWriteDump 函数的目的是替换 ReadVirtualMemory 函数那么通过 HOOK ReadVirtualMemory 也能实现这样就省去了重写的步骤不必那么麻烦,什么时候重写 MiniDumpWriteDump 比较合适?什么时候 HOOK MiniDumpWriteDump 比较合适?dump 文件头魔数是否有必要写入磁盘避免被部分 AV 识别到的

顺便补充一点我这里用的是最简单粗暴的方法

相关参考链接

https://reactos.org/

https://github.com/w1u0u1/minidump

https://www.unknowncheats.me/forum/anti-cheat-bypass/419457-mhyprot2-read-process-kernel-memory-valid-signature-driver.html

https://rayanfam.com/topics/reversing-windows-internals-part1/

1613669921178.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

遇到

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

謌踐踏愛綪

文章 0 评论 0

开始看清了

文章 0 评论 0

高速公鹿

文章 0 评论 0

alipaysp_PLnULTzf66

文章 0 评论 0

热情消退

文章 0 评论 0

白色月光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文