以下内容转自:http://www.dbgger.com/?id=786
下面以封包截取的代码来说明实现bt功能的原理。其中好些地方我用的也不熟练,复杂了,高手就不用看了。
主要是会影响些速度,尤其是我的本本,开时间长了就死机. 首先分析要中断的位置 上面是发包函数里的部分代码,其中00588F7D位置ecx存储封包数据地址,00588F7C位置esi存储封包大小。 如果在此处将程序中断,并将所需数据读取出来,目的就达到了。 对于变态功能,以空中漫步为例: 修改004617A8处的跳转就可以空中漫步,如果在0046179C处中断,然后修改eax或者ebx的值,
也可以实现相应功能但不需要修改指令(注意跳转过后要记得恢复寄存器的值,隐藏建筑和跳跃飞天也可以这样实现)。 下面是封包截取的实现过程,修改一下即可实现bt功能。 1.CreateProcess或者FindWindow或者完美进程ID(dwW2iProcessId) 2.调试进程DebugActiveProcess(dwW2iProcessId) 3.进入调试循环体等待调试事件产生WaitForDebugEvent(&DebugEv, 10) 4.接收到CREATE_PROCESS_DEBUG_EVENT事件时,对全部线程设立断点。 (我可能复杂了,用CREATE_THRAD_DEBUG_EVENT事件可能简单些,刚会用就不错了呵呵,开始我只在主线程里设置了断点,
死活断不下来) 下面是设置断点的方法,使用GetThreadContext和SetThreadContext函数 对于bt功能,修改寄存器的值,也通过这两个函数来实现。 5.当在所需地址处中断时,来进行我们真正的功能操作,读取数据或者设置数据,同时设置数据改回处的断点。 ReadProcessMemory(hW2iProcess, (void*)Regs.Ecx, buf, len, &len); 6.当在数据改回处中断时,将寄存器值恢复,并设置修改处断点(其实可以一起设置好,但是要占用两个dr寄存器。
dr寄存器一共4个,所以节省下只用一个,这样最多也只可以实现4个中断功能,不知道说清楚没) 7.当完美进程结束时,响应EXIT_PROCESS_DEBUG_EVENT事件,也退出。 注意每次中断时要用ContinueDebugEvent(DebugEv.dwProcessId, DebugEv.dwThreadId, dwContinueStatus)继续。 这就是整个过程,其实修改代码也不一定不防封。个人理解游戏协议分为两大类,封包是其实现,一类是正常的游戏所需数据,
一类是防止外挂的检测协议。(始终要记得,网络游戏,服务器所需的一切数据必是通过网络来传输,必是通过封包来运载。)
如果是检测协议,就回复一个正常结果的检测包,必能防封,所以说脱机挂是最难封的,因为这建立在全部协议破解的基础上。
想当初传神和赤月挂,因为技术上无法封杀,只好派人去抓程序员了。 不修改代码也不一定防封,反调试的技术也很多,具体我还不清楚呵呵。 下面是截包程序的代码: