Frida 之 Java層Hook

前言

Frida是個(gè)輕量級(jí)別的hook框架,是Python API磕潮,但JavaScript調(diào)試邏輯,它既可以hook java層也可以hook native層

Frida的核心是用C編寫(xiě)的翠胰,并將Google的V8引擎注入到目標(biāo)進(jìn)程中,在這些進(jìn)程中自脯,JS可以完全訪問(wèn)內(nèi)存之景,掛鉤函數(shù)甚至調(diào)用進(jìn)程內(nèi)的本機(jī)函數(shù)來(lái)執(zhí)行。

使用Python和JS可以使用無(wú)風(fēng)險(xiǎn)的API進(jìn)行快速開(kāi)發(fā)膏潮。Frida可以幫助您輕松捕獲JS中的錯(cuò)誤并為您提供異常而不是崩潰锻狗。

環(huán)境

Android4.4.4
Nexus5手機(jī)(ARM)
frida12.11.18
python3.6

安裝

首先使用pip安裝frida和frida-tools模塊

pip install frida
pip install frida-tools

我這里使用PyCharm安裝

image.png

下載frida-server,官方下載地址https://github.com/frida/frida/releases焕参,這里注意下載的版本應(yīng)該和上面安裝的frida版本一致轻纪。
在adb shell中查看cpu的架構(gòu)

getprop ro.product.cpu.abi
image.png

所以我們下載這個(gè)版本


image.png

下載后解壓重命名為frida-server 并push到手機(jī)上。
進(jìn)入root權(quán)限叠纷,給其權(quán)限并運(yùn)行,手機(jī)會(huì)重啟


image.png

image.png

然后把端口轉(zhuǎn)發(fā)到PC端:

adb forward tcp:27042 tcp:27042

adb forward tcp:27043 tcp:27043

到這里我們就把通信的手機(jī)端工作做完了

java層Hook

我們要做事情
1.hook類的普通方法
2.hook類的構(gòu)造方法
3.構(gòu)造和修改自定義類型對(duì)象和屬性

先寫(xiě)一個(gè)目標(biāo)app

image.png

添加SharkUtils和Student兩個(gè)類
SharkUtils.java

package com.shark.fridatarget;

public class SharkUtils {
    public static String getPwd(String info) {
        return info + "shark";
    }

    public static String getPwd() {
        return "shark";
    }

    public static Student getStu() {
        return new Student("fujie", 100);
    }

    public static int getStuScore(Student student) {
        return student.getScore();
    }
}

Student.java

package com.shark.fridatarget;

public class Student {

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public String name;
    public int score;

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }


}

MainActivity.java

package com.shark.fridatarget;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView textView;
    TextView textView2;
    TextView textView3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.test);
        Student student = SharkUtils.getStu();
        textView.setText("姓名:" + student.getName() + "------分?jǐn)?shù):" + student.getScore());

        textView2 = findViewById(R.id.test2);
        textView2.setText("password:"+SharkUtils.getPwd("123456"));

        textView3 = findViewById(R.id.test3);
        textView3.setText("getStuScore:"+SharkUtils.getStuScore(student));

    }
}

app就是調(diào)用SharkUtils的方法刻帚,然后將返回的信息輸出到控件上
運(yùn)行如下


image.png

現(xiàn)在就來(lái)編寫(xiě)Hook代碼

import frida  # 導(dǎo)入frida模塊
import sys  # 導(dǎo)入sys模塊

jscode = """  //從此處開(kāi)始定義用來(lái)Hook的javascript代碼
    Java.perform(function(){  
        var student = Java.use('com.shark.fridatarget.Student'); //獲得Student類
        var sharkUtils = Java.use('com.shark.fridatarget.SharkUtils'); //獲得SharkUtils類
        var clazz = Java.use('java.lang.Class'); //獲得Class類
         //Hook普通方法
        sharkUtils.getPwd.overload("java.lang.String").implementation = function(info){ 
            //方式一獲取參數(shù)
            send("getPwd1:"+info);
            //方式二獲取參數(shù)
            send("getPwd2:"+arguments[0]);
            return this.getPwd("shark"); //劫持返回值,修改為我們想要返回的字符串
        }
        
        //Hook Student的構(gòu)造函數(shù)$init涩嚣,用js自己實(shí)現(xiàn)
        student.$init.overload("java.lang.String","int").implementation = function(name,score){ 
            send('Statr! Hook!'); //發(fā)送信息崇众,用于回調(diào)python中的函數(shù)
            return this.$init("shark",99); //調(diào)用原來(lái)的初始化方法
        }
       
       //構(gòu)造和修改自定義類型對(duì)象和屬性
       sharkUtils.getStuScore.overload("com.shark.fridatarget.Student").implementation = function(student){ 
            send('student:'+student); 
            
            //使用方法得到屬性
            var score = student.getScore();
            send('student score:'+score); 
            //直接得到屬性
            var score2 = student.score;
            send('student score2:'+score); 

             //構(gòu)造一個(gè)新的student對(duì)象
            var new_stu = student.$new("shark chilli",55);

            //將com.shark.fridatarget.Student轉(zhuǎn)化java.lang.Class
            var scorc_field = Java.cast(student.getClass(),clazz).getDeclaredField("score");
            //這里就是普通的反射了
            scorc_field.setAccessible(true);
            send('reflect scorc_field:'+scorc_field.get(student)); 
            scorc_field.setInt(student,999);
            return student.getScore(); 
        }
    });
"""

