進撃のAndroid注入術『二』

4425 ワード

続行
『一』では、基本的な考え方を一度説明し、次に注入から始めましょう.
ちゅうにゅう
ぶんかつ
我々が普段言っているコード注入は,主な静的と動的の2つの方式である.
  • 静的注入は、実行可能なファイルに対して、例えば普段ELF、DEXファイルなどを修正したり、IDA、JEB、ApkToolなど、関連する補助ツールもたくさんあります.
  • は、プロセスのレジスタ、メモリ値などを変更するプロセスに対して動的に注入される.

  • 動的と静的の最大の違いは、動的にソースファイルを変更する必要はありませんが、高い権限(通常root権限)が必要であり、必要な技術の含有量がより高いことです.
    本質
    動的注入技術は、本質的にスケジューリング技術である.通常、プロセスをデバッグするときに、どのような機能ができるか考えてみましょう.一般的には、次の項目があります.
  • 変数値を表示
  • 変数値
  • を変更
  • 追跡プロセスジャンプ
  • プロセス呼び出しスタック
  • を表示する
  • ダイナミック注入は通常のデバッグと比較して、最大の違いはダイナミック注入が1つであることです.
    「デバッグを自動化し、カスタムダイナミックリンクライブラリをロードする」というプロセスです.自動化とは、実際にはコードによって実現され、Linux上ではPtraceによって上記のすべての機能を完了することができます.もちろん、Ptrace機能は原始的で、普段のデバッグ中の機能は多くの高レベルの論理パッケージが必要です.
    次の章を読む前に、manドキュメントを読むことを強くお勧めします.ここを参照してください.
    目的
    一般的に、私たちは1つのプロセスに注入します.主に以下のいくつかの目的があります.
  • ターゲットプロセスの機能を強化する.
  • ターゲットプロセスの欠陥を修復する.
  • ハイジャックターゲットプロセス関数;
  • ターゲットプロセスデータを盗む;
  • ターゲットプロセスデータを改ざんする.

  • プロセス
    上の図に示すように、プロセスAがプロセスBに注入された後、レジスタとメモリを変更することによって、プロセスBにカスタムのダイナミックライブラリaをロードさせ、aがロードされた後、aはdexファイルのロードなどの他のモジュールをロードしようとします.具体的な注入プロセスは以下の通りです.
  • ATTATCH、目標プロセスを指定し、デバッグを開始する.
  • GETREGS、ターゲットプロセスのレジスタを取得し、現場を保存する.
  • SETREGSは、PCなどの関連レジスタを修正し、mmapを指す.
  • POPETEEXTは、so pathをmmap申請のアドレス空間に書き込む.
  • SETRESGは、dlopenを指すようにPCなどの関連レジスタを修正する.
  • SETREGS、現場を回復する;
  • DETACH、デバッグを解除して、それを回復させる;

  • 上記は簡略化されたプロセスで、注入されたコード全体をgithubにアップロードしました.アドレスhttps://github.com/boyliang/Poison
    soがdlopenによってターゲットプロセスにロードされると、soの論理を実行させる必要があります.複雑な方法は、ptraceを使用してレジスタを変更する方法と同様に、ターゲットプロセスがdlsymを呼び出して私たちの関数のアドレスを見つけることです.簡単な方法は2つあります.
  • gccを用いたプリコンパイル命令_attribute__ ((__constructor__)),役割はsoをロードした後、関数を自動的に実行することである.
  • __attribute__ ((__constructor__))
    void Main() {
     LOGI(">>>>>>>>>>>>>I am in, I am a bad boy 1!!!!<<<<<<<<<<<<<
  • は、c++グローバルオブジェクトを使用して初期化され、その構造関数が自動的に実行されます.
  • void Main();
    
    static void* _main(void*){
    	Main();
    	return NULL;
    }
    
    class EntryClass {
    public:
    
    	EntryClass() {
    		pthread_t tid;
    		pthread_create(&tid, NULL, _main, NULL);
    		pthread_detach(tid);
    	}
    
    } boy;

    例1
    次の例はptrace注入の例であり、ターゲットプロセスコードをhostとし、他の部分をlibmysoとして注入する2つの部分コードに関する.so
    ホストコード
    demo 1の3つのソースファイルが含まれています.c,inso.h, inso.c
    /*
     * inso.h
     *
     *  Created on: 2014 6 24 
     *      Author: boyliang
     */
    
    
    __attribute__ ((visibility ("default"))) void setA(int i);
    
    __attribute__ ((visibility ("default"))) int getA();
    /*
     * inso.c
     *
     *  Created on: 2014 6 24 
     *      Author: boyliang
     */
    
    #include 
    #include "inso.h"
    
    static int gA = 1;
    
    void setA(int i){
    	gA = i;
    }
    
    int getA(){
    	return gA;
    }
    /*
     * demo1.c
     *
     *  Created on: 2014 6 24 
     *      Author: boyliang
     */
    
    #include 
    #include 
    
    #include "inso.h"
    #include "log.h"
    
    int main(){
    
    	LOGI("DEMO1 start.");
    
    	while(1){
    		LOGI("%d", getA());
    		setA(getA() + 1);
    		sleep(2);
    	}
    
    	return 0;
    }

    libmyso.soコード
    /*
     * myso.c
     *
     *  Created on: 2014 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に公開していますが、コードを研究したい場合は、https://github.com/boyliang/injection_by_ptrace
    『三』では、Androidならではの注入技術を再紹介しますので、お楽しみに.