zoukankan      html  css  js  c++  java
  • 在Visual Studio中将dll以资源的形式嵌入exe中

    一、Dll的优点:

    1、扩展应用程序的特性

    2、简化项目管理

    3、有助于节省内存

    4、促进资源的共享

    5、促进本地化

    6、有助于解决平台间的差异

    7、可用于特殊目的

    有关于dll及注入相关理论资料,可参考《Windows核心编程5》第四部分(19-22)

    二、做dll注入时遇到的坑

    环境:VS2013

    dll功能:弹出对话框、cmd调用命令打开word文档

    exe功能:注入dll到系统进程explorer.exe

    问题:dll注入成功,但是dll中的代码未运行(未弹出对话框及打开word文档)

    1、编译要选择Release版本,win32或者x64根据电脑的系统版本选择

    2exe注入dll时,传参的路径中要存在dll。这个坑我是怎么都没想到,阴沟里翻船了!我用的是获取当前路径函数[GetCurrentDirectory],而exe运行时获取的路径并不是exe真实存在的路径,或许你听起来蒙圈了,但是遇到注入失败时,确定路径是否正确也是一个调试思路。

    三、无法获取dll路径

    当我获取路径的问题无法解决时,有两种方法可以绕过该问题

    1、dll加密成字符串存储到exe中的大数组里,然后解密到指定路径dll_path下的.dll文件中,在注入的时候,直接传路径dll_path就万无一失了。

    2、Visual studiodll以资源的形式嵌入到exe中。

    我采用了第二种方法解决,第一种方法还未尝试 

    四、以远线程注入为例

    1、准备

    示例采用VS2012win32控制台--->空项目

    选择Releasewin32版本

    解决方案资源管理器窗口中,右键选择属性

    修改项目属性C/C++---->代码生成--->运行库--->多线程(/MT)

    修改项目属性链接器--->调试--->生成调试信息--->

    这样生成的exe最小,而且当反编译时,避免出现编译路径等调试信息。

    关于dll注入的代码,强推https://github.com/fdiskyou/injectAllTheThings ,至少我在调试的时候,环境适配性很不错。

    2、代码 

    右键添加现有项,将远线程注入所需的.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

    我并不是代码的创造者,只是将我遇到的坑展示出来,减少他人排坑的时间,欢迎大佬们指点!

  • 相关阅读:
    if __name__ == 'main': 的作用和原理
    第四篇、Python文件处理
    第二篇*2、Python字符串格式化
    第三篇、Python函数
    第二篇*1、Python基本数据类型
    ping包,支持ip录入
    layui之弹出层--从父窗口传递数据到子窗口
    动态调用WebService
    c# 类的反射实例 (GetType().Invoke().GetMethod().CreateInstance())
    ASP.Net UpdatePanel控件 局部刷新 && 弹出提示信息
  • 原文地址:https://www.cnblogs.com/qinghuan190319/p/12097126.html
Copyright © 2011-2022 走看看