1. 程式人生 > >hook Android系統呼叫的樂趣和好處

hook Android系統呼叫的樂趣和好處

0x00 前言

Android的核心是逆向工程師的好夥伴。雖然常規的Android應用被限制和沙盒化,逆向工程師可以按自己希望自定義和改變作業系統和核心中行為。這給了你不可多得的優勢,因為大部分完整性校驗和防篡改功能都依賴核心的服務。部署這種可以濫用信任並自我欺騙的核心和環境,可以避免走很多歪路。

Android應用有幾種方式和系統環境互動。標準方法是通過安卓應用框架的API函式。然而在底層,很多重要的函式,例如分配記憶體和訪問檔案,都是被轉化為linux的系統呼叫。在ARM linux中,系統呼叫的呼叫是通過SVC指令觸發軟體中斷實現的。中斷呼叫核心函式vector_swi(),用系統呼叫號作為一個函式指標表的偏移(如安卓上的sys_call_table)。

攔截系統呼叫最直接的方法是注入你的程式碼到核心記憶體中,覆蓋系統呼叫表中的原始函式地址重定向執行。不幸的是,目前Android核心加強了記憶體限制阻止了這種操作。具體來說,核心是在啟用CONFIG_STRICT_MEMORY_RWX選項的情況下構建的。這阻止了向只讀核心記憶體區寫入,意味著任何試圖修改系統程式碼或者系統呼叫表的操作都將導致崩潰和重啟。繞過這個的一個方法就是自己編譯核心:能夠禁用這種保護,做更多自定義的修改有利於逆向分析。如果你按常規方法逆向Android應用,構建你自己的逆向沙盒是不明智的。

注意:下面的步驟是最好在Ubuntu 14.04環境中用Android NDK 4.8

完成。我個人在Mac上面失敗了很多次才完成。我推薦用Ubuntu虛擬機器,除非你是個受虐狂。

0x01 構建核心

為了hack的目的,我推薦使用支援AOSP的裝置。Google的Nexus智慧手機和平板電腦是最合理的選擇,從AOSP構建的核心和系統元件在上面執行沒有問題。另外,索尼的Xperia也可以。為了構建AOSP核心,需要一系列工具(交叉編譯工具)和相應的核心原始碼。根據谷歌的指導,確定了正確的git倉庫和分支。

例如,獲取匹配Nexus 5的Lollipop的核心原始碼,需要克隆“msm”倉庫並檢出一個分支“android-msm-hammerhead”。一旦原始碼下載了,用make hammerhead_defconfig(或者whatever_defconfig,取決於你的裝置)命令建立預設核心配置。

1 2 3 4 5 6 7 $ git clone https://android.googlesource.com/kernel/msm.git $ cd msm $ git checkout origin/android-msm-hammerhead-3.4-lollipop-mr1  $ export ARCH=arm  $ export SUBARCH=arm $ make hammerhead_defconfig $ vim .config

為了啟動系統呼叫掛鉤功能,我推薦增加可載入模組的支援,由/dev/kmem介面支援,同時匯出全域性核心符號表。不要忘了禁用記憶體保護。這些選項的值在配置檔案中已經存在,只需要簡單的設定以下值。

1 2 3 4 5 6 7 CONFIG_MODULES=Y CONFIG_MODULE_UNLOAD=y CONFIG_STRICT_MEMORY_RWX=N CONFIG_DEVMEM=Y CONFIG_DEVKMEM=Y CONFIG_KALLSYMS=Y CONFIG_KALLSYMS_ALL=Y

一旦你完成了編輯配置檔案。或者,您現在可以建立一個獨立的工具鏈,用於交叉編譯核心和以後的任務。為了給Android 5.1建立一個工具鏈,執行Android NDK包的make-standalone_toolchain.sh:

1 2 $ cd android-ndk-rXXX $ build/tools/make-standalone-toolchain.sh --arch=arm --platform=android-21 --install-dir=/tmp/my-android-toolchain

設定CROSS_COMPILE環境變數,指向NDK目錄,並執行make構建核心。

1 2 $ export CROSS_COMPILE=/tmp/my-android-toolchain/bin/arm-eabi-  $ make

當構建過程完成後,能在arch/arm/boot/zImage-dtb找到引導核心模組。

0x02 啟動新核心

在啟動新核心前,備份一個你裝置的原始引導映像。找到啟動分割槽的位置:

1 2 3 4 5 6 7 [email protected]:/dev # ls -al /dev/block/platform/msm_sdcc.1/by-name/          lrwxrwxrwx root     root              1970-08-30 22:31 DDR -> /dev/block/mmcblk0p24 lrwxrwxrwx root     root              1970-08-30 22:31 aboot -> /dev/block/mmcblk0p6 lrwxrwxrwx root     root              1970-08-30 22:31 abootb -> /dev/block/mmcblk0p11 lrwxrwxrwx root     root              1970-08-30 22:31 boot -> /dev/block/mmcblk0p19 (...) lrwxrwxrwx root     root              1970-08-30 22:31 userdata -> /dev/block/mmcblk0p28

然後,將所有的內容轉儲到一個檔案中:

1 2

相關推薦

hook Android系統呼叫樂趣好處

0x00 前言 Android的核心是逆向工程師的好夥伴。雖然常規的Android應用被限制和沙盒化,逆向工程師可以按自己希望自定義和改變作業系統和核心中行為。這給了你不可多得的優勢,因為大部分完整性校驗和防篡改功能都依賴核心的服務。部署這種可以

Hook android系統呼叫研究(一)

