:【惨淡通杀之】跳出 bp send 的死循环,浅谈结果与过程

 标题:【惨淡通杀之】跳出 bp send 的死循环,浅谈结果与过程

作者: 混沌 6 BCf:mqP  
联系方式: QQ 1192340019 (避免广告嫌疑,呵呵) (G[ *|6m  
交流群: QQ群:71367967(未满),88823177(满) ~1>.A(,=z  
声明:如果您看了此文,有收获,转载请写明出处,O(∩_∩)O谢谢 70eb]\%  
#6CC3TJ'k  
------------------------------------------------------------淫荡的分割线-------------------------------------------------------------------- .%L?J E  
*tK\R&4,4s  
相信很多热爱搞游戏的朋友,热爱搞调试的朋友,热爱搞逆向的朋友,在逆向调试网络游戏时,都会遇到过这样的经历:设bp send断点,然后在游戏中断下来了,可是Ctrl+F9,返回上一层,无一例外,最后返回到了同一个地方,并且断不一样的封包,得到的结果都是一样,结果就是无数次的看到那个堪称梦魇的地方,为什么每次结果都一样?为什么总是看到那张熟悉而又陌生的面孔?为什么就这样无限的死循环?有没有办法跳出去?去发现新大陆? n6BQk 2l  
1f":HnLRM  
答案是肯定的,有,二期很简单,可能很多人也知道,只是很多人暂时还不想放出来而已。 F;7dt@5;  
V;,{}  
现在,让我们一起逃离那个梦魇之地吧,远离那张魔鬼面孔。 CnG+Mc^  
=5(>q5Z*  
在bp send的基础上,我们断到了send相关内容,len buf flags 等等,具体的我们可以看下send()函数: _s .G  
'a\%L:`  
--------------------------------------------- f7X6fr<  
  #include <winsock.h> TjwBv6h  
  int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags); 7Z-O_h3;)@  
  s:一个用于标识已连接套接口的描述字。 Is{KN!Hw  
  buf:包含待发送数据的缓冲区。    &3TEfvz  
len:缓冲区中数据的长度。 V;:jZpG  
  flags:调用执行方式。 rU2%dkTa  
--------------------------------------------- !>zo _fP  
而我们经常用到的无非就2个参数:len buf。 TwVlg ;  
给 len 设置条件断点,我们可以断下我们想要的那些符合长度的包; M>i9i -dU  
给 buf 设置内存断点,我们可以断下这个buf的组成过程。 g!+| I  
#w\~&0  
我想,当你看到这里的时候,你已经踩在了逃离之路的路面上了。 +KvU$9Ad>  
没错,在数据区域,也就是左下角的内容里面给buf设置内存写入断点,就是你逃离的开始。 /M3Y~l$  
S=e{MI  
具体你可以这样:假设我们 bp send的时候,edx值存放的是buf的地址,那么我们在左下角的命令框里面输入 db edx 回车,当然是在bp send断点被断到的时候回车, *Of4o  
这样,我们就看到了这个封包的buf数据,你会发现,很多前面4个字节,或者前面2个字节相同,是很多包都会出现的,或者不一样功能的包会出现不一样的值。 %|oJ>+  
而 这几个字节就是我们逃离的出口了,给这几个字节设置 内存写入 断点,然后你会发现这时候被断下来的地方跟bp send的断下的地方不一样了,这个时候你就好好判断一下这几个准备要写入的字节,一般在断下来的地方会是这样代码:mov xxxx,al 就是把eax的后面那个字节给他写进来,比如此时 eax = 00123389,那么 al = 89 ,也就是说buf的第一个字节将会是89 ,如果这个字节正好是你所需要断下来封包开头的特征,那么好,跟我一起来操作:F8 单步走(一般情况此时断下的地方应该在系统领空),走几步,你就会发现走到了 游戏领空 ,如 00812345的地方,在这个地方的上一行,正好是个 00812340 ---- call xxxx ,这个时候,你就可以执行到返回(Ctrl+F9)了,然后在觉得可疑的地方下断点,这个返回的过程绝对要比bp send 断下返回的过程精彩得多,然后就是运行,去除一些一直断的断点了…… 后面怎么分析就看你想要什么功能了,此时,你已经成功逃离了梦魇之地,魔鬼面孔已不知何时消失了! b/{t|io{  
or';A'k  
总结: 1M 781  
问:为什么给buf设内存断点就能跳出死循环? & '}/f5s|  
答:因为给buf设内存断点的时候,你断到了组建buf的过程,当你跳出这个过程的时候,那你就找到了组建的开始,也就是功能call执行完后,开始组包 [`rba'  
+(1zH-^.  
问:那为什么bp send会一直都是一样的结果? 8=Z9T<K  
答:因为bp send的时候,断到的是组好包后的结果,所以就看不到过程了,看不到过程的结果就是死循环。 0QOBL'{7)  
#~l(]h@ )  
问:我在返回到 00812340 ---- call xxxx 这些地方然后设断点行不行? 7|[mz> "d  
答:可以,不过你会比较累一点而已,因为此时你断到的地方是组包的过程,你可以继续返回上面几层,比如返回到了 00712345 ---- mov xxx,xxx 之后再设断点,基本上这段代码已经不是组包的过程了。 < VSA  
|]ZYa.+:  
写到这里,让我想起了一句话:人生的精彩就在于奋斗过程!同志们,加油! w$`5g  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值