MiniDumpWriteDump 学习杂记
为什么叫杂记主要是我词穷了好久没写博客了随便水水,因为一些原因需要临时写一个绕过 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
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 所以这三个函数也要重写
替换如图所示
稍微要提一下的是这个驱动读内存没有对是否成功进行返回所以我们需要自己通过验证缓冲区值是否改变来以此当作一个判断标准
这里我就拿卡巴做一下示范
更多的细节都在源码和驱动中自己去看吧我也实在是懒的继续细写了
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://github.com/w1u0u1/minidump
https://rayanfam.com/topics/reversing-windows-internals-part1/
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论