危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2304 浏览18595002

DLL简介与远线程DLL注入原理

相信学过C语言,但啥都干不了的黑客初学者们不在少数,无奈步入windows系统编程的学习周期实在是太长,不免有些枯燥,所以我在这里介绍一些远线程dll注入的知识,这并不是什么新技术,但都是编程路上必备知识,希望对危险漫步的粉丝们有所帮助。  

DLL称为动态链接库(Dynamic-Link Library的缩写)。DLL是一个包含可以由多个程序同时使用的代码和数据的库,DLL不是可执行文件(不能直接执行),但里面的函数和数据可以被其他程序调用或使用。动态链接的出现使进程可以调用不属于其可执行代码的函数。函数的可执行代码可以位于_AI DLL中,该DLL文件中包含的函数和数据显然是不属于应用程序代码的,但是却被映射到可执行程序的内存地址空间中。多个应用程序可同时访问内存中单个DLL副本的内容,可以简单的理解为“共享的代码(也可以是数据)段”。

现在我们就来建立一个用于测试的DLL,V C++6-O -文件-新建-工程-选win32Dynamic_link_Library-确定-选一个简单的DLL工程,系统帮助,你建立了一个包含DlIMainA口函数的工程,但此DIU\4ain不是必须的(就是说DLL不必有入口,若有会先从这里执行),添扰lswitch语句块,这样编译后生成的DLL就可以用于gqil试该DLL的加载与解除了(原理不说,一会看效果,你懂的!),程序编译后生成了*.dll文f。我们要做的就是让其它进程(我们要注入的进程)调用LoadLibrary系统函数来载入我们的这个dll。

但是问题随之即来,如何让别的进程调用LoadLibrary函数载入我们的dll文件呢?这里介绍一个API函数,CreateRemoteThread—咆建远程线程,就是命令别的进程新开一个线程。我们需要一个被注入的进程的句柄(所谓句柄就是资源的把柄,类似指针但不是,是个数值),和一个线程函数地址lpStartAddress,还有线程函数的参数。

但有两点需要注意:

1、执行的函数地址:lpStartAddress必须是人家进程中的。

2、参数:必须是人家进程中的资源(比如字符串)。

我们想让别的进程执行的函数是LoadLibrary,LoadLibrary是属于Kerne132.dll中的函数,一般程序都会加载Keme132.d:ll,我们要准备的是得到Kerne132中LoadLibrary函数的地址:得到了我们放到哪里存放呢?声明一个函数指针typedaf DWORD (WINAPI *PTHREAD_START_ROUTINE) (LPVOID);用来存放得到的函数地址。pfnThreadRtn=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(¨Kerne132”),“LoadLibraryA”);现在pfnThreadRtn就是远程进程中Loadlibrary函数的地址了。现在准备远进程的虚拟内存空间,用来存放Loadlibrary函数的参数,用VirtualAllocEx函数。

指定你之前工程下的dll的路径后编译。调试运行后打开一个记事本程序输入要此远程进程的PID号,就将dll注入到notepad进程中了,同样效果有道词典;你可以把你想做的事情放Zdll文件中调用,比如exit (O)用来退出进程之类的,也可以试试把应用程序代码的CreateRemoteThread函数的实参pfnThreadRtn换成O,访存违规就挂掉了(说的是被注入的进程哦)。上面的代码都有很详细的注释,希望小白消化掉。文章到此也该结束了,其实还有大量的工作要做:比如分配了虚拟内存还没有释放,不支持输入函数名,异常也没有捕捉,还有权限问题,有些软件的进程句柄会打不开。本次只介绍了一个框架,用于理解原理,主要是访存这部分,具体的工作还得自己发挥!