您的位置:首页 > 其它

[教程]DLL注入的方法及通讯[2009-8-14]

2015-08-24 11:43 134 查看
这是当年加入“广海小组”时的作品,现在回味当时做了很多原创教程也挺有意思,摘录几个过来,留个纪念吧。

===========================================================================================

准备了好长时间,终于决定写这篇文章(最近工作比较忙),可能类似的教程也很多,我只是把我的研究过程写出来,希望对新手有帮助,文笔不好,大家就合看哈。

这次写教程的内容为DLL注入的二种实现方法,分别是全局钩子法和远程LoadLibrary法(名字自己起的,看个意思就行,不懂的继续往下看)。

编程工具:VC++6.0,运行环境WINDOWS 2003

先看下流程:

1、 全局钩子法

此方法利用SetWindowsHookEx进行钩子的建立,同时系统会自动把钩子需要的DLL文件注入到目标程序,此方法注入过程由系统自动完成,比较方便。缺点就是调用这个DLL的主程序需要保持启动状态,当这个主程序退出,那么所有注入的DLL都会卸载。

2、 远程LoadLibrary法

此方法相对比较复杂一些,注入和卸载的过程都要自己写出代码来实现,主要用到VirtualAllocEx,WriteProcessMemory,LoadLibraryA,CreateRemoteThread,等API实现,优点就是注入后,主程序可以退出,不影响DLL在目标进程的工作。

执行流程:

1) 打开进程,得到进程句柄;

2) 得到DLL的全路径名称和长度

3) 申请内存空间,把DLL全路径写到目标进程空间内(VirtualAllocEx,WriteProcessMemory);

4) 使目标进程调用LoadLibrary,加载DLL(CreateRemoteThread,LoadLibraryA)

5) 释放目标进程中申请的空间 (VirtualFreeEx)

关于通讯问题:

看到论坛里很多人在问DLL如何和外面的主程序通讯的问题,我这里给大家提供二种解决方法:

1、程序界面在DLL中,所有操作都由DLL呼出窗体进行,包括所有的逻辑操作及CALL操作,也就是说,所有的代码都写到DLL种,主程序,只是负责将DLL注入进目标程序即可。

这样做呢,有个弊端,就是如果要设置外挂就得需要打开游戏界面,然后呼出外挂进行设置,不是很方便。

2、消息通讯法,其实还有几种的,比如共享内存段等方法,为什么推荐消息呢,个人感觉消息写起来比较舒服,而且代码简单。此方法呢,DLL中只写常用的CALL信息,比如:普通攻击CALL,买卖CALL,拾取CALL等等,没有其他的。而主程序里写挂的所有逻辑判断,当需要执行某个动作时,比如普通攻击,那么就发个消息给DLL让他执行普通攻击操作就可以了。

消息呢,VC里我使用了自定义消息来实现,不同的消息名称对应不同的操作,这样就很好区分不同CALL了。

至于消息的接受,我认为有二种方式,第一种,消息直接发给对应的目标程序里的DLL,这样做呢,简单些,DLL里接受消息后进行对应操作,但这样做有个问题,就是如果多开的话,DLL的查找是个问题,不知道应该发给哪个游戏内的DLL。第二种方法呢,就是DLL内通过SetWindowsHookEx挂钩(HOOK)消息处理函数,这样DLL就可以接受到发给游戏的消息,那么DLL就可以根据发给游戏的消息来判断执行对应的操作,这样的方式就解决了第一种方法中的弊端,发消息时,直接发给对应游戏就可以了。

具体的看源码吧

源码为一个RAR文件,其中做了三个事例,LoadLibrary注入事例,全局钩子呼出事例、全局钩子消息事例。

BY C++ 2009-7-20

转载请保留作者信息,谢谢!

另外履行一个我的承诺:http://www.ghoffice.com/bbs/read-htm-tid-68285.html

这里提到的工具,一起打包进去了,以上包里所有内容都为源码。

-------------------------------------------------------------------------------------------

代码下载见:http://www.ghoffice.com/bbs/read-htm-tid-69334.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: