在Visual Studio中將dll以資源的形式嵌入exe中

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根據電腦的系統版本選擇

2exe注入dll時,傳參的路徑中要存在dll。這個坑我是怎麼都沒想到,陰溝裏翻船了!我用的是獲取當前路徑函數[GetCurrentDirectory],而exe運行時獲取的路徑並非exe真實存在的路徑,或許你聽起來蒙圈了,可是遇到注入失敗時,肯定路徑是否正確也是一個調試思路。

3、沒法獲取dll路徑

當我獲取路徑的問題沒法解決時,有兩種方法能夠繞過該問題

一、dll加密成字符串存儲到exe中的大數組裏,而後解密到指定路徑dll_path下的.dll文件中,在注入的時候,直接傳路徑dll_path就萬無一失了。

二、Visual studiodll以資源的形式嵌入到exe中。

我採用了第二種方法解決,第一種方法還何嘗試 

4、以遠線程注入爲例

一、準備

示例採用VS2012win32控制檯--->空項目

選擇Releasewin32版本

解決方案資源管理器窗口中,右鍵選擇屬性

修改項目屬性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

我並非代碼的創造者,只是將我遇到的坑展現出來,減小他人排坑的時間,歡迎大佬們指點!

相關文章
相關標籤/搜索