注入遊戲後保證穩定性的總結

最近對一個遊戲進行了注入並HookD3D的操作,期間程序一度出現一些遊戲不穩定的問題,現在總結一下。
 
 
注入方式
1.注入方式內存方式適用於win7x64非sp1外的版本 (打開進程>申請內存>寫入DLL數據>開啓遠程線程指向內存地址)。
2.線程注入部分系統存在不兼容(未確定) 。


一.初始化流程
由兩個DLL組成,可理解爲中轉。
1.中轉DLL
2.功能DLL

注入採用vs2010編寫win32的動態鏈接庫(只導入kernel32),然後由此DLL從共享內存中獲取目錄位置,並進行第二個DLL(功能DLL)的載入後並調用初始化函數。

中轉的原因如下:
注入後使用LoadLibrary載入時功能DLL,會先將此DLL有的導入函數的相關DLL進行檢查並加載,如果系統缺少功能DLL所需的一些DLL,則會造成功能DLL載入失敗,返回0,但是如果我們直接將功能DLL注入並調用,如果此時缺少部分系統DLL,則會100%造成被注入程序崩潰。


二.初始化注意事項
1.初始化函數開啓一個線程來執行初始化,因爲某些函數可能會因爲注入方式造成程序主線程卡死。
2.初始化線程不要自行結束,應在返回前使用SuspendThread對自身進行掛起或使用Sleep進行長期的休眠,以免釋放線程棧造成的一系列異常。
3.一定要對初始化的每一步做好判斷,有一步失敗就應停止後續操作參考第2步終止,不建議再次嘗試。
4.因爲初始化是單獨線程,而Hook的執行函數是屬於主線程的,所以可能出現Hook完成並已經開始工作,但是初始化缺還未完成導致的錯誤,這個不要疏忽,應在Hook的函數中增加初始化成功的判斷。


三.其他注意事項
1.一定不要注入後在進程中搜索自身,會在xp下產生隨機的崩潰問題(即使限制在0x00400000-0x00FFFFFF範圍)(win7下完全不存在此崩潰問題)。
2.最好使用標準win32dll。
3.不應使用需要每次Hook函數後需要恢復的Hook方式,如在操作函數入口時有其他線程正在讀寫此函數,將會發生不可預知的錯誤。
4.發佈前一定要檢查DLL導入函數,是否使用到了其他DLL。


四.計時
1.不要使用線程死循環Sleep進行計時,會導致不穩定的問題,以及主程序退出時可能發生錯誤。
2.應使用CreateTimerQueueTimer等函數進行計時。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章