2013-11-27 57 views
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; 
} 

我做了什麼:

  1. 將源代碼編譯爲ARM,而不進行任何稱爲'helloworld'的優化。
  2. 剝離了這個'helloworld'程序並將其稱爲'helloworld_stripped'。
  3. 在MachOView和hexfiend中打開'helloworld_stripped'(編輯它)。
  4. 另存爲 'helloworld_stripped' 作爲 'helloworld_stripped2'
  5. 修改字符串表通過添加 '_division' 字符串表的末尾

Modifying string table by adding division in red

  • 添加在 'helloworld_stripped2' 的符號表中的條目,如下所示:
  • Adding the division symbol in the symtab

  • 修改了LC_SYMTAB和LC_DYNSYMTAB負荷命令以反映新的字符串表大小,偏移等。以下otool -l輸出反映了這一點( 「* * * * *」 被helloworld_stripped和「 - ---」是helloworld_stripped2): <code>otool -l</code> - load commands changed
  • 然後我打開這兩個 'helloworld_stripped' 和 '在IDA親helloworld_stripped2',看看這個:
  • Problem

    問題:

    打補丁的可執行文件'helloworld_stripped2'缺少printf函數。爲什麼被剝離的可執行文件中的printf函數而不是被修補的可執行文件?我沒有在符號表中更改它,並且字符串表中printf的位置未更改。

    任何意見是非常感謝!

    編輯:請參閱下面的答案。

    +0

    問三個問題而不是一個問題 – Chinna

    回答

    0

    好吧,基本上,我自己發現了這個問題:我忘了用新的符號表條目值更新間接符號表。當我更新它時,IDA pro能夠顯示_division和_printf。

    enter image description here

    盤旋的值對應於在符號表中的項的索引。由於符號表被更新,間接索引(例如printf)符號改變。所以動態符號表必須被修改以反映它們的新的入口索引。希望它能幫助那裏的人。

    相關問題