Chinaunix首页 | 论坛 | 博客
  • 博客访问: 248606
  • 博文数量: 65
  • 博客积分: 2758
  • 博客等级: 少校
  • 技术积分: 725
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-25 00:23
文章分类

全部博文(65)

文章存档

2011年(4)

2010年(1)

2009年(60)

我的朋友

分类:

2009-11-19 15:34:15

作者:重楼
日期:2009-09-05

在刚开始找CALL的时候,绝大部分的时间都是在重新打开游戏和出错中度过,这个可能绝大部分朋友都有这个感受~CALL为何会出错?今天我们就来分析下出错的原因


目标:F8找CALL02
目的:分析各种CALL的错误


弄过F8找CALL模拟器的朋友都知道 F8CALL02是一个喊话模拟的模拟器,而且只能注入才能正确调用远程调用的话就会出错,今天我们来分析下到底错在哪里.




============================分析开始=======================

CALL 我就不找了,大家可以看配套视频,在断点社区精华区可以下载.



 


这里就是F8 CALL 02的 喊话功能CALL的地方



 


这是运行到CALL时候 堆栈中的值...

这里很多朋友都不明白为何只要写一个CALL就可以实现喊话,我之前说过,我们只需要给CALL他想要的参数.

这里的堆栈分别压入了  基址  喊话内容  喊话模式  喊话对象
这个就是参数而且也没做什么处理,所以我们只要给他 想要的参数 按照顺序就可以了.

这里正确的写法 我就不说了,我们主要来调试下错误的信息.



 

这里其实需要处理堆栈平衡,我们先不写,来分析下堆栈不平衡为何会出错,好了 这里没有加上 堆栈平衡,图中是出错的信息.我们在CALL内部第一行下断


 

运行代码注入器调用CALL后就会断下来,.


*这里为何会断在这里而不断在 CALL地址呢?因为,我们写一个CALL *****  其实就是 从*****这个地址开始运行的,却不是从游戏调用这个CALL的代码开始. 这里弄多了你就会明白,你写一个CALL其实在模拟 游戏调用CALL的那部分.



 


我们来按 F8  一直执行......一直到图中的位置才出错.出错信息跟刚刚是一样的




 


*45d000  一般是 程序的代码段开始部分,而图中 参数的存放是 ebp-8 已经超过了代码段的范围了,所以我们这里就会出现无法读内存的错误.

解决方法:这里 我们把存放内容的地址 弄后面一点便可以了



 


好了 我们继续往下单步运行(F8)





 




好了 运行到这里又出错了~~重新运行吧~





 



 

我们到了上面那个地址出错~而EAX的值 就是我们出错的信息地址,从调试窗口看到 EAX的值 是 ???




我们来看看 用模拟器自身的喊话,这里 是如何一个过程





 



图中对比了  使用自身 喊话 和 代码注入器 的调用情况  .如果这个时候 我们把ECX改成8呢?




 

好了,这里已经解决了第二个问题, 又出现第三个问题 .

这个时候我们发现  错误信息中 有出错代码的地址.我们跳过去看看



 

这里又有一处 内存无法读出 , 这里的值是 指向 270这个地址 (前面部分处理按照上面的来)

错误找到了 我们重新 再来一次 这次停到 错误代码地址前面  (第二个错误依旧按照上面的处理来)




 


我们来看看 正常情况下的寄存器值


 

这里 我们用模拟器 能成功的读取到地址.


我们来跟踪一下这个值是如何产生的



 


这里 我们从头部开始找....




 


头部的值还是 跟上面一样 所以我们返回一层看看.


 


463cc4 就是 EBX的基址.

我们把代码注入器的代码 改一下




 





 


好了 运行到原来出错的地方 发现现在已经能正常读取内存地址了,又解决一个错误(到第二步的地方仍然需要手动解决)

我们继续运行,发现卡在了下面那个CALL那里  按运行 或点 程序都没反应,  这个时候我们只要在调用一次CALL就可以了.
我们继续运行 到上面这里然后按F8 ,发现又一个错误...





 

这里的代码段是从45d000 开始的 而 图中却是  4030a7  这里我们也没办法跳过去调试了. 


好了 今天我们的调试错误信息就到这里了,虽然最终没有解决这个问题,但也获得不少收获~
阅读(1617) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~