進擊的Android注入術《二》

2021-12-30 04:37:40 字數 2854 閱讀 2154

在《一》裡,我把基本思路描述了一遍,接下為我們先從注入開始入手。

我們平時所說的**注入,主要靜態和動態兩種方式 靜態注入,針對是可執行檔案,比如平時我們修改elf,dex檔案等等,相關的輔助工具也很多,比如ida、jeb、apktool等等;動態注入,針對是程序,比如修改程序的暫存器、記憶體值等等;動態跟靜態最大的區別是,動態不需要改動原始檔,但需要高許可權(通常是root許可權),而且所需的技術含量更高。

動態注入技術,本質上就是一種排程技術。想想平時我們除錯乙個程序時,可以做哪些功能? 一般有下列幾項: 檢視變數值修改變數值跟蹤程序跳轉檢視程序呼叫堆疊等等動態注入相比於普通的除錯,最大的區別就是動態注入是乙個」自動化除錯並達到載入自定義動態鏈結庫「的過程。所謂自動化,其實就是通過**實現,在linux上通過ptrace就可以完成上面所有功能,當然ptrace功能是比較原始的,平時除錯中的功能還需要很多高層邏輯封裝才可以實現。在閱讀下面章節之前,強烈建議閱讀一下man文件,見這裡。

一般而言,我們要對乙個程序進行注入,主要有以下幾方面目的: 增強目標程序的功能;修復目標程序缺陷;劫持目標程序函式;竊取目標程序資料;篡改目標程序資料;

如上圖所示,程序a注入到程序b後,通過修改暫存器和記憶體,讓程序b載入自定義的動態庫a,當a被載入後,a會嘗試載入其他模組,比如載入dex檔案等等,具體的注入過程如下: attatch,指定目標程序,開始除錯;getregs,獲取目標程序的暫存器,儲存現場;setregs,修改pc等相關暫存器,使其指向mmap;popetext,把so path寫入mmap申請的位址空間;setresg,修改pc等相關暫存器,使其指向dlopen;setregs,恢復現場;detach,解除除錯,使其恢復;上述是乙個簡化的過程,整個注入的**,我已經上傳到github,位址 當so被dlopen載入到目標程序後,我們需要讓so中的邏輯被執行,比較複雜的做法是同樣使用ptrace修改暫存器的辦法,讓目標程序呼叫dlsym找到我們函式的位址。而比較簡單的做法有兩種,如下 使用gcc的預編譯指令__attribute__ ((__constructor__)),作用是讓so被載入後,函式被自動執行;

__attribute__ ((__constructor__))

void main()

class entryclass

} boy;

下面示例乙個通過ptrace注入的示例,涉及到兩部分**,一部分是目標程序**記作host,另一部分是被我們注入的so**記作libmyso.so

包含三個原始檔,分別是demo1.c,inso.h, inso.c

/** inso.h

* * created on: 2023年6月24日

* author: boyliang

*/__attribute__ ((visibility ("default"))) void seta(int i);

__attribute__ ((visibility ("default"))) int geta();

/** inso.c

* * created on: 2023年6月24日

* author: boyliang

*/#include

#include "inso.h"

static int ga = 1;

void seta(int i)

int geta()

/** demo1.c

* * created on: 2023年6月24日

* author: boyliang

*/#include

#include

#include "inso.h"

#include "log.h"

int main()

return 0;}/*

* myso.c

* * created on: 2023年6月24日

* author: boyliang

*/#include

#include

#include

#include

#include

#include "log.h"

__attribute__ ((__constructor__))

void main() {

logi(">>>>>>>>>>>>>i am in, i am a bad boy 1!!!!《注入程式,我將其命名為poison,使用方法是poison 。下面是示例的輸出顯示:i/ttt ( 594): demo1 start.

i/ttt ( 594): 1

i/ttt ( 594): 2

i/ttt ( 594): 3

i/ttt ( 594): 4

i/ttt ( 594): 5

i/ttt ( 594): 6

i/ttt ( 594): 7

i/ttt ( 594): >>>>>>>>>>>>>i am in, i am a bad boy 1!!!!<<<<<<<<<<<<<<

i/ttt ( 594): 999

i/ttt ( 594): 1000

i/ttt ( 594): 1001

當執行./poison /data/local/tmp/libmyso.so 594後,輸出中馬上出現了特定字串,並且列印的資料一下子變成了999,證明我們注入成功了。

上述示例所涉及到**,我都放發布到github上了,大家如果想研究**,可以到 在《三》,我會再介紹一種android上特有的注入技術,敬請期待。

進擊的Android注入術《二》

在 一 裡,我把基本思路描寫敘述了一遍,接下為我們先從注入開始入手。我們平時所說的 注入,主要靜態和動態兩種方式 動態跟靜態最大的差別是,動態不須要修改原始檔,但須要高許可權 一般是root許可權 並且所需的技術含量更高。動態注入技術,本質上就是一種排程技術。想想平時我們除錯乙個程序時,能夠做哪些功...

進擊的暑假(二)

1.題目 有乙個字元陣列的內容為 student a am i 請你將陣列的內容改為 i am a student 要求 不能使用庫函式。只能開闢有限個空間 空間個數和字串的長度無關 提示 student a am i i ma a tneduts i am a student 解答 include...

htop命令 進擊的二狗子

htop htop是top的公升級版,它支援圖形介面滑鼠操作,相比top更加友好易操作。安裝yum install y htop使用命令列中直接敲擊htop命令即可左邊部分從上至下,分別為,cpu 記憶體 交換分割槽的使用情況,右邊部分為 tasks為程序總數,當前執行的程序數 load erage...