【问题标题】:Patching with ida pro用 ida pro 打补丁
【发布时间】:2012-01-28 05:47:22
【问题描述】:

我有一个这样的程序

#include <stdio.h>

int somma(x,y){
  return x+y;
}

int diff(x,y){
  return x-y;
}



int main(){
  int x=5;
  int y=4;
  printf("la somma e' %d", somma(x,y));
  printf("La differenza e' %d", diff(x,y));
}

我正在尝试修补它以用 diff 函数替换 somma 函数的调用。 在 E8 79 FF FF FF 和 diff 函数有 op E8 70 FF FF FF 所以我试图做的是: 将 somma 函数的 op 替换为 diff 函数。所以我的 somma op 变成了 E8 70 FF FF FF 但是当我尝试执行它时,我收到了一个分段错误。为什么?我的错误是什么?

编辑 这是我工作的屏幕。

【问题讨论】:

    标签: c reverse-engineering opcode patch ida


    【解决方案1】:

    您不能简单地将偏移量替换为其他地方的其他内容来替换它所调用的内容。您需要做的是计算从调用者偏移量到函数偏移量的相对偏移量:destination - source - 5。因此,例如,如果您调用somma 的操作码的位置是0x348232,而somma 的位置是0x858232,那么相对偏移量将是0x858232-0x348232-5 = 0x50FFFB,那么您就有用E8 FB FF 50 00替换原始字节

    【讨论】:

    • 感谢您的帮助。我用我的工作屏幕编辑了我的答案!你能告诉我在哪里可以找到手术的位置和索玛的位置吗?我找不到!
    • @UsiUsi somma 的位置可以计算为 FFFFFF70 = x - 1F1B - 5,x 为 0x1E90。
    • 好的!所以如果我理解 FFFFFF70 (litte endian) 是 OP,1F1B 是文本中的位置。什么是0x1E90???为什么我必须分5?你能解释一下吗?谢谢
    • @UsiUsi 将成为 0x1F1B 处 OP 的目标。您需要减去 5 的原因是程序计数器 eip 将指向下一个操作码(这将是原始操作码的地址 + 指令的大小,在本例中为 5)读取偏移量的时间。
    • 嗯,但我无法理解的是......我必须替换 _diff 函数才能调用 _sub 函数的 ping?
    猜你喜欢
    • 2010-11-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多