一、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根據電腦的系統版本選擇
2、exe注入dll時,傳參的路徑中要存在dll,這個坑我是怎么都沒想到,陰溝里翻船了!我用的是獲取當前路徑函式[GetCurrentDirectory],而exe運行時獲取的路徑并不是exe真實存在的路徑,或許你聽起來蒙圈了,但是遇到注入失敗時,確定路徑是否正確也是一個除錯思路,
三、無法獲取dll路徑
當我獲取路徑的問題無法解決時,有兩種方法可以繞過該問題
1、將dll加密成字串存盤到exe中的大陣列里,然后解密到指定路徑dll_path下的.dll檔案中,在注入的時候,直接傳路徑dll_path就萬無一失了,
2、用Visual studio將dll以資源的形式嵌入到exe中,
我采用了第二種方法解決,第一種方法還未嘗試
四、以遠執行緒注入為例
1、準備
示例采用VS2012,win32控制臺--->空專案
選擇Release、win32版本
解決方案資源管理器視窗中,右鍵選擇屬性
修改專案屬性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
我并不是代碼的創造者,只是將我遇到的坑展示出來,減少他人排坑的時間,歡迎大佬們指點!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/188870.html
下一篇:用C#寫差異檔案備份工具
