使用ida pro做反编译时,要注意类型转换

2008-07-03 10:38:59 来源:中国自学编程网 作者:佚名 点击:
反编译器常常在反编译的时候做一些假设,想调用call常常返回,内存模式是flat,函数框架被正确设置等。当这些假设是正确的,输出代码是正确的。当假设是错误的话,那么得到的代码就和真实的代码不一定一致

 
  反编译器常常在反编译的时候做一些假设,想调用 call 常常返回,内存模式是 flat ,函数框架被正确设置等。当这些假设是正确的,输出代码是正确的。当假设是错误的话,那么得到的代码就和真实的代码不一定一致。来看个例子,

使用反编译器得到如下伪码。

显然,变量 v3 (相当于 edx )根本没有被初始化,为什么?

 
  发生这样的时候,是因为被调用函数常常破坏寄存器的值。在 x86 约定中,只有 esi edi ebx ebp 可以跨越 call 保存。换句话说,其他的寄存器可以通过一个函数调用改变它们的值。因此,反编译器假定函数遵守调用约定,它在函数调用前和函数调用后,把 edx 识别成两个变量。第一个变量被优化成 a1 ,第二个变量 v3 成了未初始化的。

实际上 edx 有以下三种可能。

  1. 未修改
  2. 用来返回一个值
  3. 被毁坏
 
  通过被调用的函数,反编译器选择了第三种情况。来我们来看看如果是对的,会出现什么

 
  正如我们看到, edx 寄存器根本没有被引用。于是我们发现是第一种情况。
 
  As we see, the edx register is not referenced at all, so we have the case #1. If the decompiler could find it out itself, without our help, our life would be much easier (maybe it will do so in the future!) Meanwhile, we have to add the required information ourselves. We do it using the Edit, Functions, Set function type command in IDA. The callee does not spoil any registers:

反编译器产生不同的伪码

因此,我们知道 edx 并没有通过 call 被修改。它不过是在调用前后建立了两个实例。

通过调用函数利用 edx 返回值。我们如下操作设置类型

上面表达式的意识是,函数带有一个参数,参数被调用者压栈,并把结果返回给 edx

在第三种情况下,反编译器为 edx 建立两个不同的变量,第一个被优化掉,第二个被用来放返回值。

正如我们看到的,类型信息在反编译器中扮演了一个很重要的角色。为了得到一个正确的代码,我们要特别注意类型。



logo

相关文章:

相关软件:

    无相关新闻

本类最新行业评测技巧教程学院
本类热点本日本周本月
本类推荐本日本周本月

广告联系 | 版权说明 | 意见建议 | 加入收藏 | 军网站群 [ 军软件园 - 军软件商城 - 军软件园论坛 ]

电信与信息服务业务经营许可证:京ICP证050203