参考
介绍
dll文件 就是动态链接库文件,里面有很多函数。exe 如果需要使用这些函数就需要去加载dll文件。dll劫持就是把这个dll文件给替换掉,替换成我们的恶意dll文件。exe在加载恶意dll后就会运行恶意代码。
所以我们需要满足几个条件
- dll名称要正确
- dll与exe在同一个文件夹内
(这个条件不是绝对的,exe在加载dll文件时有加载目录顺序) - dll的导出表要正确
exe文件有一个导入表,导入表中包含了需要加载哪些dll的哪些函数 dll文件有一个导出表,导出表中显示了它能提供哪些函数 只有导入表和导出表相对应的时候,这个dll文件才能被正确加载
怎么才能让dll文件的导出表是正确的呢
就需要去查看exe的导入表
工具参考路径
这样就能查看使用了哪些dll文件的哪些函数,但是如下图所示,dll函数中存在问号,如果dll中有这种函数,就不使用这个dll。

image.png
正常的使用的dll文件如下图所示,会是正常的函数名

image.png
创建dll
创建DLL文件,启动Visual Studio并创建一个新项目。在给出的项目模板中,选择 Dynamic-Link Library (DLL) 选项

image.png
接下来,选择保存项目文件的位置。 保存项目后,应该会出现 dllmain.cpp 以及默认的 DLL 代码。

image.png
在这里我们只关注函数名称,至于它的返回值是什么类型和函数体是什么样的,我们不关心

image.png
然后这里的话相当于写C语言的Main函数
当dll文件刚被加载的时候,会首先调用这里的代码

image.png
为什么要退出程序呢?因为我们这个dll是一个错误的dll,exe加载了这个错误的dll后可能会崩溃或卡住,这样的话就会有一些嫌疑特征。我们就主动退出程序。
然后还有一些条件,因为我们做dll劫持是通过白+黑进行免杀,所以我们的白文件要足够的白。
- 选择要替换的dll,他最好不是一个微软的dll。如果你的dll名称和微软的dll文件名称相同的话就可能被微软杀掉。
- 还有就是exe要有真实数字签名,这样文件足够白,但是我们不能自己打一个签名,如果直接打一个假的数字签名的话,那他会被Windows default 杀掉
- EXE的位数要正确
dll Main 函数最好设置为进程迁移的操作,就是把后门迁移到其他白进程,因为这个进程加载了错误的dll文件会崩溃,那我们的后门就关闭了,那我们可以通过远程进程注入的方式把进程迁移到其他白程序,如果你要使用远程进程注入的话,那你只能使用一个64位的程序注入64位的程序
所以dll程序怎么进行手工挖掘呢
可以下载第三方exe,把它安装在虚拟机当中,然后找到它的安装目录,安装目录里通常会有很多exe文件,可以挨个看exe符不符合这些条件。可以看exe文件的导入表,有没有使用非微软的dll,并且函数都是正常的函数,然后就可以对这个exe进行dll劫持。然后就可以编写一个dll文件,把导出文件定义好,就可以生成一个dll文件。
也可以通过 Process Monitor来进行挖掘
查看应用程序位数和数字签名

image.png
然后Publisher 字段能看到应用程序有没有数字签名
Publisher: n/a 代表没有数字签名

image.png
DLL 劫持 自动化挖掘
https://github.com/HexNy0a/SkyShadow

image.png

image.png
然后生成替换放到同一目录即可