逆向手機內核,添加調試支持及繞過反調試

来源:http://www.cnblogs.com/xiahouye/archive/2017/06/02/6933593.html
-Advertisement-
Play Games

0x00前言 一個安卓應用可以被調試的條件是應用AndroidManifest.xml顯示指定android:debuggable="true",如果沒有設置android:debuggable的值,則預設android:debuggable="false",所以發佈的應用大部分都是不可調試的,如果 ...


 

0x00前言
  一個安卓應用可以被調試的條件是應用AndroidManifest.xml顯示指定android:debuggable="true",如果沒有設置android:debuggable的值,則預設android:debuggable="false",所以發佈的應用大部分都是不可調試的,如果要調試,則需要解包,改屬性然後重打包,這樣非常麻煩,而且效率低。第二個條件是內核配置文件default.prop的屬性ro.debuggable=1,這樣就不用管應用裡面設置的屬性了,看來是一個比較好的解決方案,我們只要修改一次內核就可以一勞永逸了。
  安卓應用程式常用的一種反調試手段是查看/proc/[pid]/status下的信息,如果處於調試狀態,那麼TracerPid的值就是調試進程的Pid,那麼程式就會做出相應的行為來反調試。

 

0x01提取內核

查看boot所在的分區

ls -l /dev/block/platform/msm_sdcc.1/by-name

提取內核

dd if= /dev/block/mmcblk0p17 of=/data/local/boot.img
adb pull /data/local/boot.img boot.img

解包內核

bootimg.exe --unpack-bootimg

解包之後的文件結構

 

0x02修改ro.debuggable

修改initrd/default.prop文件中的ro.debuggable=1

 

0x03修改kernel文件

複製一份kernel為zImage.gz方便後面的修改

用010editor打開zImage.gz查找十六進位1F 8B 08 00,刪除前面的所有數據,使文件變成一個標準的gzip壓縮文件,這樣就可以使用gunzip解包了。

 

gunzip zImage.gz

解包生成的zImage就是內核二進位文件了。

用IDA打開文件,設置處理器類型為ARM Little-endian

設置ROM start address和Loading address為0xc0008000

在安卓root終端關閉符號屏蔽

echo 0 > /proc/sys/kernel/kptr_restrict

查看proc_pid_status和__task_pid_nr_ns函數地址

cat /proc/kallsyms | grep proc_pid_status

cat /proc/kallsyms | grep __task_pid_nr_ns

為什麼要查找這兩個函數呢,我們根據源碼/kernel/msm/fs/proc/array.c來看一下

函數proc_pid_status內聯了task_state函數,在task_state內聯函數裡面通過函數__task_pid_nr_ns 獲取到tracerpid並且列印出來。

在IDA中按快捷鍵g跳轉到函數c0187f88(__task_pid_nr_ns)函數處,按x出來引用搜索框,在其中找到函數c02764b8(proc_pid_status)

查看局部的調用為

可以看到調用的結果會存儲在R11中,所以修改命令MOV R11, R0為MOV R11, #0,機器碼為00 B0 A0 E3,文件的偏移為(0xC02765F8-0xC0008000= 26E5F8)

重新壓縮zImage

gzip -n -f -9 zImage

用010editor添加原kernel的首部和尾部二進位數據到文件zImage.gz(新的zImage.gz文件必須比原zImage.gz文件小,並且回寫回去時不能改變原kernel文件的大小及修改原kernel文件後面的內容,否則會很麻煩),這時得到了kernel文件。

添加首部3DEB長的數據

先占位,然後複製首部的數據到頭部

添加尾部數據

替換原先的kernel文件,重新生成新的boot.img

bootimg.exe --repack-bootimg

 

0x04刷入新的內核

手機重啟到bootloader模式

adb reboot bootloader

刷入新的boot

fastboot flash boot boot-new.img

重啟

fastboot reboot

如果手機開不了機,那麼重新刷回老的內核

fastboot flash boot boot-old.img

 

0x05SELinux導致IDA無法調試

在安卓端以root許可權啟動andorid_server之後,併在本機做埠轉發,IDA可以正常列出可調試的應用列表,但是當選擇某個程式的時候就會出現如下錯誤

