2011-12-27 5 views
0

У меня есть программа, как этотзаплат с IDA Pro

#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)); 
} 

Я пытаюсь подключая его заменить вызов функции Сомма с функцией дифференциала. В E8 79 FF FF FF и функция diff имеет op E8 70 FF FF FF, поэтому я попытался сделать так: заменить op функции somma на diff. Поэтому моя сомма op becames E8 70 FF FF FF, но когда я пытаюсь ее выполнить, я получаю ошибку сегментации. Зачем? Какая у меня ошибка?

EDIT Это экран моей работы.

ответ

1

Вы не можете просто заменить смещение чем-то другим в каком-либо другом месте, чтобы заменить то, что он вызывает. Что вам нужно сделать, это рассчитать относительный смещение от смещения вызывающего абонента к смещению функции:destination - source - 5. Так, например, если место опкода где вы называете somma является 0x348232, и расположение somma является 0x858232, так что относительное смещение будет 0x858232-0x348232-5 = 0x50FFFB, и вы должны заменить оригинальные байты с E8 FB FF 50 00

+0

Спасибо за вашу помощь. Я отредактировал свой ответ с экрана моей работы! Можете ли вы показать мне, где я могу найти расположение оп и местоположение somma? Я не могу найти его! –

+0

Местоположение @UsiUsi somma может быть рассчитано как FFFFFF70 = x - 1F1B - 5, а x равно 0x1E90. – JosephH

+0

ОК! поэтому, если я понимаю, что FFFFFF70 (litte endian) является OP, 1F1B - это позиция в тексте. А что такое 0x1E90 ??? почему я должен подчинить 5? вы можете мне объяснить? спасибо –

Смежные вопросы