有时候挖掘白名单的时候会发现在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;}
可以看到正常执行了导出函数中的代码。
记得关注转发好兄弟