The debugger could not attach to the selected process.

This can perhaps indicate the process was just terminated, or that you dot't have the necessary privileges.

關閉SELinux,之後就正常了,不知道是不是MIUI獨家的問題。

 

檢測SELinux是否打開

getenforce

返回值:Enforcing:強制模式  Permissive:寬容模式  Disabled:關閉

 

臨時關閉SELinux

setenforce 0

0為關閉,1為打開,執行後立即生效,無需重啟

 

0x06小結

  工欲善其事,必先利其器,有一個基本的調試環境對逆向學習是非常有幫助的。因為很多的手機產商沒有將手機系統源代碼放出,所以只能採取逆向內核的方式進行修改,如果手機廠商有把系統的源代碼放出,那麼從源碼編譯將會更具有修改性,可以定製更多的內核特性。如果手機有開源的安卓系統支持,比如lineage os或者CM的支持,也可以選擇這些優秀的開源代碼來編譯。

 

參考:

逆向修改手機內核,繞過反調試

Android逆向之旅—應用的”反調試”方案解析(附加修改IDA調試埠和修改內核信息)

[原創]支持windows下打包boot/recovery.img的bootimg.exe,且支持自動解包/打包dt.img,加入MTK機型支持

Android反調試筆記

記錄下android SELinux造成ida無法調試

修改Android手機內核,繞過反調試


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 執行環境(execution context,為簡單起見,有時也稱為“環境”)是JavaScript 中最為重要的一個概念。執行環境定義了變數或函數有權訪問的其他數據,決定了它們各自的行為。每個執行環境都有一個與之關聯的變數對象(variable object),環境中定義的所有變數和函數都保存在這 ...
  • github鏈接 借鑒吾記APP,使用 vue2.0+vue-router+vuex 為主要技術棧,elementui做為ui框架,多模塊 spa 模式,webpack2.0 負責模塊打包,gulp 負責處理靜態資源打包、壓縮,歡迎打賞star!!! 安利一下 吾記前端構建流程 本地環境準備 安裝n ...
  • 一、來源 在電腦科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,並且返回接受餘下的參數且返回結果的新函數的技術。這個技術由 Christopher Strachey 以邏輯學家 Haskell Curry 命名的,儘管它是 Moses ...
  • 前端變化飛快,掌握一門前端框架在當下開發中必不可少,vue.js作為三大框架之一,擁有友好的中文文檔,平緩的學習曲線,在經過一段時間的學習之後,自己也用vue實現了一個簡單的小dome,項目雖小,但都用到了當下最常用的技術,可謂是麻雀雖小、五臟俱全。 ...
  • <header></header> 頁眉 主要用於頁面的頭部的信息介紹,也可用於板塊頭部 <hgroup></hgroup> 頁面上的一個標題組合 一個標題和一個子標題,或者標語的組合 <hgroup> <h1>妙味課堂</h1> <h2>帶您進入富有人情味的IT培訓</h2> </hgroup> ...
  • 代碼管理工具一開始用的確會有點懵,但是永久了就會發現都是那幾下套路,記錄下來 托管好了代碼一般起衝突了還是想重新搞一下,有個萬能的重置操作,那就是重新關聯svn項目,以前有時更換地址也是,發現遇到很多衝突問題,因為前面創建了文件,但是後來在伺服器上刪除了,結果衝突更換地址,發現衝突了,你又還原不了, ...
  • 什麼是EventBus 由greenrobot組織貢獻(該組織還貢獻了greenDAO),一個Android事件發佈/訂閱輕量級框架,功能:通過解耦發佈者和訂閱者簡化Android事件傳遞,EventBus可以代替Android傳統的Intent,Handler,Broadcast或介面函數,在Fr ...
  • 聲明 AS已經是Android開發的主流工具了,但是學校教學用的還是eclipse,很多同學不知道如何入門。網上看到一位大神整理得很好的教程,轉載過來,希望可以幫到有需要的人。 生命壹號:http://www.cnblogs.com/smyhvae/ 文章來源:http://www.cnblogs. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...