相信大家都有这么一个经历,我们使用电脑,在某些来历不明的网站上下载一些程序,然后打开这些程序的时候,可能会出现以下的情况。
嗯没错,你电脑中的杀毒软件会给你发出温馨的提示,提醒你该程序可能含有木马病毒,这些病毒可能损害你的计算机。那么这些木马病毒的本质是什么呢?他们是怎么攻击我们的电脑的呢?我们今天就来探讨下这个问题!
首先我们先来认识一下动态链接库的概念,DLL是Dynamic Link Library的缩写,意为动态链接库。在windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。
Windows系统就是由许多的动态链接库(DLL文件)构成的。它们是Windows系统最基本的应用程序。
下面就是我们的Windows操作系统的一些动态链接库。
简单来说,动态链接库里面其实就是一个一个的函数,Windows也是一个应用程序,它被分割成了许许多多的动态链接库。
比较大的应用程序都由很多模块(动态链接库)组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。下图为微信应用程序中所调用的动态链接库。
Windows 系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的 DLL 文件,并可对它们单独编译和测试。在运行时,只有当 EXE 程序确实要调用这些 DLL 模块的情况下,系统才会将它们装载到内存空间中。不用的时候,系统将它们给从内存中卸载掉。
这种方式不仅减少了 EXE 文件的大小和对内存空间的需求,而且使这些 DLL 模块可以同时被多个应用程序使用。Windows 自己就将一些主要的系统功能以 DLL 模块的形式实现。
因此,读到这里,我相信大家应该明白了,为什么杀毒软件会给你提示某个程序含有木马病毒,就是因为该病毒程序中可能会给你原本正常运行的其他程序注入DLL,让你的正常程序调用病毒程序携带的DLL文件,以导致你的正常程序“中毒”。
DLL的编写与语言没有任何关系,所以我们用VS2017创建一个动态链接库,命名为MyDll,他就是我们要写的病毒DLL文件。
然后在dllmain.cpp中写我们的代码,我们的代码很简单,直接写上一个alert函数,功能是:当我们的病毒DLL文件被应用程序加载时,直接弹出一个弹窗。
OK,最后编译生成我们的DLL文件。
编写完DLL文件之后,我们还要写一个exe程序,该exe程序就是病毒程序的主体,它完成核心的功能:将我们的病毒DLL写进某个正常运行的应用程序,让该正常的应用程序调用我们的DLL代码,那么这就是一件很危险的事情了,让我们的正常运行的程序调用未知的DLL代码,后果可想而知。这种技术就是DLL远线程注入技术。
我们的病毒程序会强制给目标进程创建一个线程,线程的任务是:将我们的病毒木马DLL加载进目标进程,让目标进程执行DLL代码。
那么,代码如何写呢?
我们还是使用VS2017编写,创建一个控制台程序,命名为dll_inject。
然后按照刚才提到的思路编写代码,这没什么难度,查看MSDN,调用Win32API即可实现。
主函数中调用我们的dll注入攻击函数dll_inject,我们用来攻击一下PC版的微信,查看用户管理器,得知微信的PID为17544,以第一个参数传进去,第二个参数即我们要注入的DLL文件的路径。
编译之后,得到我们的dll注入主程序。
双击运行,看一下攻击的结果:
可以看到,微信进程已经被成功注入了我们的病毒DLL文件了,也弹窗了,弹窗就证明我们的病毒DLL被微信加载成功。
所以,总结一下,总体思路是:
1)编写一个病毒DLL,完成我们想要干的坏事。
2)编写一个应用程序exe,强制让远程的进程创建一个线程,执行加载DLL文件的操作。
3)远程进程加载成功我们写的病毒DLL之后,就表示我们的DLL已经成功注入远程进程中了,也可以说是感染到了远程进程了。
DLL的发明给我们带来了诸多便利和优雅,但是也可能会给我们带来灾难性的后果,我们的世界就是黑和白的斗争,然后在斗争中不断地发展。