進撃の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をロードした後、関数を自動的に実行することである. は、c++グローバルオブジェクトを使用して初期化され、その構造関数が自動的に実行されます.
例1
次の例はptrace注入の例であり、ターゲットプロセスコードをhostとし、他の部分をlibmysoとして注入する2つの部分コードに関する.so
ホストコード
demo 1の3つのソースファイルが含まれています.c,inso.h, inso.c
libmyso.soコード
よびだし
注入プログラムはpoisonと名付けられ、使用方法はpoisonです.出力表示の例を次に示します.
サンプルコード
上記の例ではコードについてgithubに公開していますが、コードを研究したい場合は、https://github.com/boyliang/injection_by_ptrace
『三』では、Androidならではの注入技術を再紹介しますので、お楽しみに.
『一』では、基本的な考え方を一度説明し、次に注入から始めましょう.
ちゅうにゅう
ぶんかつ
我々が普段言っているコード注入は,主な静的と動的の2つの方式である.
動的と静的の最大の違いは、動的にソースファイルを変更する必要はありませんが、高い権限(通常root権限)が必要であり、必要な技術の含有量がより高いことです.
本質
動的注入技術は、本質的にスケジューリング技術である.通常、プロセスをデバッグするときに、どのような機能ができるか考えてみましょう.一般的には、次の項目があります.
「デバッグを自動化し、カスタムダイナミックリンクライブラリをロードする」というプロセスです.自動化とは、実際にはコードによって実現され、Linux上ではPtraceによって上記のすべての機能を完了することができます.もちろん、Ptrace機能は原始的で、普段のデバッグ中の機能は多くの高レベルの論理パッケージが必要です.
次の章を読む前に、manドキュメントを読むことを強くお勧めします.ここを参照してください.
目的
一般的に、私たちは1つのプロセスに注入します.主に以下のいくつかの目的があります.
プロセス
上の図に示すように、プロセスAがプロセスBに注入された後、レジスタとメモリを変更することによって、プロセスBにカスタムのダイナミックライブラリaをロードさせ、aがロードされた後、aはdexファイルのロードなどの他のモジュールをロードしようとします.具体的な注入プロセスは以下の通りです.
上記は簡略化されたプロセスで、注入されたコード全体をgithubにアップロードしました.アドレスhttps://github.com/boyliang/Poison
soがdlopenによってターゲットプロセスにロードされると、soの論理を実行させる必要があります.複雑な方法は、ptraceを使用してレジスタを変更する方法と同様に、ターゲットプロセスがdlsymを呼び出して私たちの関数のアドレスを見つけることです.簡単な方法は2つあります.
__attribute__ ((__constructor__))
void Main() {
LOGI(">>>>>>>>>>>>>I am in, I am a bad boy 1!!!!<<<<<<<<<<<<<
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ならではの注入技術を再紹介しますので、お楽しみに.