将原来的94000000(无边框窗口)改为94CF0000即可
去掉设置分辨率为800*600
patch crossfirebase.dll 10001120位置的函数(如果是游戏内的地址就是1F1120)
伪C代码:
重点是这里有2次改分辨率,应该是探测了一次能否改为原分辨率,能改就改成800*600
第二次改分辨率不直观,代码先把改分辨率函数的地址扔给了寄存器(伪C代码识别成了把函数指针扔给临时变量),再调寄存器的函数,不过调试器的提示会帮还
原。
找到对应反汇编:
NOP填充即可
去掉失焦时不渲染
patch crossfire.exe的监听事件的窗口过程函数62D4F0
伪C代码:
看这个调试日志就知道,失去焦点时候会暂停掉游戏渲染引擎,直接干掉if块里所有函数调用就行,先找到汇编:
这里690954就是日志内容的常量位置,继续寻找上下文,因为if块里的内容是从两次赋值开始,一次函数指针调用结束,往上往下找到这些汇编,用nop填充即可:
去掉鼠标基于屏幕坐标锁定,改为基于游戏窗口左上角坐标锁定,patch crossfire.exe的事件循环函数62F7A0
伪C代码:
GetWindowRect()获取游戏窗口4个点,然后SetCursorPos()锁在屏幕左上角+游戏宽高/2的地方
对应汇编:
找到对应汇编,GetWindowRect调用结束后,EBP+偏移的这四个栈上地址分别是窗口的左上角、右下角的x y坐标位置。
这里直接改成这样(注意,把sub改成mov之后,后面的修改不能用逐行汇编,需要先选中原来的cdq、sub、sar三个语句,然后直接按汇编的注释改16进制):
就可以强制把鼠标锁在窗口左上角+横向右移400,纵向下移300的地方,这样只是默认分辨率下锁在中间其实只要距离边框够远就不会被甩出去,所以也懒得想怎么算中点了(可能字节数也不够)