关于DLL劫持死锁的问题
2024-1-18 00:4:12 Author: 白帽子(查看原文) 阅读量:21 收藏

有时候挖掘白名单的时候会发现在DllMain中编写的loader或shellcode无法执行这个原因和解决方式我们来解决一下:

当DLL被加载到进程中的时候,DllMain函数在同步锁内执行,比如expample.exe应用程序加载多个DLL,例如A.dll,B.dll,C.dll,必须等待A.dll的DllMain函数完成后才能继续加载后续的DLL,也就是B.dll,C.dll。

如果A.dll的dllMain函数涉及到需要同步并且导致延迟的操作,则可能导致进程无法加载剩余的DLL情况,因此可能永远无法初始化,从而导致操作的问题。

因为如果A.dll的DllMain函数中执行的shellcode依赖于B.dll,C.dll加载后,shellcode本身根本就不会执行,考虑到这一点,建议从目标的导出函数中执行有效负载,这样更加可靠。

为了避免DLL死锁的问题,我们应该从导出函数中执行shellcode。

那么我们会想一个DLL中那么多的导出函数我怎么知道我应该写那个导出函数???

比如说如下我不写导出函数的话他会报错如下:

这种问题就是msedge_elf.dll中是缺少导出函数的,也就是说我们identity_helper.exe加载msedge_elf.dll的时候会调用它的导出函数。

那么msedge_elf.dll中的导出函数实在是太多了,我们应该怎么样精确的知道我们应该写那些导出函数呢?

我们从原始的目录中打开identity_helper.exe文件,从x64dbg中打开。

这里说的原始目录指的是identity_helper.exe这个文件原本是在那个目录的。

然后进去x64dbg:

在符号选择msedge_elf.dll,在这里把所有的导出函数这里按下F2下断点。

然后我们F9过来他会到程序入口这里,如果一次F9不行那么就多次即可。(后面会有一个EntryPoint)

当我们再去按下F9(多次)的时候,他会跳到你缺少的那个导出函数哪里。

因为我们之前在它这个msedge_elf.dll中所有的导出函数都下过断点了。

我们只需要一直F9即可,它会跳到缺少导出函数的哪里。

那么我们现在就明白了它现在缺少这两个导出函数,那么我们直接写这两个导出函数就行了。

// dllmain.cpp : 定义 DLL 应用程序的入口点。#include "pch.h"extern "C" __declspec(dllexport) int GetInstallDetailsPayload() {    MessageBoxA(NULL,"This Dll is GetInstallDetailsPayload!","success",MB_OK);    return 0;}extern "C" __declspec(dllexport) int SignalInitializeCrashReporting() {    MessageBoxA(NULL,"This Dll is GetInstallDetailsPayload!","success",MB_OK);    return 0;}BOOL APIENTRY DllMain( HMODULE hModule,                       DWORD  ul_reason_for_call,                       LPVOID lpReserved                     ){    switch (ul_reason_for_call)    {    case DLL_PROCESS_ATTACH:    case DLL_THREAD_ATTACH:    case DLL_THREAD_DETACH:    case DLL_PROCESS_DETACH:        break;    }    return TRUE;}

可以看到正常执行了导出函数中的代码。

记得关注转发好兄弟


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650247313&idx=1&sn=b3b57d8fcd6f9488beb17d9bce6d53f0&chksm=832e4f6418c2ff3518ff12b8926885aa4291fb09c25025ad823bb47400a47b1a19a9118ba982&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh