VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2283|回复: 1

[交流] DllMain与rundll32详解

[复制链接]
001
85_avatar_middle
最佳答案
0 
在线会员 发表于 2019-10-3 12:59:10 | 显示全部楼层 |阅读模式
0x00 DllMain

对于动态链接库,DllMain是一个可选的入口函数。

程序调用DLL中的导出函数的流程:

  • 程序调用Windows API LoadLibrary
  • 操作系统寻找LoadLibrary所加载的DLL文件
  • 操作系统将DLL文件加载至目标程序进程的内存空间
  • 程序自动调用DllMain函数
  • 程序调用DLL中导出函数


如果DLL被多次LoadLibrary,那么DllMain只执行一次,引用基数+1。


DllMain的原型

  1. BOOL WINAPI DllMain(
  2.   _In_ HINSTANCE hinstDLL, // 指向自身的句柄
  3.   _In_ DWORD fdwReason, // 调用原因
  4.   _In_ LPVOID lpvReserved // 隐式加载和显式加载
  5. );
复制代码



0x01 DllMain调用原因

其中fdwReason用来表示Dll被调用的状态,一共分为四种:

  • DLL_PROCESS_ATTACH 被进程加载
  • DLL_PROCESS_DETACH 被进程释放
  • DLL_THREAD_ATTACH 被线程加载
  • DLL_THREAD_DETACH 被线程释放


在DllMain中通常为了捕获DLL被调用的方式来进行某些动作:

  1. BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
  2. {
  3.  switch (ul_reason_for_call)
  4.  {
  5.   case DLL_PROCESS_ATTACH:
  6.    printf("\nprocess attach of dll");
  7.    break;
  8.   case DLL_THREAD_ATTACH:
  9.    printf("\nthread attach of dll");
  10.    break;
  11.   case DLL_THREAD_DETACH:
  12.    printf("\nthread detach of dll");
  13.    break;
  14.   case DLL_PROCESS_DETACH:
  15.    printf("\nprocess detach of dll");
  16.    break;
  17.  }
  18.  return TRUE;
  19. }
复制代码


0x02 那些用于测试DLL劫持的DllMain POC

https://cxsecurity.com/issue/WLB-2018090232
https://cxsecurity.com/issue/WLB-2015010114

在测试很多DLL劫持的漏洞时,都喜欢用DllMain,是因为DllMain被进程加载或者释放都会自动调用运行。

  1. #include <windows.h>

  2. BOOL WINAPI DllMain (
  3.             HANDLE    hinstDLL,
  4.             DWORD     fdwReason,
  5.             LPVOID    lpvReserved)
  6. {
  7.     switch (fdwReason)
  8.   {
  9.   case DLL_PROCESS_ATTACH:
  10.     owned();
  11.   case DLL_THREAD_ATTACH:
  12.         case DLL_THREAD_DETACH:
  13.         case DLL_PROCESS_DETACH:
  14.   break;
  15.   }
  16.   return TRUE;
  17. }

  18. int owned() {
  19.   MessageBox(0, "iExplorer DLL Hijacked\Hadji Samir", "POC", MB_OK);
  20. }

  21. #include <windows.h>
  22. #define DLLIMPORT __declspec (dllexport)

  23. DLLIMPORT void HrCreateConverter() { evil(); }

  24. int evil()
  25. {
  26.   WinExec("calc", 0);
  27.   exit(0);
  28.   return 0;
  29. }
复制代码


0x03 __declspec

__declspec是Microsoft VC中专用的关键字,它配合着一些属性可以对标准C/C++进行扩充。__declspec关键字应该出现在声明的前面。

__declspec(dllexport)用于Windows中的动态库中,声明导出函数、类、对象等供外面调用,省略给出.def文件。即将函数、类等声明为导出函数,供其它程序调用,作为动态库的对外接口函数、类等。

__declspec(dllimport)用于Windows中,从别的动态库中声明导入函数、类、对象等供本动态库或exe文件使用。当你需要使用DLL中的函数时,往往不需要显示地导入函数,编译器可自动完成。

0x04 关于rundll32

Rundll32.exe是什么?顾名思意,”执行32位的DLL文件”。它的作用是执行DLL文件中的内部函数,这样在进程当中,只会有Rundll32.exe,而不会有DLL后门的进程,这样,就实现了进程上的隐藏。

– 百度百科

经过如上解释,可以总结为,rundll32能够运行一个32位的dll文件,并且在进程列表中只能看到rundll32.exe,但是遍历rundll32.exe的模块列表可以看到进程加载的dll。

并不是所有的dll都能够被rundll32运行。 为何这么说,因为rundll32只支持特定的函数声明方式,并且该函数必须在dll文件的导出表中。关于导出表的知识可以阅读 - 《Windows PE权威指南》 &#128077;

rundll32.exe支持的函数原型如下:

  1. VOID CALLBACK FunctionName (HWND hwnd,HINSTANCE hinst,LPTSTR lpCmdLine,INT nCmdShow);
复制代码


通过原型可以发现,与Windows平台下的WinMain一模一样,可以理解为rundll32调用的函数就是一段代码的入口函数。

下面来写一个支持rundll32运行的dll:

使用visual studio新建一个dll工程,并声明函数:rundll

  1. #include <Windows.h>


  2. extern "C" __declspec(dllexport) void rundll(HWND hwnd,HINSTANCE hinst,LPTSTR lpCmdLine,INT nCmdShow){

  3.         MessageBox(NULL,TEXT("-Test-"),TEXT("Rundll32"),MB_OK);

  4. }
复制代码


DllMain与rundll32详解

使用rundll32运行dll

DllMain与rundll32详解

通过进程列表查看:

DllMain与rundll32详解

DllMain与rundll32详解

使用wmic process get commandline也可以获得命令行详情:

DllMain与rundll32详解

还有一种方式是获得该进程加载的模块,这是最精确的了;但windows 7不能直接看到,需要借助工具。(win10可以通过任务查看器看到..)

DllMain与rundll32详解

这个dll是没有DllMain也能够正常运行的,并不是所有的dll都有DllMain这个函数

我经过实验后发现,一个dll有没有DllMain完全取决于当前这个dll对于功能的需求,如果对装载方式的状态没有特定的要求,完全可以省去编写DllMain,因为DllMain不是一个导出函数,永远是一个由系统被动调用的函数。

评分

参与人数 2驿站币 +4 热心值 +4 收起 理由
51_avatar_small Syc + 2 + 2 支持原创!
58_avatar_small thzzl + 2 + 2 很给力!

查看全部评分





上一篇:优化cout和换行(新手)
下一篇:有大神有空写软件吗?我要写个跨境电商平台消息提示连接到小程序的 急求!!!!
87_avatar_middle
最佳答案
0 
online_vip 发表于 3 天前 | 显示全部楼层
此帖仅作者可见
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-12-15 21:30

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表