1
我想象徵顛倒的iOS二進制文件。於是我開始學習的Mach-O格式here並寫了一個基本的程序來測試手工添加一個符號到剝離的二進制的一個簡單的例子(!):Mach-O二進制:修補symtab後未找到外部未定義符號
#include <stdio.h>
#include <stdlib.h>
int division(int a, int b);
int m;
int main(void)
{
int i,j;
printf("initializing i\n");
i = 10;
printf("initializing j\n");
j=1;
printf("i = %d, j = %d\n", i, j);
m = division(i, j);
printf("m = %d/%d = %d\n", i, j, m);
return 0;
}
int division(int a, int b)
{
return a/b;
}
我做了什麼:
- 將源代碼編譯爲ARM,而不進行任何稱爲'helloworld'的優化。
- 剝離了這個'helloworld'程序並將其稱爲'helloworld_stripped'。
- 在MachOView和hexfiend中打開'helloworld_stripped'(編輯它)。
- 另存爲 'helloworld_stripped' 作爲 'helloworld_stripped2'
- 修改字符串表通過添加 '_division' 字符串表的末尾
- 添加在 'helloworld_stripped2' 的符號表中的條目,如下所示:
- 修改了LC_SYMTAB和LC_DYNSYMTAB負荷命令以反映新的字符串表大小,偏移等。以下
otool -l
輸出反映了這一點( 「* * * * *」 被helloworld_stripped和「 - ---」是helloworld_stripped2): - 然後我打開這兩個 'helloworld_stripped' 和 '在IDA親helloworld_stripped2',看看這個:
問題:
打補丁的可執行文件'helloworld_stripped2'缺少printf函數。爲什麼被剝離的可執行文件中的printf函數而不是被修補的可執行文件?我沒有在符號表中更改它,並且字符串表中printf的位置未更改。
任何意見是非常感謝!
編輯:請參閱下面的答案。
問三個問題而不是一個問題 – Chinna