使用IDA修补EXE

时间:2010-02-20 06:14:01

标签: overflow buffer patch printf ida

假设有一个包含sprintf()的错误程序,我想将其更改为snprintf,因此它没有缓冲区溢出..我如何在IDA中执行此操作?

1 个答案:

答案 0 :(得分:3)

您真的不想使用来自IDA pro的信息进行此类更改。

虽然IDA的反汇编质量相对较高,但它的质量不高,不足以支持可执行的重写。将调用转换为sprintf到调用snprintf需要将新参数推送到堆栈。这需要引入一条新指令,该指令会影响EA在可执行映像中跟随它的所有内容。更新这些有效地址需要极高质量的反汇编。特别是,您需要能够:

  1. 确定可执行文件中的哪些地址是数据,哪些是代码
  2. 确定哪些指令操作数是符号(地址引用)以及哪些指令操作数是数字。
  3. Ida无法(可靠地)向您提供该信息。此外,如果可执行文件与crt静态链接,则它可能不包含snpritnf,这将使得手动执行重写变得非常困难。

    有一些潜在的解决方法。如果在进行呼叫的功能中(或之后)有足够的填充可用,您可能只能重写单个功能。或者,如果您可以访问目标文件,并且使用/ GY开关编译这些目标文件(假设您使用的是Visual Studio),那么您可以编辑目标文件。但是,编辑目标文件可能仍需要大量修复。

    但是,据推测,如果您有权访问目标文件,则可能还可以访问源文件。改变消息来源可能是你最好的选择。