病毒、蠕虫肆虐的时代真的很让人头痛,尤其是这些家伙隐藏在别的进程中胡作非为,真让人受不了。病毒想跑到其他进程中待着,我们也管不了,那是人家病毒的享有最基本的”权利“的嘛!如果我们不愿意的话,可以让病毒马上滚出来。下面我们就自己动手制作一款可以请走病毒的工具吧,名字就叫做UnloadDII (当然,我也不介意你给它起更Cool的名字)。
我们的UnloadDil要用vc制造,其本身并不重要,重要的是享受我们制造的过程。接下来我就简单描述一下制造过程,而后再享受我们的成果吧。DLL是动态链攘库.能提供很多的函数供其他程序调用。DLL本身并不会创建进程.而是依附在其他进程中为其他进程服务。DLL可以让程序自己将它加载到内存中.也可以让程序自己从内存中释放它。程序自己加载DLL时使用LoadLibrary()函数,卸载时可以使用FreeLibrary()函数,函数原型如下。
我们的程序要想卸载其他进程中的DLL.应该使用OpenProcass()函数打开这个进程,但有时要对系统资源进行访问,调试进程必须拥有一定的权限。调整进程的权限在《黑客防线》杂志的相关文章中经常会出现.大家可以翻看以前的杂志回顾一下。提升进程权限的步骤有4步,每个步骤都会在代码中提到,实现的代码比较少.具体如下。
接下来.就是要查找我们要访问的进程,从而得到它的(进程标识PID),要做到这一点就需要遍历所有的进程,从而找到该进程并得到它的PID.具体代码如下。
当然,我们要做的是查找而不仅仅是遍历所有进程.因此在”do..whi l e”中应该有一个判断,代码为"strcmp(pe32.szExeFile.argv[l])“,这样就可以实现我们想要的了。
再接下来,要通过我们得到的PID找到要卸载的DLL文件。方法跟上面一样,也是用”do…wHiIe”遍历并查找,只是使用的APl函数有所不同,看看代码吧。
找到我们要的模块后就到了最后一步了.也就是卸载我们想要卸载的DLL文件.方法是使用FreeLjbrary()函数。但是怎么做才能使FreeLilyary()函卸载掉其他进程的DLL文件呢?可以使用远程线程来调用FreeLibrary()函数。创建远程线程的函数是CreateRemoteThread()函数,大家也许见过这个函数。
并且会使用它。它有一个关键的参数,就是线程函数的地址。如果要创建一个线程,那么这个线程函数是如何定义的呢?看看下面线程函数定义的格式。
感觉到什么了?对!那就是它与FreeLibrary()函数有一个共性,即只需要一个参数。那么.我们只要得到FreeLibrary()函数的地址,把要卸载的DLL文件名当作线程参数来传递就可以了。实现代码如下。
至此,我们要完成的软件就这样被制造出来了。当然,软件本身不重要,重要的是它的制造过程.我们又可以学习到很多知识了。下面我就告诉大家怎样使用这款软件。打开一个记事本,其进程名为notepad.exe.再打开360安全卫士,看看它加载了哪些DLL,我们就以它里面的uxtheme.dll为例来试验一下,如图1所示。卸载的方法是在CMD下使用命令"unloaddll notepad.exe C:\WINDOWS\system32\uxtHeme.dll来实现。注意,这里要区分大小写的.可以通过修改比较处使用的函数来取消大小写。卸载成功后,记事本的进程会出错而关闭,在360安全卫士中也看不到uxtHeme.dll这个DLL文件了.如图2所示。
虽然我们整个程序已经完成了,但还有一个问题,就是执行一次“unloaddll notepad.exe C:\winDOWS\system3 2\uxtHeme.dll“是无法卸载掉我们想要卸裁的DLL文件的.至少需要运行2次,最多要4次。这个问题我觉得可以在执行完CreateRemoteThread()函数后用goto再去遍历所选进程的DLL.直到找不到为止,只是这样的做法有点欠佳了。
通往罗马的大路不止一条。除了上述方法外,还可以有其他的方式,那就是自己写一个线程函数.定义一个结构作为线程函数的参数,把FreeLibrary()函数和要卸载的DLL文件作为参数传递到线程函数中。当然,这就要使用VirtuaIAllocEx()函数和writeProcessMemory()函数了。步骤多了,而且也复杂了,具体的实现就留给大家去试试吧!.不过这种方法我也试了,同样存在第一种方法那样的问题。如果有谁可以想到解决的办法,麻烦与我分享一下,谢谢了,各位黑Fans。