最近对一个游戏进行了注入并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。
四.计时
2.应使用CreateTimerQueueTimer等函数进行计时。