dll注入源碼
⑴ 求易語言dll注入呼出窗口源碼,非模塊
.版本 2
.子程序 _啟動子程序, 整數型, , 請在本子程序中放置動態鏈接庫初始化代碼
_臨時子程序 () ' 在初始化代碼執行完畢後調用測試代碼
返回 (0) ' 返回值被忽略。
.子程序 _臨時子程序
' 本名稱子程序用作測試程序用,僅在開發及調試環境中有效,編譯發布程序前將被系統自動清空,請將所有用作測試的臨時代碼放在本子程序中。 ***注意不要修改本子程序的名稱、參數及返回值類型。
.子程序 mydll, , 公開
設置呼出窗口 ()
.子程序 設置呼出窗口
載入 (窗口1, , 真)
⑵ 易語言傳奇世界dll注入器源碼
把dll添加到圖片或者聲音資源
需要用到超級模塊,然後輸入法注入,注冊熱鍵(Home或者End),進游戲呼出。
熱鍵.注冊(_啟動窗口_創建完畢(),&Home鍵,#子程序1)
寫到文件(取特定目錄(10)+「\XX.dll",#DLL)
寫到文件(取特定目錄(10)+「\Soudou.ime",#Shurufa)
子程序1
局部變數 bool
bool=(進程是否存在(「傳奇世界私服.exe」)或 進程是否存在(「傳奇世界私服.exe」)
⑶ 易語言怎麼注入DLL吖
.版本
2
.子程序
_按鈕1_被單擊
鉤子id
=
全局注入.安裝鉤子
(「你的dll全局路徑.dll」,
游戲窗口的線程id)
.判斷開始
(鉤子id
≠
0)
信息框
(「注入成功」,
0,
「提示」)
.默認
信息框
(「注入成功」,
0,
「提示」)
.判斷結束
.子程序
__啟動窗口_將被銷毀
全局注入.卸載鉤子
()
『用的是超級模塊
⑷ 易語言dll怎麼注入別的程序並運行
包括dll和啟動兩個方面
你這個很搞笑,上面說要dll,下面又說不要dll
如果你是想在目標程序中運行自己的代碼的話,可以考慮遠線程注入運行
方法具體是先在目標進程開辟內存頁,然後將二進制(匯編)代碼寫入到該內存,再遠程運行此代碼即可
⑸ 易語言自動注入DLL源碼
.版本 2
.支持庫 eAPI
.支持庫 spec
.支持庫 iext
.支持庫 shell
.程序集 窗口程序集1
.程序集變數 輸入法句柄, 整數型
.子程序 __啟動窗口_創建完畢
.局部變數 透明度, 整數型
.局部變數 進度條位置, 整數型
.判斷開始 (進程是否存在 (「DNF.exe」))
_啟動窗口.移動 (取屏幕寬度 () - (_啟動窗口.寬度 + 7), 取屏幕高度 () - _啟動窗口.高度 - 37, , )
.變數循環首 (1, 200, 3, 透明度)
設置窗口透明度 (取窗口句柄 (), 透明度)
_啟動窗口.可視 = 真
延遲 (2)
.變數循環尾 ()
延時 (5000)
.變數循環首 (1, 100, 1, 進度條位置)
進度條1.位置 = 進度條位置
.如果真 (進度條1.位置 = 20)
透明標簽1.標題 = 「蝶戀花啟動中...」
延時 (1000)
透明標簽1.標題 = 「蝶戀花更新中...」
注入 ()
.如果真結束
.如果真 (進度條1.位置 = 進度條1.最大位置)
透明標簽1.標題 = 「開始呼出...」
輸入法激活 ()
.如果真結束
.如果真 (進度條1.位置 = 進度條1.最大位置)
透明標簽1.標題 = 「激活成功...」
延時 (2000)
透明度 = 200
特效.漸隱漸現 (取窗口句柄 (), 假, 5000)
延時 (500)
_啟動窗口.可視 = 假
.如果真結束
延遲 (50)
.變數循環尾 ()
.默認
停止播放 ()
信息框 (「請到選擇頻道處開啟本輔助」, 0, )
銷毀 ()
.判斷結束
.子程序 注入, , , dll文件和輸入法需要的文件的寫出
寫到文件 (取特定目錄 (10) + 「\Sougoo.ime」, #Shurufa)
輸入法句柄 = 輸入法.安裝 (取特定目錄 (10) + 「\Sougoo.ime」, 「胡胡輸入法」)
調試輸出 (輸入法句柄)
寫到文件 (取特定目錄 (10) + 「\DNF星辰.dll」, #胡胡掛)
.如果 (輸入法句柄 ≠ 0)
輸入法.設置注入 (取特定目錄 (10) + 「\Sougoo.ime」, 取特定目錄 (10) + 「\DNF星辰.dll」)
.否則
透明標簽1.標題 = 「注入輸入法失敗....」
_啟動窗口.銷毀 ()
.如果結束
.子程序 輸入法激活
.局部變數 bool, 邏輯型
bool = 進程是否存在 (「DNF.exe」)
.如果真 (bool)
輸入法.激活 (取句柄2 (「DNF.exe」, , ), 輸入法句柄)
超級延時 (1000, )
時鍾1.時鍾周期 = 2000
.如果真結束
.子程序 _時鍾1_周期事件
.判斷開始 (進程是否存在 (「DNF.exe」))
.默認
__啟動窗口_將被銷毀 ()
.判斷結束
.子程序 __啟動窗口_將被銷毀
延時 (500)
終止進程 (「TXPlatform.exe」)
終止進程 (「TenSafe.exe」)
刪除文件 (取特定目錄 (10) + 「\DNF星辰.dll」)
刪除文件 (取特定目錄 (10) + 「\Sougoo.ime」)
輸入法.卸載 (輸入法句柄)
延時 (1000)
銷毀 ()
.版本 2
.圖片 Shurufa
.圖片 胡胡掛
⑹ 求易語言鉤子注入dll及home呼出源碼
易語言鉤子DLL注入源碼及源碼說明2010-04-06 13:52[所有要使用到的API]
.版本 2
.DLL命令 LoadLibraryA, 整數型,"kernel32.dll","LoadLibraryA"
.參數 lpLibFileName, 文本型
.DLL命令 SetWindowsHookExA, 整數型, "user32.dll", "SetWindowsHookExA", 公開, SetWindowsHookEx
.參數 鉤子類型, 整數型, , idHook
.參數 回調函數地址, 整數型, , lpfn
.參數 實例句柄, 整數型, , hmod
.參數 線程ID, 整數型, , dwThreadId
.DLL命令 FreeLibrary, 整數型, "kernel32.dll", "FreeLibrary", , 釋放指定的動態鏈接庫,它們早先是用LoadLibrary ;API函數裝載的 非零表示成功,零表示失敗。會設置GetLastError
.參數 庫句柄, 整數型, , hLibMole,要釋放的一個庫句柄,在VB里使用只能用這個函數釋放那些由應用程序明確裝載的DLL。對LoadLibrary的每一次調用都應該有一個對應的FreeLibrary調用;
.DLL命令 UnhookWindowsHookEx, 整數型, "user32.dll", "UnhookWindowsHookEx", , UnhookWindowsHookEx
.參數 鉤子句柄, 整數型, , hHook
.DLL命令 CallNextHookEx, 整數型, "user32.dll", "CallNextHookEx", 公開, CallNextHookEx
.參數 鉤子句柄, 整數型, , hHook
.參數 代碼值, 整數型, , ncode
.參數 附加參數1, 整數型, , wParam
.參數 附加參數2, 整數型, 傳址, lParam
.DLL命令 GetProcAddress, 整數型, "kernel32.dll", "GetProcAddress", , 取進程路徑
.參數 模塊句柄, 整數型, , hMole
.參數 進程名稱, 文本型, , lpProcName
.DLL命令 GetCurrentThreadId, 整數型, "kernel32.dll", "GetCurrentThreadId"
.DLL命令 獲取特別文件夾位置_, 整數型, "shell32.dll", "SHGetSpecialFolderLocation"
.參數 窗口句柄, 整數型, , hwndOwner
.參數 文件夾位置, 整數型, , nFolder
.參數 結構, 項目標識符列表_, 傳址, pIdl
.DLL命令 從列表id取路徑_, 整數型, "shell32.dll", "SHGetPathFromIDListA", , $(b)
.參數 結構指針, 整數型, , pIdl
.參數 路徑, 文本型, 傳址, pszPath
.DLL命令 CallWindowProcA, 整數型, "user32.dll", "CallWindowProcA"
.參數 動態調用代碼, 位元組集, , 一定要用本人編寫的
.參數 子程序, 子程序指針, , 子程序指針
.參數 參數, 整數型, 數組, 為整數數組,參數1為成員1…類推;文本型和位元組集型(自定義結構)為指針
.參數 參數數目, 整數型, , 一定要和參數數組相符,不然會出錯
.參數 是否C調用, 整數型, , 真為cdecl調用方式,假為stdcall調用方式(即標准WINAPI方式)
[這里函數所有代碼和一個自定義類型,API代碼在左邊]
.版本 2
.程序集 程序集1
.程序集變數 臨時呼出熱鍵, 整數型
.程序集變數 臨時載入窗口, 窗口
.程序集變數 鉤子模塊句柄, 整數型, , "1000"
.程序集變數 鉤子句柄, 整數型, , "1000"
.程序集變數 鉤子IDx, 整數型
.程序集變數 x, 整數型
.程序集變數 鉤子句柄1, 整數型
.程序集變數 temp目錄, 文本型
.程序集變數 xxx, 整數型
.程序集變數 熱鍵鉤子句柄, 整數型
.程序集變數 第一次, 邏輯型
.子程序 調用_調用子程序, 整數型, 公開, 呼叫某個函數 可以傳入無限個參數 返回函數返回值
.參數 子程序指針, 子程序指針, , 指定函數
.參數 參數, 整數型, 可空 數組, 指定參數 可以不寫, 參數為數組 格式為 參數[1]=xxx 參數[2]=xxx 文本型或位元組集請用 轉換指針 格式2 加入成員(參數,xxx)
.局部變數 動態調用代碼, 位元組集
動態調用代碼 = { 85, 139, 236, 86, 139, 117, 16, 141, 78, 255, 133, 201, 124, 21, 139, 69, 12, 141, 4, 136, 65, 139, 16, 137, 85, 16, 255, 117, 16, 131, 232, 4, 73, 117, 242, 255, 85, 8, 137, 69, 12, 139, 69, 20, 133, 192, 116, 13, 141, 4, 181, 0, 0, 0, 0, 137, 69, 16, 3, 101, 16, 139, 69, 12, 94, 93, 194, 16, 0 }
返回 (CallWindowProcA (動態調用代碼, 子程序指針, 參數, 取數組成員數 (參數), 0))
.子程序 操作_取特定目錄, 文本型, 公開, 取特定的目錄(返回所要取的指定目錄名 無效返回空)
.參數 欲獲取目錄類型, 整數型, 可空, 0我的桌面 1臨時目錄 5我的文檔 6我的收藏夾 7我的啟動 11我的開始菜單 20系統字體 36Windows安裝目錄 37系統目錄 [99更多]
.局部變數 路徑, 文本型
.局部變數 標示結構, 項目標識符列表_
.局部變數 目錄類型, 整數型
.如果真 (欲獲取目錄類型 = 99)
輸出調試文本 (「0我的桌面 2我的程序 5我的文檔 6我的收藏夾 7我的啟動 8我最近的文檔 9我的發送到 11我的開始菜單 13我的音樂 14我的視頻 16我的桌面 20系統字體 22開始菜單組 23程序組 24啟動組 25桌面 31收藏夾 32我的瀏覽器臨時目錄 33我的Cookies 34我的歷史記錄 36Windows安裝目錄 37系統目錄 38文件安裝目錄 39我的圖片 40用戶目錄 41系統目錄 46文檔 47管理工具 48我的管理工具 53音樂 54圖片 55視頻」)
.如果真結束
.如果 (欲獲取目錄類型 = 1)
目錄類型 = 34
.否則
目錄類型 = 欲獲取目錄類型
.如果結束
獲取特別文件夾位置_ (0, 目錄類型, 標示結構)
路徑 = 取空白文本 (255)
從列表id取路徑_ (標示結構.結構大小, 路徑)
.如果真 (路徑 = 「」)
返回 (「」)
.如果真結束
.如果真 (欲獲取目錄類型 = 1)
路徑 = 子文本替換 (路徑, 「History」, 「Temp」, , , 真)
.如果真結束
返回 (路徑 + 「\」)
.子程序 注入_安裝鉤子DLL, 整數型, 公開, DLL注入 返回0=失敗 整數型 DLL介面(代碼值,參數1,參數2)
.參數 線程ID, 整數型, , -1 全局鉤子
.參數 DLL全名, 文本型, , DLL全名
.參數 DLL介面, 文本型, 可空, 默認 整數型 鉤子介面(代碼值,參數1,參數2)
.局部變數 臨時變數, 整數型
.局部變數 目錄, 文本型
.局部變數 窗口句柄, 整數型
.如果真 (是否為空 (DLL介面) = 真)
DLL介面 = 「鉤子介面」
.如果真結束
.如果真 (線程ID = 0)
返回 (0)
.如果真結束
.如果真 (線程ID = -1)
線程ID = 0
.如果真結束
鉤子IDx = 鉤子IDx + 1
鉤子模塊句柄 [鉤子IDx] = LoadLibraryA (DLL全名)
鉤子句柄 [鉤子IDx] = SetWindowsHookExA (3, GetProcAddress (鉤子模塊句柄 [鉤子IDx], DLL介面), 鉤子模塊句柄 [鉤子IDx], 線程ID)
目錄 = 操作_取特定目錄 (1)
寫配置項 (目錄 + 「ada.ini」, 「ada」, 「鉤子句柄」, 到文本 (鉤子句柄 [鉤子IDx]))
輸出調試文本 (鉤子IDx, 鉤子模塊句柄 [鉤子IDx], 鉤子句柄 [鉤子IDx])
返回 (鉤子IDx)
.版本 2
.子程序 注入_卸載鉤子DLL, 邏輯型, 公開
.參數 鉤子ID, 整數型, 可空, 卸載所有時無效
.參數 卸載所有, 邏輯型, 可空
.局部變數 xx, 整數型
.如果真 (卸載所有)
.如果真 (鉤子IDx > 0)
.計次循環首 (鉤子IDx, xx)
.如果真 (鉤子模塊句柄 [xx] ≠ 0)
FreeLibrary (鉤子模塊句柄 [xx])
UnhookWindowsHookEx (鉤子句柄 [xx])
.如果真結束
.計次循環尾 ()
.如果真結束
返回 (真)
.如果真結束
.如果真 (鉤子ID > 0)
.如果真 (鉤子模塊句柄 [鉤子ID] ≠ 0)
FreeLibrary (鉤子模塊句柄 [鉤子ID])
UnhookWindowsHookEx (鉤子句柄 [鉤子ID])
返回 (真)
.如果真結束
.如果真結束
返回 (假)
.子程序 注入_初始化鉤子DLL, 整數型, 公開, DLL用.
.參數 代碼值, 整數型
.參數 參數1, 整數型
.參數 參數2, 整數型
.參數 初始, 子程序指針
.局部變數 xxxx, 整數型
.如果真 (鉤子句柄1 = 0)
temp目錄 =操作_取特定目錄 (1)
鉤子句柄1 = 到整數 (讀配置項 (temp目錄 + 「ada.ini」, 「ada」, 「鉤子句柄」, ))
.如果真結束
.如果真 (第一次 = 假)
第一次 = 真
調用_調用子程序 (初始)
.如果真結束
返回 (CallNextHookEx (鉤子句柄1, 代碼值, 參數1, 參數2))
.子程序 注入_設置呼出窗口, 邏輯型, 公開
.參數 設置熱鍵, 整數型
.參數 呼出窗口, 窗口
臨時呼出熱鍵 = 設置熱鍵
臨時載入窗口 = 呼出窗口
熱鍵鉤子句柄 = SetWindowsHookExA (2, 到整數 (&呼出鍵介面), 0, GetCurrentThreadId ())
.如果真 (熱鍵鉤子句柄 > 0)
返回 (真)
.如果真結束
返回 (假)
.子程序 呼出鍵介面, 整數型
.參數 一, 整數型
.參數 二, 整數型
.參數 三, 整數型
.如果真 (一 = 0 且 二 = 臨時呼出熱鍵 且 三 > 0)
.如果 (是否已創建 (臨時載入窗口))
.如果 (臨時載入窗口.可視)
臨時載入窗口.可視= 假
.否則
臨時載入窗口.可視= 真
.如果結束
.否則
載入 (臨時載入窗口, , 假)
臨時載入窗口.Esc鍵關閉= 假
臨時載入窗口.最小化按鈕= 真
.如果結束
.如果真結束
返回 (CallNextHookEx (熱鍵鉤子句柄, 一, 二, 三))
.版本 2
.數據類型 項目標識符列表_, , ITEMIDLIST
.成員 結構大小, 整數型, , , cb
.成員 標識符長度, 位元組型, , "255", abID
此函數是用來調用指針函數的.就是CALL
取目錄用這個我就不解釋了
下面是源碼主要函數
函數解釋:
本函數參數1為要HOOK的線程ID,參數2為要注入的DLL名,參數3[可空]為DLL介面名字空則為"鉤子介面".
下面解釋是如何實現的:
1.首先使用LoadLibraryA獲取DLL模塊地址.
2.然後設置SetWindowsHookExA
參數一為HOOK類型,使用WH_GETMESSAGE(3) Hook來監視從GetMessage or PeekMessage函數返回息。
參數二為介面地址,就是說把消息返回轉接到的位置,當然我們這里所使用的是我們DLL所公開的那個函數
參數三為介面模塊的句柄即DLL的句柄(地址)
參數四為將要被HOOK的線程ID(0為全局HOOK,不推薦使用全局HOOK)
3.設置完後將鉤子句柄寫配置項到臨時目錄(後面將要使用).
說白了其實這個才是真正的介面(DLL里的介面只是在做轉接而已),
我先講這個函數是如何實現的(上面已經說了這才是真正的介面).
1,鉤子句柄是一個程序集變數,先判斷這個變數是否為0,如果等於0那麼就是說這個函數第一次被使用,
第一次使用將讀去上個函數寫在臨時目錄的鉤子句柄.
2.用一個邏輯變數(程序集變數或全局變數),來判斷這個消息鉤子是否第一次運行(為了防止後面調用
子程序被多次調用),是的話調用一個子程序(自己設置)
3.使用CallNextHookEx(呼叫下一個鉤子)把當前HOOK的信息在傳送回被HOOK的鉤子里,那個鉤子我們
就不用管了.
下來說下到底如何使用
首先在你的EXE程序里寫這個(我就不多說這是干嗎的了).
然後在DLL里寫上這個代碼(有人可能覺得眼熟,好像在什麼地方見過,對了這個代碼和
外掛作坊的鉤子注入差不多)
下來說明下按鍵呼出窗口的函數
用變數把當前參數存起來(主要方便介面調用)
1.為當前運行線程設置一個鍵盤鉤子
2.[介面]設置按鍵判斷,如果按下我們設置的鍵將呼出窗口,如果這個窗口沒創建將判斷創建,
如果已經創建再次按下則會隱藏,
載入後的窗口把用ESC關閉的屬性弄成假,不需要ESC關閉
3.最後就是再呼叫下以前的鉤子.
最後就是卸載鉤子DLL了.
判斷是否要卸載全部的鉤子,如果是就循環將現有鉤子DLL全部卸載.
不是就按著ID來卸載
卸載方法:
1.FreeLibrary就是卸載一個載入的DLL
2.UnhookWindowsHookEx乃是卸載這個HOOK
-.-OK了這就是 鉤子DLL注入,謝謝大家閱讀,如果看不明白,
⑺ 求助一個 易語言DLL注入器源碼 要求能注入游戲
用模塊
⑻ 有現成的DLL,要最簡單的注入源碼
BOOL EnableDebugPrivilege(BOOL bEnable)
{
BOOL fOK = FALSE;
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL,SE_DEBUG_NAME, &tp.Privileges[0].Luid); //
tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
fOK = (GetLastError() ==ERROR_SUCCESS);
CloseHandle(hToken);
}
return fOK;
}
//寫內存 注意:注釋掉的部分在這個程序里用不上,因為程序可以直接訪問,沒有許可權問題
BOOL me_WriteProcessMemory(DWORD dwProcsPID,DWORD dwAddress,LPVOID Data,SIZE_T SIZE)
{
//EnableDebugPrivilege(true);
DWORD size;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcsPID);//PROCESS_VM_WRITE|PROCESS_VM_READ
//DWORD dwOldProc;
//DWORD dwNewProc;
//改變頁面屬性為讀寫
//VirtualProtectEx( hProcess,(LPVOID)dwAddress,SIZE,PAGE_READWRITE, &dwOldProc );
BOOL RE=WriteProcessMemory(hProcess,(LPVOID)dwAddress,Data,SIZE,&size);
//恢復頁面文件的屬性
//VirtualProtectEx( hProcess,(LPVOID)dwAddress,SIZE,dwOldProc,&dwNewProc );
CloseHandle(hProcess);
//EnableDebugPrivilege(false);
return RE;
}
//讀取內存
BOOL me_ReadProcessMemory(DWORD dwProcsPID,DWORD dwAddress,LPVOID Data,SIZE_T SIZE)
{
//EnableDebugPrivilege(true);
DWORD size;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcsPID);
BOOL RE=ReadProcessMemory(hProcess, (LPVOID)dwAddress,Data,SIZE, &size);
//EnableDebugPrivilege(false);
CloseHandle(hProcess);
return RE;
}
//獲取指定窗口名PID
bool me_Findgamewindow(LPCWSTR GAMEWINODWNAME,__out DWORD *pidwin)
{
HWND hWnd=FindWindow(NULL,GAMEWINODWNAME);
if(hWnd)
{
//*GameBaseAdd=(DWORD)GetWindowLongPtr(hWnd, GWL_HINSTANCE);
GetWindowThreadProcessId(hWnd,pidwin);
return true;
}
return false;
}
/*
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
BOOL IsWow64()
{
BOOL bIsWow64 = FALSE;
fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
GetMoleHandle(TEXT("kernel32")),"IsWow64Process");
if(NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
return FALSE;
}
}
return bIsWow64;
}
*/
//進程注入
bool IntoProcess(/*DWORD dwProcsPID,*/WCHAR *DllPath,WCHAR *WinName,HWND IntoPhWnd=NULL)
{
DWORD dwProcsPID=0;
if(IntoPhWnd!=NULL)//有句柄直接用句柄
GetWindowThreadProcessId(IntoPhWnd,&dwProcsPID);
//只有窗口名那就取找到的第一個窗口
else me_Findgamewindow(WinName,&dwProcsPID);
if(dwProcsPID!=0)
{
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcsPID);
if(hProcess==NULL)
{
MessageBox(NULL,L"無法打開進程哈",L"ERROR_006",MB_OK);
return false;
}
BOOL ISx64=TRUE;
IsWow64Process(hProcess,&ISx64);
if (!ISx64)
{
MessageBox(NULL,L"無法注入到64位進程哈",L"ERROR_008",MB_OK);
return false;
}
DWORD cb = (1+lstrlenW(DllPath))* sizeof(WCHAR);
LPVOID dwDllAddress=VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
BOOL RE=WriteProcessMemory(hProcess,(LPVOID)dwDllAddress,DllPath,cb,&cb);
PTHREAD_START_ROUTINE pfnStartAddr;
pfnStartAddr = (PTHREAD_START_ROUTINE)LoadLibraryW;
HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,pfnStartAddr,dwDllAddress,0,NULL);
if(hThread == NULL)
{
CloseHandle(hThread);
VirtualFreeEx(hThread,dwDllAddress,cb,MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
VirtualFreeEx(hThread,dwDllAddress,cb,MEM_RELEASE);
CloseHandle(hProcess);
}
else
{
MessageBox(NULL,L"注入失敗",L"ERROR_009",MB_OK);
return false;
}
return true;
}
//進程注入
bool IntoProcess(DWORD dwProcsPID,WCHAR *DllPath)
{
if(dwProcsPID!=0)
{
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcsPID);
if(hProcess==NULL)
{
MessageBox(GetForegroundWindow(),L"無法打開進程哈",L"ERROR_006",MB_OK);
return false;
}
BOOL ISx64=TRUE;
IsWow64Process(hProcess,&ISx64);
if (!ISx64)
{
MessageBox(GetForegroundWindow(),L"無法注入到64位進程哈",L"ERROR_008",MB_OK);
return false;
}
DWORD cb = (1+lstrlenW(DllPath))* sizeof(WCHAR);
LPVOID dwDllAddress=VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
BOOL RE=WriteProcessMemory(hProcess,(LPVOID)dwDllAddress,DllPath,cb,&cb);
PTHREAD_START_ROUTINE pfnStartAddr;
pfnStartAddr = (PTHREAD_START_ROUTINE)LoadLibraryW;
HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,pfnStartAddr,dwDllAddress,0,NULL);
if(hThread == NULL)
{
CloseHandle(hThread);
VirtualFreeEx(hThread,dwDllAddress,cb,MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
WaitForSingleObject(hThread,INFINITE);
DWORD ExitCode;
GetExitCodeThread(hThread,&ExitCode);
CloseHandle(hThread);
VirtualFreeEx(hThread,dwDllAddress,cb,MEM_RELEASE);
CloseHandle(hProcess);
if (ExitCode==0)
{
MessageBox(GetForegroundWindow(),L"注入失敗,很大的可能是你的DLL文件問題",L"ERROR_010",MB_OK);
return false;
}
}
else
{
MessageBox(GetForegroundWindow(),L"注入失敗",L"ERROR_009",MB_OK);
return false;
}
return true;
}