安卓逆向學習筆記 (3)- 使用IDA Pro靜態分析so檔案
安卓應用程式的開發語言是java,但是由於java層的程式碼很容易被反編譯,而反編譯c/c++程式的難度比較大,所以現在很多安卓應用程式的核心部分都使用NDK進行開發。關於NDK的開發知識點,請看這篇部落格:Android之NDK開發。
使用NDK開發能夠編譯c/c++程式,最終生成so檔案。而so檔案是一個二進位制檔案,我們是無法直接分析so檔案的,所以這裡需要用到一個反編譯工具IDA Pro。IDA Pro能夠對so檔案進行反彙編,從而將二進位制程式碼轉化為組合語言,利用IDA Pro神奇的F5功能還能將組合語言反編譯成c/c++程式。這裡使用的IDA Pro的版本為6.5版本。下面就介紹一下如何利用IDA Pro靜態分析so檔案的步驟:
(0) 開啟IDA Pro,將libTestJniSo.so直接拖入到IDA Pro中,在彈出的”load a new file”視窗中,
選擇”ELF for ARM(Shared object)[elf.ldw]”選項,然後再點選ok按鈕。如圖1所示:
圖1 使用IDA Pro載入so檔案
等待一段時間後,我們就能看到反彙編libTestJniSo.so檔案所得到的彙編程式碼了。
(1) 這裡我們主要介紹幾個主要視窗,其中IDA View-A視窗顯示彙編程式碼;Hex View-A視窗顯示機器碼(16進位制格式);Function window視窗中儲存著各個函式的名字,找到對應函式名字,再雙擊即可定位到對應函式的彙編程式碼。
例如我們想要檢視Java_com_example_testjniso_MainActivity_helloFromJni函式的彙編程式碼,
只需在Function window視窗中找到Java_com_example_testjniso_MainActivity_helloFromJni函式再雙擊即可。如圖2所示:
圖2 定位函式
如果想要檢視某條指令的16進位制程式碼,只需要單擊該指令,再切換到Hex View-A視窗即可。
(2)如果IDA Pro帶有F5外掛,那麼我們可以按鍵盤上的F5,就可以將彙編程式碼轉換為C程式碼。例如我們想要檢視forTest0函式的C程式碼,我們只需要定位到forTest0函式的彙編程式碼後,再按F5就會生成一個Pseudocode視窗,該視窗就會顯示forTest0函式的C程式碼,如圖3所示:
圖3 反編譯檢視forTest0函式對應的C程式碼
(3)我們一般是在Text View模式中檢視彙編程式碼,這樣很難看出程式的設計流程。另外IDA Pro還提供了一個Graph View,能夠幫助我們更好地檢視程式碼的設計流程。只需要在對應的函式處右擊再點選”Graph View”即可切換到Graph View模式,forTest0函式的Graph View如圖4所示:
圖4 forTest0函式對應的Graph View
從圖4可以看出,BLE loc_E42這條語句後面跟了兩個箭頭,其中綠色箭頭表示當 BLE loc_E42 條件成立後所跳轉到的地方,紅色箭頭表示當條件不成立後所跳轉到的地方。如果想要切換到Text View模式,則只需在對應函式處右擊再點選“Text View”即可。
本文簡單介紹瞭如何通過IDA Pro靜態分析so檔案,從而檢視對應的彙編程式碼。另外需要注意的是IDA Pro只能檢視彙編程式碼,不能修改彙編指令對應的機器碼。如果想要修改so檔案,需要使用UltraEdit等二進位制編輯軟體。逆向分析so檔案,需要熟練掌握ARM組合語言。這裡有一篇介紹ARM組合語言的部落格ARM彙編程式設計基礎(一)
-- ARM CPU暫存器,有興趣的同學可以看看。
本文資源下載地址:安卓逆向學習筆記(3)
相關推薦
安卓逆向學習筆記 (3)- 使用IDA Pro靜態分析so檔案
安卓應用程式的開發語言是java,但是由於java層的程式碼很容易被反編譯,而反編譯c/c++程式的難度比較大,所以現在很多安卓應用程式的核心部分都使用NDK進行開發。關於NDK的開發知識點,請看這篇部落格:Android之NDK開發。 使
安卓逆向學習筆記(0)- HelloWorld.apk的檔案結構
META-INF資料夾存放著apk的簽名信息。如果你還不瞭解安卓簽名機制,請看這篇文章:[014] Android應用程式簽名詳解 開啟META-INF資料夾,可以看到3個檔案:CERT.RSA,CERT.SF,MANIFEST.MF。其中CERT.RSA包含了公鑰資訊和釋出機
安卓開發學習筆記(二):Android Stuidio無法引用Intent來創建對象,出現cannot resolve xxx
編譯器 port stact 消失 click first 紅色 xxx font 筆者在進行安卓開發時,發現自己的代碼語法完全沒有問題。尤其是創建intent對象的時候,語法完全是正確的,但是Android Stuidio卻顯示報錯,Intent類顯示為紅色,如圖所示:
安卓開發學習筆記(一):如何用Android Stuidio匯出apk檔案?
一,首先,我們在選單欄上找到這一欄: 然後點選build,再點選generate apk,然後出現以下介面: 由於之前我們並沒有進行apk檔案的生成,因此需要這個apk key做一個驗證,以防您的app上線之後被別人盜用,同時證明自己對這個app的擁有權。key store path就是您app key所
安卓開發學習筆記(四):Android Stuidio無法實現隱式Intent是為什麼?
1 package com.example.lenovo.activitytest; 2 3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.view
安卓開發學習筆記(五):史上最簡單且華麗地實現Android Stutio當中Webview控制元件https/http協議的方法
一.我們先在XML當中自定義一個webview(Second_layout.xml) 程式碼如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.an
安卓使用記錄筆記(3)Android studio 使用openMP
這個是個小坑,在studio較高版本時,更多的是使用clang編譯,而openMP更多的依賴c或者c++中一些特有的庫,忘記叫啥了,這裡就要改成c++編譯。。所以在匯入時,在gradle中修改一下: android{ ... defaultConfig{ ...
安卓開發學習筆記(七):仿寫騰訊QQ登入註冊介面
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_
機器學習筆記(3)——使用聚類分析演算法對文字分類(分類數k未知)
聚類分析是一種無監督機器學習(訓練樣本的標記資訊是未知的)演算法,它的目標是將相似的物件歸到同一個簇中,將不相似的物件歸到不同的簇中。如果要使用聚類分析演算法對一堆文字分類,關鍵要解決這幾個問題: 如何衡量兩個物件是否相似 演算法的效能怎麼度量 如何確定分類的個數或聚類
c&c++反彙編與逆向分析學習筆記(2)--反彙編靜態分析工具IDA
所謂“靜態分析”,是相對於前面提到的“動態分析”而言的。在“動態分析”過程中,偵錯程式載入程式,並以除錯模式執行起來,分析者可以在程式的執行過程中觀察程式的執行流程和計算記過。但是,在實際分析中,很多場合不方便執行目標,比如軟體的某一模組(無法單獨執行)、病
TCP/IP詳解學習筆記(3)IP協議ARP協議和RARP協議
out 處理機 傳輸 包含 發送 res 這也 進行 默認 把這三個協議放到一起學習是因為這三個協議處於同一層,ARP協議用來找到目標主機的Ethernet網卡Mac地址,IP則承載要發送的消息。數據鏈路層可以從ARP得到數據的傳送信息,而從IP得到要傳輸的數據信息。
spring學習筆記(3)——bean配置細節註意
collect 1.5 之前 ice ble person name return 引用 1. 一個bean引用另外一個bean 當Person類中有一個屬性是Car,那麽該如何配置呢 person: package com.zj.spring; public class
QT學習筆記(3) 我的第一個程序
9.png har 中文 gets 有一個 setw 通過 坐標 關系 今天,學習搭建一個空項目,了解程序是如何運行的。 (1)新建一個空項目 1、在創建完空項目之後,項目中只有一個空的項目文件( .pro) 2、然後需要在項目文件(.pro)中添加:
Hibernate學習筆記(3)---hibernate關聯關系映射
gen -m type foreign out eas ner 機制 路徑 一對一關聯 假設有兩個持久化類(實體類)User與Address,它們之間存在一對一的關系 1,通過主鍵關聯(個人偏向另外一種) User.hbm.xml文件配置 <id name="u
C++深度解析教程學習筆記(3)函數的擴展
插入 分享 技術 lsp 預處理器 _for 返回 忽略 結合 1.內聯函數 1.1.常量與宏的回顧 (1)C++中的 const 常量可以替代宏常數定義,如: const int A = 3; //等價於 #define A 3 (2)C++中是否有解決方案,可以用來
安卓工程化開發筆記(1)
測試 商業 軟件開發 界面 計算機 數學 開發流程 str sof 2018.3.8日 一、什麽是軟件工程? 1、軟件工程 是把系統的、有序的、可量化的方法應用到軟件的開發、運營和維護上的過程。 2、軟件工程包括下列領域 軟件需求分析、軟件設計、軟件構建、軟件測試和軟件
安卓工程化開發筆記(2)
設計 說明 規劃 選擇 軟件企業 需求分析 結構 系統 周期 一、軟件生命周期 1、軟件定義期: 軟件定義是由軟件系統分析人員和用戶合作,確定軟件是什麽,針對有待開發的軟件系統進行分析、規劃和規格描述,為今後的軟件開發做準備。 (1)軟件任務立項 (2)項目可行性分析 (3
shell學習筆記(3)
shell 基礎 雜記if 一、if基礎 1、單分支 1.1 語法 if語句語法 單分支結構語法: if [條件]; then 指令 fi 或 if [條件] then 指令 fi 1.2 例子 [roo
Python學習筆記(3)
python重要的數據類型Dict和Setdict通過key 查找value(key和value關聯)花括號{ }表示這是一個dict,然後按照key:value,寫出來即可。最後一個key:value的都好可以省略 註意: 單元素的tuple必須在後面多家加一個逗號dict最後的逗號可以省略由於dict也是
莫煩大大TensorFlow學習筆記(3)----建立神經網絡
nbsp 定義數據 學習筆記 variables ati 選擇 mea 有變 plus 1、def add_layer() 添加神經網絡層: import tensorflow as tf def add_layer( inputs, in_size, out_si