逆向平臺Binary Ninja介紹

freakish發表於2018-01-17

逆向平臺Binary Ninja介紹

概述

  • 我們經常會收到這樣的問題,比如:
    1. Binary Ninja比xx軟體好在哪裡呢?
    2. Binary Ninja這個軟體最主要的作用是什麼呢?
  • 對於上面的兩個問題,簡要的回答起來是這樣的:
    1. Binary Ninja相對於其他類似軟體來說, 能夠更快、更便捷的修改二進位制檔案
    2. Binary Ninja最主要的作用是提供了一個可供操作二進位制檔案的平臺,你甚至還可以在平臺的基礎上基於API來編寫更方便的指令碼和外掛
  • 那麼我們為什麼要修改現有的二進位制檔案呢?總結起來大致有一下幾種情況:
    1. 無需長時間的等待編譯完畢,可以快速的測試修改結果
    2. 對程式進行黑盒評測
    3. 維護或者升級老程式(一般是沒有原始碼對情況)
    4. 透過修改二進位制檔案學習現有的一個軟體系統或者修復軟體問題
    5. 修復第三方庫的安全問題
    6. 反混淆
  • 在Binary Ninja這個平臺上,提供了許多的方式來修改二進位制檔案,大致可以分為低階和高階模式兩種, 其中低階模式主要就是原始碼的十六進位制編輯和彙編模式, 高階模式可以使用內建的C編譯器直接書寫C程式碼來進行操作。

HEX編輯模式

  • 先來一睹為快,大致操作介面如下:
  • 這個是最直觀的修改方式,也是最簡易的一種修改方式。如上圖所示,可以透過右下角的選單按鈕或者熱鍵H開啟(^ + H),這裡要注意一下,這裡介紹的熱鍵如果沒有效果,可以去參考 使用者文件.
  • 這種編輯模式下,可以一邊修改,一邊實時的看修改結果,從而到達比較高的修改測試效率,一次修改過程大致的操作步驟如下:
    1. 先在圖形檢視或者線性彙編試圖中找一個準備修改的函式
    2. 使用選單 view -> Split進行一次螢幕檢視拆分
    3. 現在可以隨意調整拆分的檢視,看著舒服就行,把其中一個檢視切換到hex編輯模式,並修改一下上面選定的函式。你這邊修改,另一個檢視中就會看到同步的修改結果展示,一般情況下,如果修改一個比較大的函式的時候,操作反應可能會慢一點。編輯器也支援大塊的複製貼上操作。

結構體實時修改

  • 這個實時預覽功能說起來比反彙編位元組碼有用多了, 這裡給出一個實時修改結構體並檢視結構體解碼結果的的演示影片:
  • 這裡本來是一段演示影片,但是是youtube的影片源,沒有辦法觀看,請在原文連結中翻牆觀看(sorry),影片地址是:http://www.youtube.com/embed/sCKiG_xdNSc

點兩下滑鼠就搞定

  • 上面介紹的方法,需要你對二進位制的內容甚至是系統架構有所瞭解,對於大多人來說可能還有點困難,但是在Binary Ninja這個平臺上,你甚至不必瞭解那麼多的知識也可以透過平臺來完成二進位制檔案的修改工作。比如,專有的 右鍵修改選單,有了這個選單的幫助,你只需要點兩下滑鼠就可以了:
  • 這個彈出選單裡面有不少專門用來修改條件分支跳轉的功能,透過這些選項你可以強制性的把一個條件分支改成 永遠跳轉或者永不跳轉。使用 Invert Brach功能,可以進行條件反轉,這些功能使用起來很簡單命令,但是確實能很方便快速的實現你想要的結果。
  • 還有其他的一些有用的功能,比如把一些彙編指令給Nop掉,也就是說,你選中一條指令,然後用這個功能來進行Nop指令替換,這裡系統還會自動的進行剩餘空間填充,比如原先的指令佔4個直接,你直接把這條指令給Nop呼叫,那麼剩下的3個位元組系統會自動的給你也填充成Nop指令,這個功能對於那種變長指令系統還是很實用的。
  • 這裡需要注意的一點是, 如果你把滑鼠放到一個條件分支上,這個時候選單裡面可能沒有 Convert to NOP這個選項,因為和 as Never功能是一樣的,軟體顯示一個就夠了。

單行編輯

  • Patch這個選單中,還有一些隱藏的選單項,比如單行編輯功能。使用單行編輯功能,你可以快速的以彙編形式修改單行指令。選擇一條需要修改的指令,按快捷鍵e或者使用右鍵選單Patch/Edit current line選項,然後就可以看到選中那條彙編指令就變成了可編輯狀態,編輯完成之後按回車即可,Binary Ninja會自動把修改結果應用到二進位制檔案中去。
  • 如果編輯彙編的時候,新指令比原先的指令長度小的話,工具會自動填充餘下的空間為NOP指令,比如在 x86 x64這些變長指令系統上。
  • 附加說明:工具會盡最大努力保證彙編和反彙編的正確性, 如果遇到指令錯誤或者不支援的指令,可以聯絡我們,把這些特殊的情況跟我們溝通一下

