У меня есть исполняемый файл (C ++, i386, скомпилированный под MacOS / X Tiger, если это имеет значение), который содержит ошибку. Исправление этой ошибки простое - в коде есть место, где он вызывает fork (), а этого не должно быть. Поскольку исправление является простым, и поскольку на этом этапе будет трудно перекомпилировать исполняемый файл с нуля (не спрашивайте), я хотел бы просто напрямую исправить исполняемый / двоичный файл.
В качестве первого шага к этому я запустил «otool -tV MyExecutableName» на своем исполняемом файле, и вуаля, я нашел это в выводе дизассемблирования:
./MyExecutableName:
(__TEXT,__text) section
[... many lines omitted ...]
0002ce0d subl $0x10,%esp
0002ce10 calll 0x0051adac
0002ce15 movzbl 0x14(%ebp),%esi
0002ce19 calll 0x00850ac9 ; symbol stub for: _fork
0002ce1e cmpl $0x00,%eax
0002ce21 jll 0x0002cf02
0002ce27 jle 0x0002ce34
[... many more lines omitted ...]
Итак, я хотел бы заменить код операции в строке 0002ce19, чтобы вместо вызова _fork он просто безоговорочно переходил к случаю сбоя (т.е. он должен действовать так, как будто fork () вернул -1). )
К сожалению, я полный новичок в разборке / патчинге двоичных файлов, поэтому я не уверен, как это сделать. В частности, мои вопросы:
1) Какие байты я должен записать в местоположения с 0002ce19 по 0002xe1d, чтобы получить то, что я хочу? Я предполагаю, что это будет собранный эквивалент "jmp 0x0002cf02", но как мне выяснить, что это за байты?
2) Смещения, напечатанные с помощью "otool -tV", по-видимому, являются смещениями в сегменте __TEXT исполняемого файла. Как определить дельта байта между напечатанными смещениями и верхней частью файла, чтобы можно было редактировать / исправлять правильные байты в файле?
Спасибо за любой совет, который вы можете дать!