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

全部博文(65)

文章存档

2011年(4)

2010年(1)

2009年(60)

我的朋友

分类:

2009-11-19 15:30:49

作者:重楼
日期:2009-09-04
=========================前言============================

很多时候CALL里的一些数值,都是变化的,或者不同的电脑值也不一样,如何寻找这些值的基址呢?不同的值有不同的找法下面就列出几条常用的方法。




=========================CE搜索===========================

这个方法在我找CALL入门篇一中就有说过而且,很多篇章中都用过这种方法,例子:模拟器 游戏找CALL练习实例ONE


 


这里我们找的是EAX的值,EAX的值 是不同电脑他的值也是不同的。这个我在找CALL篇一中说过。


 



绿色的就是基址了, 如果搜出来没有绿色如何?可以用找血基址的方法找偏移,然后跟踪出他的基址。





============================代码分析========================

从汇编代码中顺藤摸瓜摸出基址,这个也是比较常用的方法。例子:CALL入门篇一
武易打坐

例子:


 


从上面我们要找EAX的值,才能得到CALL的地址,EAX是如何来的呢?这要往上寻找了

首先  我们找到的是 mov eax,[ecx]  这里 把ECX里的值 赋值给EAX  那么EAX的来源就确定了,但这还不是明确的地址,我们继续往上找

然后  到了mov ecx,[4fa818]    这里我们找到了 赋值给ECX的值  ,而且也是 明确的地址。(摸到瓜了)

好了  EAX的值就是  [4fa818]里的值  赋值给ECX  在从[ECX]里的值赋值给EAX

公式  [[4fa818]+0]  (读了2次基址)

============================CALL的返回值========================

如果你寻找某个寄存器的值,苦苦追了3层还追不到,那么你就要注意了,其实这个值可能就在你原来CALL的附近。


详细的请看 CALL提升篇一:剑侠3的喊话CALL分析后部分





==========================子程序参数的跟踪=======================




 



这个是 入门篇三中的模拟器代码, 我们要找EBX的值

从代码上可以很清楚的找到  EBX的值 是 [EBP+8] 中传入的,而EBP  确实从ESP传入,大家都知道ESP是堆栈指针的寄存器,是不断变化的,但如何取到这个值呢?

首先,我们要明白[EBP+*]  这种偏移的含义,  其实我前面也讲到过 这个就是 参数的值


 


这个子程序 被传入 包头 和 数据  2个参数,然后组合。


代码中  [ebp+8] 其实就等于  数据  值,  而[ebp+c]就是 包头的参数值(如果是ebp-*)这种类型 就是  临时变量


从这里我们可以看出,EBX的值 并不是系统里的,而是我们自己应该写入的参数堆栈值,固也无法跟踪了(因为这个值是需要你自己写入的)

这里有朋友可能要问了  如果我要写这个CALL 而不写上面那一层的CALL这里改如何写呢? 其实直接赋值就可以了, 比如说  PUSH [ebx]    这里如果需要传入40这个值 那么直接  PUSH 40便可,  (我在前面几篇中强调过,CALL只要传入适当的参数,便可以调用)这里适当的参数就是这层CALL所需要的参数数据,而不是傻傻的跟上去找原值。

这里 具体的可以看看 提升篇一  文章中后期 对寄存器值的跟踪过程
阅读(1080) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~