1. 程式人生 > >linux靜態庫 動態庫 去符號 符號恢復

linux靜態庫 動態庫 去符號 符號恢復

前言

最近遇到了一題去除符號的題目,需要進行符號修復。為此學習了一波,順便補了補其它的一下知識。

準備知識

命名方式:

動態庫libxxx.so.major.minor    .so .dll
靜態庫:libxxx.a                .a .lib

生成動態庫 gcc -shared -o libxxx.so.1.0 hello.o
生成靜態庫 ar cqs libxxx.a hello.o
用於設定動態庫的路徑 export LD_LIBRARY_PATH
用於設定靜態庫的路徑 export LIBRARY_PATH

ldd工具:檢視依賴的動態庫和靜態庫
nm工具:檢視靜態庫和動態庫中的函式名。T類當前庫中定義的,U類表示是被呼叫的,W類表示可能被覆蓋的
strip工具 可以去除程式的符號,縮小程式體積
在linux下gcc預設的編譯選項就是動態庫
ar -r 更新靜態庫
ar -d -v libxxx.a module.o 刪除靜態庫中的某一模組
ar -t libxxx.a 列出靜態庫中包含的模組
ar -s 相當於ranlib,用於更新符號索引表

實驗

首先我自己寫了個簡單的hello程式
這裡寫圖片描述

動態連結

這裡寫圖片描述

這裡寫圖片描述
IDA下檢視
這裡寫圖片描述
使用strip 去除符號
這裡寫圖片描述

靜態連結

gcc -static t.c -o t

使用nm檢視時可以看到大量的輸出。
這裡寫圖片描述
ldd的輸出
這裡寫圖片描述
使用strip去除符號後同動態連結類似。
使用IDA開啟…

恢復符號-FLIRT簽名技術

注意一下相關工具在ida的目錄下,可以找到flirt.zip,解壓出來即可
建議看一下flirt的readme.txt。

Typical scenario of a signature creation is:
    - run a parser and
create pattern (PAT) files - run sigmake and get EXC file with collisions - edit EXC file and resolve collisions - run sigmake again and get SIG file - repeat the above 2 steps till collisions exist - run zipsig and get compressed SIG file

注意一下不同環境下的庫檔案,用來生成PAT檔案的工具時不同的,linux下使用pelf工具生成PTA

plb.exe/plb——OMF庫的解析器(Borland編譯器常用)

pcf.exe/pcf——COFF庫的解析器(微軟編譯器常用)

pelf.exe/pelf—— ELF庫的解析器(許多Unix系統常用)

ppsx.exe/ppsx—— 索尼PlayStation PSX的庫解析器

ptmobj.exe/ptmobj——TriMedia庫的解析器

pomf166.exe/pomf166——Kiel OMF 166物件檔案的解析器

我在嘗試使用pelf生成pat時,一直報錯,我認為是因為libc的版本原因。
這裡寫圖片描述
隨後我在晚上下載了一個低版本的libc.a檔案,可以正常的生成pat檔案。
接下來使用sigmake GCC.pat GCC.sig生成簽名檔案。
這裡寫圖片描述
可以看到有13個衝突,要想成功的生成簽名檔案就必須解決衝突,同時我們還可以看到生成了.exc檔案
這裡寫圖片描述
檢視內容如下圖:
這裡寫圖片描述
可以看到說明,由於某些函式的簽名相同,因此sigmake需要你來決定該如何抉擇。”+”代表應用該函式,”-“代表只在資料庫中新增該函式的註釋,不做處理代表你不想應用任何一個函式。
在解決衝突時需要注意以下幾點:

1. 為最大限度地減少衝突,請刪除排斥檔案開頭的四個註釋行。

2. 最多隻能給衝突函式組中的一函式附加+/-。

3. 如果一個衝突函式組僅包含一個函式,不要在該函式前附加+/-,讓它保持原狀即可。

4. sigmake連續執行失敗會將包括註釋行的資料附加到現有的任何排斥檔案後。再次執行sigmake之前,必須刪除這些附加資料,並更正原始資料(如果這些資料正確,sigmake將不會再次執行失敗)。

修改.exc檔案後重新使用sigmake GCC.pat GCC.sig命令,如果不在報錯,說明sig簽名檔案生成。
將簽名檔案拷貝到IDA的/sig/pc目錄下(這個路徑找了好久,網上很多教程說放在/sig目錄下即可,但是7.0的ida需要放在/sig/pc目錄下才能被正確識別,同時注意flair的版本同ida的版本要對應!)
IDA中使用shift+F5,然後右鍵【Apply new signature…】視窗,選擇生成的sig簽名檔案。
這裡寫圖片描述
最終成功的匹配上了46個func,這是因為用來生成簽名的libc.a版本太低了,而高版本的又生成不了簽名檔案。(我也不知道是不是因為版本的問題)

總結

這篇文章只是基礎的知識。linux就是需要多折騰!

參考文章