Frida源碼編譯環(huán)境搭建

前言

frida的官方文檔寫的并不是很好靴拱,有些例子好像還有些問題。這就不得不去研究它的源碼了酒贬。frida的源碼有許多個模塊,我們這只關注 frida-java-bridge這個模塊翠霍。為什么呢锭吨?這個模塊實現(xiàn)了js世界到java世界的單向通道。所以我們主要的代碼在這寒匙×闳纾可以看看這篇文章對frida-java的介紹frida源碼閱讀之frida-java
這里我就記錄一下frida-java的編譯環(huán)境搭建

環(huán)境

VMware 12
Ubuntu16
Android8.0

步驟

1.下載安裝配置Ubuntu16需要使用到的軟件
1.安裝配置JDK
2.安裝配置SDK
3.安裝配置NDK
4.編譯安裝Nodejs
5.編譯運行frida-java

這里就跳過安裝Ubuntu16虛擬機的步驟了

下載安裝配置Ubuntu16需要使用到的軟件

配置apt國內軟件源鏡像
使用清華大學開源軟件鏡像站

image.png

將軟件源的配置拷貝到

sudo gedit /etc/apt/sources.list

更新apt

sudo apt-get update

安裝curl

sudo apt-get install curl

安裝git

sudo apt-get install git

安裝配置JDK

下載jdk
http://jdk.android-studio.org/
這里為了方便我在家目錄創(chuàng)建一個work目錄蒋情,有關環(huán)境我都安裝到這個目錄下埠况。讀者可以自行選擇目錄、

mkdir work

將下載的jdk解壓

tar -zxvf  jdk-8u77-linux-x64.tar.gz

配置環(huán)境變量

sudo gedit /etc/profile

加入配置如下棵癣,請修改自己的jdk位置

#set java env
export JAVA_HOME=/home/fj/work/jdk1.8.0_231
export JRE_HOME=${JAVA_HOME}/jre 
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 
export PATH=${JAVA_HOME}/bin:$PATH

加載配置

source /etc/profile

查看是否配置成功

fj@ubuntu:~/work/jdk1.8.0_231$ java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

安裝配置SDK

這里我借助android studio進行下載sdk辕翰。
android studio下載地址:http://www.android-studio.org/

下載后移動到work目錄,解壓運行

tar -zxvf android-studio-ide-191.5977832-linux.tar.gz 
cd android-studio/bin
./studio.sh 

其他操作和Windows上的as一樣

安裝sdk版本,我們下載29版本狈谊。

image.png

這里可以看到as下載的sdk在/home/fj/Android/Sdk喜命,所以我們需要配置這個目錄的環(huán)境變量

sudo gedit /etc/profile

配置如下,請注意修改自己sdk的位置:
注意配置build-tools/30.0.3 因為編譯時會用到dx

#set sdk
export ANDROID_SDK_HOME=/home/fj/Android/Sdk
export PATH=$PATH:${ANDROID_SDK_HOME}/tools
export PATH=$PATH:${ANDROID_SDK_HOME}/build-tools/30.0.3
export PATH=$PATH:${ANDROID_SDK_HOME}/platform-tools

加載配置文件

source /etc/profile

運行dx命令,如果出現(xiàn)以下信息說明成功