一、Android核心原始碼的編譯環境 系統環境:Ubuntu 14.04 x64bit Android系統版本:Android 4.4.4 r1 Android核心版本:android-msm-hammerhead-3.4-kitkat-mr1 手機裝置:Nexus

(轉)android系統開發 AP BP 簡要說明

java 純c hal window 用戶界面 部分 上下 arm 配置 手機的AP和BP根據上下文可以指代硬件和軟件兩種意思. 1) 大多數的手機都含有兩個處理器。操作系統、用戶界面和應用程序都在Application Processor(AP)上執行,AP一般采用AR

iTOP-iMX6開發板Android系統下LVDSHDMI雙屏異顯方法

迅為iMX6 開發板 android 系統下 LVDS 和 HDMI 雙屏異顯的使用過程。 使用“Mfgtools-Rel-1.1.0_180403_MX6Q_UPDATER”版本的燒寫工具,把系統燒寫進開發板。系統啟動之後,把“.mp4”格式的視訊檔案放到“/sdcard”目錄下,如下圖所示。

android ksoap2 呼叫WebServiceWCF服務的區別

如何區分服務是webservice服務和wcf服務 webservice服務網址是以.asmx結尾的,例子:http://ip地址/Interface/MapService.asmx?wsdl wcf服務是以.svc結尾的,例子:http://ip地址/ydyzt/ReadXml

Android系統版本號API Level值對應關係及其所對應的SDK的VERSION_CODE值的常量

找了兩張圖,下面貼出即一目明瞭: 這下能看懂了嗎?大概總結一下我們常用到的語句: 要獲取當前系統的SDK版本號:android.os.Build.VERSION.SDK_INT(獲取的是int型的值),android.os.Build.VERSION

組合語言呼叫Linux系統呼叫readwrite

.section .data UserMsg: .ascii "Please input the message:" LenOfUserMsg: .equ lenMsg, LenOfUserMsg - UserMsg #.section .bss # .lcomm r

Android系統呼叫

android 中intent是經常要用到的。不管是頁面跳轉,還是傳遞資料,或是呼叫外部程式,系統功能都要用到intent。 隨著Android版本升級,以後會持續更新。 ★intent大全: 1.從google搜尋內容 Intent intent = newInte

Linux 系統呼叫 wait()waitpid

       一個程序在終止時會關閉所有檔案描述符,釋放在使用者空間分配的記憶體,但它的PCB還保留著,核心在其中儲存了一些資訊:如果是正常終止則儲存著退出狀態,如果是異常終止則儲存著導致該程序終止的訊號是哪個。這個程序的父程序可以呼叫wait或waitpid

Linux 系統呼叫 dup()dup2()

1、dup() dup()系統呼叫會建立檔案描述符的一個拷貝: (1)新生成的檔案描述符是程序中最小的未使用的檔案描述符,0 、1 、2對應標準輸入、標準輸出、標準錯誤輸出 (2)如果拷貝成功,那麼原始的和拷貝的檔案描述符可能會交叉使用 (3)兩者都指向同一個開啟的檔案描述符,因此共

使用Android系統呼叫裁剪圖片並儲存

順序:開啟圖片--->獲取圖片Uri或者Bitmap--->開啟系統裁剪框--->獲得裁剪後的圖片的Uri或者Bitmap。1.單純開啟相簿選擇圖片Intent intent = ne

Linux下的C語言程式設計——系統呼叫readwrite函式實現檔案拷貝

 系統呼叫read和write函式實現檔案拷貝 #include <stdio.h> #include <sys/types.h> #include <sys/st

Android系統中ParcelableSerializable的區別

進行Android開發的時候,我們都知道不能將物件的引用傳給Activities或者Fragments,我們需要將這些物件放到一個Intent或者Bundle裡面,然後再傳遞。 通過Android的API,我們知道有兩種選擇,即在傳遞物件時,需要對我們的物

[日更-2019.5.21] Android 系統的分割槽檔案系統(一)--Android分割槽的大概框架

宣告 其實我在剛開始接觸Android時給手機刷機,很好奇Android的刷機包裡面怎麼這麼多img檔案?而且每個img要刷入對

[日更-2019.5.22、23] Android 系統的分割槽檔案系統(二)--Android 檔案系統中的檔案

宣告 Android系統中有很多分割槽,每個分割槽內的檔案系統一般都不同的,使用ADB進入系統/目錄下可發現掛載這很多的目錄,不

Android呼叫系統圖庫相機獲取圖片並裁剪

最近用到從系統圖庫和相機獲取圖片並裁剪當頭像,根據郭霖大神的第一行程式碼呼叫相機和圖冊,來進行擴充套件和總結。 1、獲取許可權 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORA

Android呼叫系統的打電話發簡訊功能

一、打電話      1、新增打電話的許可權在manifast檔案中。            <uses-permission android:name="android.permission.CALL_PHONE"/>      2、使用Uri.parse(S

Android呼叫攝像頭拍照(相容MIUI系統)

功能:點選一張圖片,彈出對話方塊, 有選擇相簿和拍照兩個選項,得到一張照片後再對照片進行裁剪,然後將照片顯示在圖片控制元件上。 package com.example.pickphoto; import android.app.Activity; imp

Android 呼叫系統照相機拍照錄影

專案的佈局相當簡單,只有一個Button: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"

Android系統的智能指針(輕量級指針、強指針弱指針)的實現原理分析【轉】

其中 sin 類的定義 reason ava tab eas file 現在 Android系統的運行時庫層代碼是用C++來編寫的,用C++ 來寫代碼最容易出錯的地方就是指針了,一旦使用不當,輕則造成內存泄漏,重則造成系統崩潰。不過系統為我們提供了智能指針,避免出現上述問題