游戏保护模块
第八章:定位游戲保護模塊
GameSpider
kernel Detective
1.定位ring0驅動級保護模塊可以用KD比較游戲啟動前后差異。
2.定位ring3可以hook低層接口再棧回塑。(游戲可以自加載同一模塊的另一份來用,此時hook無效)
3.保護模塊可能hook系統原生dll接口來保護,此時可以比較原生dll文件與加載到內存的映像來定位哪些被HOOK。
為防止被保護模塊檢測,在分析時可以把除當前線程所有線程掛起。
GameSpider下 cmf ntdll.dll可查看PE文件與映像文件的差異
ntdll.dll中的DbgBreakPoint,DbgUiRemoteBreakin,ZwProtectVirtualMemory常被ret,轉移,Hook.分別阻止軟中斷,遠程軟中斷,修改頁面保護屬性
GameSpider下ssl查詢自加載模塊
有三種方法定位其他模塊的自加載情況:
1.比較所有模塊的導出函數列表及導出函數名稱是否一致。 比較精確,但游戲會對對關鍵內存塊(代碼與導出表信息)設置不允許讀,只許執行。
2.比較所有模塊的第一個導出函數名稱與導出函數個數是否一致。
3.比較所有模塊的加載名字和導出表中的名字是否一致。
保護方案:ring3保護方案和ring0保護方案
ring3保護流程:
1.Inline Hook ntdll.dll中與調試相關的接口DbgBreakPoint,DbgUiRemoteBreakin,如果沒有代碼還原檢測,直接還原。
2.Inline Hook ntdll.dll中與頁面保護相關的接口ZwProtectVirtualMemory,如果沒有代碼還原檢測,直接還原。
3.設置VEH.可以不用修改代碼來hook, 也可補充第二點,對沒的讀屬性的頁面進行讀時可以被捕獲并可以當作惡意訪問。
4.自加載模塊
ring0保護流程:用KD內核修改標簽查看
1.SSDT hook SSDT(System Services Descriptor Table),系統服務描述符表。這個表就是一個把ring3的Win32 API和ring0的內核API聯系起來。SSDT并不僅僅只包含一個龐大的地址索引表,它還包含著一些其它有用的信息,諸如地址索引的基地址、服務函數個數等。
2.SSDT Shadow hook, 對NtUserSendInput進行hook,防止模擬按鍵。
3.Inlin hook,差異分析哪些地址被修改,再通過1)SSDT查看可以處于哪個函數,2)用windbg中的ln 地址顯示 xxxfunction+0xxx
hook從功能上大致可以分為以下幾類:
1.內存訪問:NtWriteVirtualMemory,NtReadVirtualMemory
2.進程操作:KiAttachProcess,NtOpenPreocess 防止打開或掛接
3.線程操作:PsSuspendThread 防止掛起
4.硬件斷點:NtGetContextThread,NtSetContextThread,檢測和下硬件斷點
5.驅動通信:NtDeviceIoControlFile,IopXxxControlFile,保護ring3與ring0的通信
5.時鐘加速:NtQueryPerformanceCounter,防止加速
6.頁面屬性:NtProtectVirtualMemory
7.對象關閉:NtClose,保護關鍵對象不被惡意關閉
繞過這些保護:
1.恢復所有函數;2.在游戲加載之前Hook保護點;3.自加載一份內核。
檢測方法:
外掛行為有:
1.修改游戲代碼,用GameSpider下的cmf比較來定位
2.call游戲函數:非授權訪問,棧回塑
3.修改游戲關鍵數據 ?Call函數可能最終也是修改某些成員。
GameSpider
kernel Detective
1.定位ring0驅動級保護模塊可以用KD比較游戲啟動前后差異。
2.定位ring3可以hook低層接口再棧回塑。(游戲可以自加載同一模塊的另一份來用,此時hook無效)
3.保護模塊可能hook系統原生dll接口來保護,此時可以比較原生dll文件與加載到內存的映像來定位哪些被HOOK。
為防止被保護模塊檢測,在分析時可以把除當前線程所有線程掛起。
GameSpider下 cmf ntdll.dll可查看PE文件與映像文件的差異
ntdll.dll中的DbgBreakPoint,DbgUiRemoteBreakin,ZwProtectVirtualMemory常被ret,轉移,Hook.分別阻止軟中斷,遠程軟中斷,修改頁面保護屬性
GameSpider下ssl查詢自加載模塊
有三種方法定位其他模塊的自加載情況:
1.比較所有模塊的導出函數列表及導出函數名稱是否一致。 比較精確,但游戲會對對關鍵內存塊(代碼與導出表信息)設置不允許讀,只許執行。
2.比較所有模塊的第一個導出函數名稱與導出函數個數是否一致。
3.比較所有模塊的加載名字和導出表中的名字是否一致。
保護方案:ring3保護方案和ring0保護方案
ring3保護流程:
1.Inline Hook ntdll.dll中與調試相關的接口DbgBreakPoint,DbgUiRemoteBreakin,如果沒有代碼還原檢測,直接還原。
2.Inline Hook ntdll.dll中與頁面保護相關的接口ZwProtectVirtualMemory,如果沒有代碼還原檢測,直接還原。
3.設置VEH.可以不用修改代碼來hook, 也可補充第二點,對沒的讀屬性的頁面進行讀時可以被捕獲并可以當作惡意訪問。
4.自加載模塊
ring0保護流程:用KD內核修改標簽查看
1.SSDT hook SSDT(System Services Descriptor Table),系統服務描述符表。這個表就是一個把ring3的Win32 API和ring0的內核API聯系起來。SSDT并不僅僅只包含一個龐大的地址索引表,它還包含著一些其它有用的信息,諸如地址索引的基地址、服務函數個數等。
2.SSDT Shadow hook, 對NtUserSendInput進行hook,防止模擬按鍵。
3.Inlin hook,差異分析哪些地址被修改,再通過1)SSDT查看可以處于哪個函數,2)用windbg中的ln 地址顯示 xxxfunction+0xxx
hook從功能上大致可以分為以下幾類:
1.內存訪問:NtWriteVirtualMemory,NtReadVirtualMemory
2.進程操作:KiAttachProcess,NtOpenPreocess 防止打開或掛接
3.線程操作:PsSuspendThread 防止掛起
4.硬件斷點:NtGetContextThread,NtSetContextThread,檢測和下硬件斷點
5.驅動通信:NtDeviceIoControlFile,IopXxxControlFile,保護ring3與ring0的通信
5.時鐘加速:NtQueryPerformanceCounter,防止加速
6.頁面屬性:NtProtectVirtualMemory
7.對象關閉:NtClose,保護關鍵對象不被惡意關閉
繞過這些保護:
1.恢復所有函數;2.在游戲加載之前Hook保護點;3.自加載一份內核。
檢測方法:
外掛行為有:
1.修改游戲代碼,用GameSpider下的cmf比較來定位
2.call游戲函數:非授權訪問,棧回塑
3.修改游戲關鍵數據 ?Call函數可能最終也是修改某些成員。
總結
- 上一篇: 页面异常反dump 及 内存访问异常ho
- 下一篇: ASP.NET运行环境配置