通过调试寄存器不修改代码实现bt功能

以下内容转自: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)继续。

这就是整个过程,其实修改代码也不一定不防封。个人理解游戏协议分为两大类,封包是其实现,一类是正常的游戏所需数据,
一类是防止外挂的检测协议。(始终要记得,网络游戏,服务器所需的一切数据必是通过网络来传输,必是通过封包来运载。)
如果是检测协议,就回复一个正常结果的检测包,必能防封,所以说脱机挂是最难封的,因为这建立在全部协议破解的基础上。
想当初传神和赤月挂,因为技术上无法封杀,只好派人去抓程序员了。

不修改代码也不一定防封,反调试的技术也很多,具体我还不清楚呵呵。



下面是截包程序的代码:

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值