In-Depth彙編

  • 這種方式可以簡單的理解為多行彙編的操作入口,操作路徑是:
  • 目前,對於非x86/x64平臺使用我們自定義的LLVM進行彙編,x86/x64使用yasm引擎

居然還可以直接用C語言?

  • Binary Ninja平臺上的秘密武器,Shellcode Compiler算是一個,我們簡稱它為SCC, SCC是一個迷你C編譯器,目前這個編譯器支援多種系統平臺架構,這個小編譯器在編寫小型可注入程式碼(一般認為是那種位置無關的程式碼)或者小範圍修改程式碼的時候很有用,在這些場景下用這個編譯器來寫程式碼比寫彙編方便多了。
  • SCC是一個自定義的從零開始構建的C編譯器,目前支援 MacOS, Windows, Linux 和 FreeBSD這些系統,CPU架構支援 x86,x86_x64, PPC32, MIPS32, ARM(不包含Thumb)以及quark(一種自定義的CPU架構)。SCC在編譯的時候會保留函式的原型, 然後會對編譯的結果進行基礎塊打亂和函式內暫存器隨機打亂來模糊函式原型,同時也會加入一些anti反彙編的位元組(注:不確定這麼理解對不對,這裡給出原文:SCC can generate code with signature and analysis evasions built in. It will randomize placement of basic blocks and randomize its register allocator to evade naive signatures. It will also add anti-disassembly sequences.)
  • 在Windows是平臺上,Binary Ninja顯示出了更高的工作效率。比如這樣一個場景,如果你想在編譯器中編寫一些程式碼,程式碼中需要使用到一些API函式,如果用匯編,你就要知道函式的地址然後才能去呼叫,但是Windows系統版本不同的話,這個API地址又是不固定的,所以會很煩。但是現在又了這個C編譯器就不一樣了,你直接呼叫API就可以了, 編譯器會自動給你解決符號問題,比如你可以像下面這樣寫程式碼:
  • 你看,不需要任何定義,你就可以直接使用MessageBoxA. 具體可以呼叫的所有內建函式,詳細可以看這個列表, 對於不在這個列表裡面的函式,只需要模仿ShellExecute函式在上面宣告一下就可以使用了。
  • 毫無疑問,SCC這個功能使用起來那是相當的讓人震撼(譯者注:感覺也沒多牛逼),比手工彙編方便太多了,另外還有一些屬性可以自己挖掘下。由於這個C編譯器本來的設計目的是用來寫小型的shellcode用的,因此很多常規編譯器的功能還沒有,下面展示一下配置介面選項:

不足之處

  • 對於目前的Binary Ninja版本來說,有2個需要提高的地方:

    1. 智慧Patch機制
    2. 編譯器和彙編器 對符號/庫 的上下文資訊感知
  • 這裡所說的智慧Patch機制實際上是說,當你使用一大段Patch程式碼的時候,不需要去擔心這麼一大段程式碼會不會把其他的程式碼給覆蓋掉, 而是工具內部應該提供一種機制,在老程式碼和Patch程式碼之間使用一種程式碼橋接機制, 就是老程式碼先跳到程式碼橋,再跳到你的大段Patch程式碼,甚至,智慧機制還能夠實現多個segment的修改。目前 BNHook 已經實現了一部分上述特性, 關心的話可以去看看。

  • 如果能能夠感知二進位制檔案中的型別資訊和符號資訊,那麼編譯器和彙編器的能力又會大大的提升,因為有了這些資訊, 在寫程式碼的時候就有大量的符號資訊可以直接在程式碼中使用,而不用像以前那樣寫死地址資訊了。擁有這樣高階特性的的編譯器和彙編器我們還沒開發出來,但是請繼續關注我們,Binary Ninja說不定哪天就支援了。

儲存修改

  • 在Binary Ninja可以儲存兩部分內容:
    1. Binary Ninja對開啟的檔案等分析結果,還包括你的修改,註釋資訊等,你可以儲存成分析資料庫(注:就像IDA裡面的 .idb),操作路徑是 File/Save Analysis Database, 這個把上述資訊儲存到一個字尾是 .bndb的sqlite資料庫裡面(自定義修改過的sqlite資料庫)
    2. 另一個就是儲存修改到原始的檔案,操作路徑是 File/Save Contents

綜述

  • Binary Ninja對於經常需要修改二進位制檔案的人來說卻是是一個不錯的選擇,既有快速方便的UI操作介面,還有內建強大的C編譯引擎的支撐。歡迎大家給我們留言或者加入slack或者其他的方式和我們聯絡。

譯者

相關文章