1、Dll的优势:git
1、扩展应用程序的特性github
2、简化项目管理编程
3、有助于节省内存数组
4、促进资源的共享多线程
5、促进本地化函数
6、有助于解决平台间的差别加密
7、可用于特殊目的spa
有关于dll及注入相关理论资料,可参考《Windows核心编程5》第四部分(19-22章)。.net
2、作dll注入时遇到的坑线程
环境:VS2013
dll功能:弹出对话框、cmd调用命令打开word文档
exe功能:注入dll到系统进程explorer.exe
问题:dll注入成功,可是dll中的代码未运行(未弹出对话框及打开word文档)
1、编译要选择Release版本,win32或者x64根据电脑的系统版本选择
2、exe注入dll时,传参的路径中要存在dll。这个坑我是怎么都没想到,阴沟里翻船了!我用的是获取当前路径函数[GetCurrentDirectory],而exe运行时获取的路径并非exe真实存在的路径,或许你听起来蒙圈了,可是遇到注入失败时,肯定路径是否正确也是一个调试思路。
3、没法获取dll路径
当我获取路径的问题没法解决时,有两种方法能够绕过该问题
一、将dll加密成字符串存储到exe中的大数组里,而后解密到指定路径dll_path下的.dll文件中,在注入的时候,直接传路径dll_path就万无一失了。
二、用Visual studio将dll以资源的形式嵌入到exe中。
我采用了第二种方法解决,第一种方法还何尝试
4、以远线程注入为例
一、准备
示例采用VS2012,win32控制台--->空项目
选择Release、win32版本
解决方案资源管理器窗口中,右键选择属性
修改项目属性C/C++---->代码生成--->运行库--->多线程(/MT)
修改项目属性连接器--->调试--->生成调试信息--->否
这样生成的exe最小,并且当反编译时,避免出现编译路径等调试信息。
关于dll注入的代码,强推https://github.com/fdiskyou/injectAllTheThings ,至少我在调试的时候,环境适配性很不错。
二、代码
右键添加现有项,将远线程注入所需的.cpp、.h文件添加进去,而后再修改一下头文件包含的问题。
解决方案资源管理器窗口中,右键选择添加--->资源
弹出对话框
选择导入
这里要选择全部文件,不然.dll格式的文件没法显示,选择想要注入的dll后,出现下图所示对话框。
点击肯定后,解决资源管理方案中多出了三个文件
在加载资源函数前,添加头文件[#include “resource.h”],不然有一些函数会报错
而后编译一下,若是还有语法报错,相信凭经验很快就可以解决掉它了。
最终在win7虚拟机中运行的结果以下图所示
借鉴的资源
https://bbs.csdn.net/topics/390413480
https://bbs.csdn.net/topics/250007060
调试代码能够参考个人git
https://github.com/Qing-Huan/DLL-embedding-exe
我并非代码的创造者,只是将我遇到的坑展现出来,减小他人排坑的时间,欢迎大佬们指点!