def on_message(message, data):  # js中執(zhí)行send函數(shù)后要回調(diào)的函數(shù)
    print(message)

# 得到設(shè)備并劫持進(jìn)程com.shark.fridatarget(
 # 該開(kāi)始用get_usb_device函數(shù)用來(lái)獲取設(shè)備,但是一直報(bào)錯(cuò)找不到設(shè)備缓艳,改用get_remote_device函數(shù)即可解決這個(gè)問(wèn)題)
process = frida.get_remote_device().attach('com.shark.fridatarget')

script = process.create_script(jscode)  # 創(chuàng)建js腳本
script.on('message', on_message)  # 加載回調(diào)函數(shù),也就是js中執(zhí)行send函數(shù)規(guī)定要執(zhí)行的python函數(shù)
script.load()  # 加載腳本
sys.stdin.read()
image.png

這段代碼就是hook的整體邏輯使用get_remote_device來(lái)獲取到設(shè)備看峻,然后調(diào)用attach附加到app上阶淘,所以這里必須要在手機(jī)上打開(kāi)這個(gè)應(yīng)用。否則會(huì)找不到互妓。然后創(chuàng)建js腳本溪窒,加載回調(diào)函數(shù)就是我們自己定義的on_message函數(shù),這樣js中調(diào)用send就調(diào)用了我們的on_message函數(shù)了冯勉。下面就是加載腳本了澈蚌。

 Java.perform(function(){ 
  ...
 });

我們的hook邏輯都寫(xiě)在上面的js代碼中

image.png

使用Java.use獲得類的類型
image.png

Hook普通方法,直接使用要hook的方法名灼狰,overload是確認(rèn)方法重載的宛瞄。
上面看到想要獲得參數(shù)有兩種方式,一是在方法上定義參數(shù)名即可交胚。二是通過(guò)隱含的arguments變量獲取份汗。
this指針就是被hook的對(duì)象盈电,想要修改返回值可以直接使用return
image.png

Hook構(gòu)造方法東西其實(shí)都一樣,就是調(diào)用構(gòu)造方法的時(shí)候使用$init

image.png

構(gòu)造和修改自定義類型對(duì)象和屬性杯活,想new一個(gè)類的實(shí)例使用的是$new匆帚。其他的代碼和java中的反射大同小異。注意一下的是要使用反射操作這個(gè)student實(shí)例前需要使用cast轉(zhuǎn)化成java.lang.Class

運(yùn)行

image.png

引用

Frida hook入門
Android逆向之旅—Hook神器家族的Frida工具使用詳解
frida入門總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旁钧,一起剝皮案震驚了整個(gè)濱河市吸重,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歪今,老刑警劉巖嚎幸,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異彤委,居然都是意外死亡鞭铆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門焦影,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)车遂,“玉大人,你說(shuō)我怎么就攤上這事斯辰〔暗#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵彬呻,是天一觀的道長(zhǎng)衣陶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)闸氮,這世上最難降的妖魔是什么剪况? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蒲跨,結(jié)果婚禮上译断,老公的妹妹穿的比我還像新娘。我一直安慰自己或悲,他們只是感情好孙咪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著巡语,像睡著了一般翎蹈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上男公,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天荤堪,我揣著相機(jī)與錄音,去河邊找鬼。 笑死逞力,一個(gè)胖子當(dāng)著我的面吹牛曙寡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寇荧,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼举庶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了揩抡?” 一聲冷哼從身側(cè)響起户侥,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎峦嗤,沒(méi)想到半個(gè)月后蕊唐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烁设,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年替梨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片装黑。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡副瀑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恋谭,到底是詐尸還是另有隱情糠睡,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布疚颊,位于F島的核電站狈孔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏材义。R本人自食惡果不足惜均抽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望其掂。 院中可真熱鬧油挥,春花似錦、人聲如沸清寇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)华烟。三九已至,卻和暖如春持灰,著一層夾襖步出監(jiān)牢的瞬間盔夜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喂链,地道東北人返十。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像椭微,于是被迫代替她去往敵國(guó)和親洞坑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容