fj@ubuntu:~/work/android-ndk-r21d$ dx
error: no command specified
usage:
  dx --dex [--debug] [--verbose] [--positions=<style>] [--no-locals]
  [--no-optimize] [--statistics] [--[no-]optimize-list=<file>] [--no-strict]
  [--keep-classes] [--output=<file>] [--dump-to=<file>] [--dump-width=<n>]
  [--dump-method=<name>[*]] [--verbose-dump] [--no-files] [--core-library]
  [--num-threads=<n>] [--incremental] [--force-jumbo] [--no-warning]
  [--multi-dex [--main-dex-list=<file> [--minimal-main-dex]]
  [--input-list=<file>] [--min-sdk-version=<n>]
  [--allow-all-interface-method-invokes]

安裝配置NDK

ndk下載地址:https://developer.android.google.cn/ndk/downloads/
下載android-ndk-r21d-linux-x86_64.zip這個版本,因為frida的ndk默認版本就是這個

下載后移動到work目錄河劝,解壓

unzip android-ndk-r21d-linux-x86_64.zip
cd android-ndk-r21d

添加/etc/profile配置

#set NDK env
export NDK_HOME=/home/fj/work/android-ndk-r21d
export PATH=$NDK_HOME:$PATH

加載配置文件

source /etc/profile

查看ndk版本,如果出現(xiàn)以下信息說明成功

fj@ubuntu:~/work/android-ndk-r21d$ ndk-build --v
GNU Make 4.2.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

編譯安裝Nodejs

這里我使用源碼安裝壁榕,使用apt安裝的話版本過老。不支持frida的編譯赎瞎,并且升級麻煩牌里。

$ sudo git clone https://github.com/nodejs/node.git
Cloning into 'node'...

修改目錄權限:

$ sudo chmod -R 755 node

使用 ./configure 創(chuàng)建編譯文件,并按照:

$ cd node
$ sudo ./configure
$ sudo make
$ sudo make install

查看 node 和npm版本:

fj@ubuntu:~/work/node$ npm -v
7.4.2
fj@ubuntu:~/work/node$ node -v
v16.0.0-pre

編譯運行frida-java

使用Git下載frida-java-bridge源碼务甥,這里我選擇3.9.4牡辽,因為我的frida用的就是這個版本

fj@ubuntu:~/work$ git clone https://github.com/frida/frida-java-bridge.git --tag 3.9.4

frida-java對應的版本在test/Makefile下可以看到

frida_version := 12.11.14

修改配置文件

cd frida-java-bridge/

sudo gedit test/config.mk

修改為如下內容

#修改為自己的sdk目錄
ANDROID_SDK_ROOT ?= $(shell echo /home/fj/Android/Sdk)
#修改為自己的ndk目錄
ANDROID_NDK_ROOT ?= /home/fj/work/android-ndk-r21d
ANDROID_ARCH ?= arm64
ANDROID_ABI ?= arm64-v8a
#因為我們前面在As中下載了29版本,所以可以不用更換
ANDROID_API_LEVEL ?= 29
ANDROID_BINDIR ?= /system/bin
ANDROID_LIBDIR ?= /system/lib64
APEX_LIBDIRS ?= /apex/com.android.runtime/$(shell basename $(ANDROID_LIBDIR)):/apex/com.android.art/$(shell basename $(ANDROID_LIBDIR))
DEBUG_PORT ?= 5042

一般情況修改上面我注釋的部分就行了敞临,如果你的機型的架構不一樣注意修改一下态辛。

進行編譯

fj@ubuntu:~/work/frida-java-bridge$ make check
npm install

added 234 packages, and audited 235 packages in 25s

found 0 vulnerabilities
make -C test deploy
make[1]: Entering directory '/home/fj/work/frida-java-bridge/test'
curl -Ls https://github.com/frida/frida/releases/download/12.11.14/frida-gumjs-devkit-12.11.14-android-arm64.tar.xz | tar -xJf - -C build/obj/local/arm64-v8a
/home/fj/work/android-ndk-r21d/ndk-build \
    NDK_PROJECT_PATH=$(pwd) \
    NDK_APPLICATION_MK=$(pwd)/Application.mk \
    NDK_OUT=$(pwd)/build/obj \
    NDK_LIBS_OUT=$(pwd)/build \
    FRIDA_JAVA_TESTS_DATA_DIR=/data/local/tmp/frida-java-bridge-tests \
    FRIDA_JAVA_TESTS_CACHE_DIR=/data/local/tmp/frida-java-bridge-tests/dalvik-cache
make[2]: Entering directory '/home/fj/work/frida-java-bridge/test'
[arm64-v8a] Compile        : artpalette <= artpalette.c
[arm64-v8a] SharedLibrary  : libartpalette.so
[arm64-v8a] Install        : libartpalette.so => build/arm64-v8a/libartpalette.so
[arm64-v8a] Compile        : runner <= runner.c
[arm64-v8a] Compile++      : runner <= dummy.cpp
[arm64-v8a] Executable     : runner
[arm64-v8a] Install        : runner => build/arm64-v8a/runner
make[2]: Leaving directory '/home/fj/work/frida-java-bridge/test'
curl -Ls https://github.com/junit-team/junit4/releases/download/r4.12/junit-4.12.jar > build/junit.jar
curl -Ls https://search.maven.org/remotecontent?filepath=org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar > build/hamcrest.jar
cd build/java/ \
    && jar xf ../junit.jar \
    && jar xf ../hamcrest.jar
javac \
    -cp .:build/java/:/home/fj/Android/Sdk/platforms/android-29/android.jar \
    -bootclasspath /home/fj/Android/Sdk/platforms/android-29/android.jar \
    -source 1.8 \
    -target 1.8 \
    -Xlint:deprecation \
    -Xlint:unchecked \
    re/frida/Script.java re/frida/Eatable.java re/frida/Formatter.java re/frida/MethodTest.java re/frida/EatableWithField.java re/frida/ClassCreationTest.java re/frida/Fruit.java re/frida/PrimitiveArray.java re/frida/TestRunner.java re/frida/ClassRegistryTest.java \
    -d build/java/
jar cfe build/tests.jar re.frida.tests.Runner -C build/java .
dx --dex --output=build/tests.dex build/tests.jar
npm install

> frida-java-bridge-bundle@1.0.0 prepare
> npm run build


> frida-java-bridge-bundle@1.0.0 build
> frida-compile bundle -o build/frida-java-bridge.js -x -c


added 427 packages, and audited 428 packages in 2m

found 0 vulnerabilities
npm run build

> frida-java-bridge-bundle@1.0.0 build
> frida-compile bundle -o build/frida-java-bridge.js -x -c

adb shell "rm -rf /data/local/tmp/frida-java-bridge-tests && mkdir -p /data/local/tmp/frida-java-bridge-tests"
* daemon not running; starting now at tcp:5037
* daemon started successfully
adb: no devices/emulators found
Makefile:26: recipe for target 'deploy' failed
make[1]: *** [deploy] Error 1
make[1]: Leaving directory '/home/fj/work/frida-java-bridge/test'
Makefile:5: recipe for target 'check' failed
make: *** [check] Error 2

如果你看到
daemon started successfully
adb: no devices/emulators found
這些信息說明編譯成功了,后面的錯誤是因為我還有沒有連接我的手機挺尿。

測試運行
現(xiàn)在連接上我的手機奏黑,這里我使用無線adb的方式連接

fj@ubuntu:~/work/frida-java-bridge$ adb connect 192.168.124.2
connected to 192.168.124.2:5555
fj@ubuntu:~/work/frida-java-bridge$ adb devices
List of devices attached
192.168.124.2:5555  device

再次編譯運行

fj@ubuntu:~/work/frida-java-bridge$ make check
make -C test deploy
make[1]: Entering directory '/home/fj/work/frida-java-bridge/test'
adb shell "rm -rf /data/local/tmp/frida-java-bridge-tests && mkdir -p /data/local/tmp/frida-java-bridge-tests"
adb push build/arm64-v8a/runner build/tests.dex build/frida-java-bridge.js build/arm64-v8a/libartpalette.so /data/local/tmp/frida-java-bridge-tests
build/arm64-v8a/runner: 1 file pushed, 0 skipped. 2.0 MB/s (16624056 bytes in 7.970s)
build/tests.dex: 1 file pushed, 0 skipped. 635.5 MB/s (314016 bytes in 0.000s)
build/frida-java-bridge.js: 1 file pushed, 0 skipped. 0.4 MB/s (293597 bytes in 0.764s)
build/arm64-v8a/libartpalette.so: 1 file pushed, 0 skipped. 0.1 MB/s (5760 bytes in 0.040s)
4 files pushed, 0 skipped. 1.6 MB/s (17237429 bytes in 10.091s)
make[1]: Leaving directory '/home/fj/work/frida-java-bridge/test'
make -C test run
make[1]: Entering directory '/home/fj/work/frida-java-bridge/test'
adb shell "LD_LIBRARY_PATH='/apex/com.android.runtime/lib64:/apex/com.android.art/lib64:/data/local/tmp/frida-java-bridge-tests' /data/local/tmp/frida-java-bridge-tests/runner"
JUnit version 4.12
..........................................................
Time: 18.474

OK (58 tests)

make[1]: Leaving directory '/home/fj/work/frida-java-bridge/test'

看到最后面的OK就知道成功了,其中有58個方法被測試编矾。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末熟史,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窄俏,更是在濱河造成了極大的恐慌以故,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裆操,死亡現(xiàn)場離奇詭異怒详,居然都是意外死亡,警方通過查閱死者的電腦和手機踪区,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門昆烁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缎岗,你說我怎么就攤上這事静尼。” “怎么了传泊?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵鼠渺,是天一觀的道長。 經(jīng)常有香客問我眷细,道長拦盹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任溪椎,我火速辦了婚禮普舆,結果婚禮上,老公的妹妹穿的比我還像新娘校读。我一直安慰自己沼侣,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布歉秫。 她就那樣靜靜地躺著蛾洛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雁芙。 梳的紋絲不亂的頭發(fā)上轧膘,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音却特,去河邊找鬼扶供。 笑死,一個胖子當著我的面吹牛裂明,可吹牛的內容都是我干的椿浓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼闽晦,長吁一口氣:“原來是場噩夢啊……” “哼扳碍!你這毒婦竟也來了?” 一聲冷哼從身側響起仙蛉,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤笋敞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后荠瘪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夯巷,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡赛惩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趁餐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喷兼。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖后雷,靈堂內的尸體忽然破棺而出季惯,到底是詐尸還是另有隱情,我是刑警寧澤臀突,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布勉抓,位于F島的核電站,受9級特大地震影響候学,放射性物質發(fā)生泄漏藕筋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一盒齿、第九天 我趴在偏房一處隱蔽的房頂上張望念逞。 院中可真熱鬧,春花似錦边翁、人聲如沸翎承。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叨咖。三九已至,卻和暖如春啊胶,著一層夾襖步出監(jiān)牢的瞬間甸各,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工焰坪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趣倾,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓某饰,卻偏偏與公主長得像儒恋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子黔漂,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容