C 使用ida pro进行修补

C 使用ida pro进行修补,c,reverse-engineering,opcode,patch,ida,C,Reverse Engineering,Opcode,Patch,Ida,我有一个这样的程序 #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)); } #包括 int-somma(x,y){ 返回x+y;

我有一个这样的程序

#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));
}
#包括
int-somma(x,y){
返回x+y;
}
内差(x,y){
返回x-y;
}
int main(){
int x=5;
int y=4;
printf(“somma e“%d”,somma(x,y));
printf(“差异性e“%d”,差异(x,y));
}
我试图修补它,用diff函数替换somma函数的调用。 在E8 79 FF FF和diff函数中,op E8 70 FF FF FF,因此我尝试做的是: 将somma函数的op替换为diff。所以我的somma op变成了E8 70 FF FF,但当我尝试执行它时,我收到了一个分段错误。为什么?我的错误是什么

编辑 这是我作品的屏幕。

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

谢谢您的帮助。我用我的工作屏幕编辑了我的答案!你能告诉我在哪里可以找到op和somma的位置吗?我找不到它@UsiUsi somma的位置可以计算为FFFFFF 70=x-1F1B-5,x为0x1E90。ok!因此,如果我理解FFFFFF70(litte endian)是OP,1F1B是文本中的位置。什么是0x1E90???为什么我要分5分?你能给我解释一下吗?thanks@UsiUsi这将是0x1F1B处OP的目标。您需要减去5的原因是程序计数器
eip
在读取offset.mmm时将指向下一个操作码(即原始操作码的地址+指令的大小,在本例中为5),但我无法理解的是。。。我必须替换_difffunct的什么来调用_子函数的ping?