以下提到的所有步骤均在 macOS Mojave 上进行
使用 pip3 安装frida-tools
运行命令$ pip --version
和$ pip3 --version
来检查哪个pip来自Python 3x 。例如,您应该看到如下所示的版本信息:
$ pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
然后运行正确的pip命令来安装frida-tools
,例如pip3
$ pip3 install frida-tools
成功输出:
....
Successfully built frida-tools frida
Installing collected packages: colorama, frida, six, wcwidth, prompt-toolkit, pygments, frida-tools
Successfully installed colorama-0.4.1 frida-12.4.7 frida-tools-1.3.2 prompt-toolkit-2.0.9 pygments-2.3.1 six-1.12.0 wcwidth-0.1.7
测试您的安装
将cat
二进制文件复制到临时文件夹,例如/tmp/cat
然后从该目录运行cat
:
$ mkdir ~ /frida
$ cp /bin/cat /frida/cat
$ /frida/cat
在另一个终端中,创建一个包含以下内容的文件example.py
:
import frida
def on_message ( message , data ):
print ( "[on_message] message:" , message , "data:" , data )
session = frida . attach ( "cat" )
script = session . create_script ( """'use strict';
rpc.exports.enumerateModules = function () {
return Process.enumerateModulesSync();
};
""" )
script . on ( "message" , on_message )
script . load ()
print ([ m [ "name" ] for m in script . exports . enumerate_modules ()])
然后使用以下命令运行example.py
脚本
$ python3 example.py
输出应该与此类似(取决于您的平台和库版本):
[ u'cat' , …, u'ld-2.15.so' ]
安卓adb
命令
确保adb
可以看到您的设备:
$ adb devices -l
这还将确保 adb 守护进程在您的桌面上运行,这使得 Frida 能够发现您的设备并与您通信,无论您是否通过 USB 还是 WiFi 连接它。
frida-server
以下步骤基于 macOS Majave 上的Android 模拟器 Nexus 6P (x86) api 23。
首先,从 frida-server 发布页面下载最新的 Android frida-server
,例如,对于 Android x86
模拟器,您应该下载 frida-server-12.4.7-android-x86.xz,并让它在您的模拟器上运行:
$ adb root # might be required
$ adb push frida-server /data/local/tmp/
$ adb shell " chmod 755 /data/local/tmp/frida-server "
$ adb shell " /data/local/tmp/frida-server & "
对于最后一步,如果您看到以下错误:
Unable to load SELinux policy from the kernel: Failed to open file “/sys/fs/selinux/policy”: Permission denied
然后你需要使用 root shell 运行frida-server
,例如
$ adb shell
angler:/ $ su
angler:/ # /data/local/tmp/frida-server &
[1] 12089
angler:/ #
[1] 12089
是frida-server
的进程 ID。
现在,是时候在您的桌面上确保基本功能正常运行了。跑步:
frida-ps -U
这应该给你一个进程列表,大致如下:
PID Name
----- ---------------------------------------------------
721 ATFWD-daemon
4450 adbd
730 [email protected]
407 [email protected]
408 [email protected]
409 [email protected]
410 [email protected]
406 [email protected]
篡改Java源代码中的Boolean
值,即Boolean bTamperingSucces = false;
,或您感兴趣的其他代码。
apktool
可以从 Apktool 网站获取。只需按照本页内的步骤安装 apktool 即可。
adb
随 Android SDK 一起提供,可以在目录<your-some-path>/Android/sdk/platform-tools/adb
中找到
apksigner
是使用密钥库文件对您的 apk 进行签名。该工具可以在目录<ANDROID_HOME>/Android/sdk/build-tools/28.0.3/apksigner
中找到,其用法记录在命令行 apksigner 中。
从 DecompileApk 克隆示例项目。
找到已经编译好的apk文件DecompileApk/app/release/app-release.apk
。
使用apktool反编译它。
$ cd < your-path > /DecompileApk/app/release/
$ apktool d --no-res -f app-release.apk
您将看到以下输出
I: Using Apktool 2.4.0 on app-release.apk
I: Copying raw resources...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
在smali代码目录下查找DecompileApk/app/release/app-release/smali/com/arophix/decompileapk/MainActivity.smali
,找到以下代码
const / 4 p1 , 0x0
只需将0x0
(表示false
)更改为0x1
(表示true
)并保存文件。
使用apktool构建被篡改的apk。
apktool b app - release
您应该看到下面的输出
I: Using Apktool 2.4.0
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Copying raw resources...
I: Copying libs... (/lib)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...
从dist
目录中找到新建的apk DecompileApk/app/release/app-release/dist/app-release.apk
使用位于DecompileApk/app/decompileapk.jks
apksigner和密钥库对 apk 进行签名(请根据您自己的情况相应修改密钥库和 apk 的路径),
$ < ANDROID_HOME > /sdk/build-tools/28.0.3/apksigner sign --ks ../decompileapk.jks app-release.apk
您应该看到以下输出并输入密码123456
Keystore password for signer # 1:
使用 adb 命令安装签名的 apk。
$ adb install < path-to-the-tampered-apk > /app-release.apk
您现在应该在屏幕上看到"Hello, Android reverse engineer!"
,而不是从屏幕上看到"Hello from C++"
。
使用 Frida 挂钩 Android Java 源代码。
从 hook_java_methods.py 中找到脚本并使用以下命令运行它,然后单击已启动的 Android 应用程序的按钮。
$ python3 hook_java_methods.py
[ * ] Running CTF
[ * ] onClick
[ * ] Called - isPhoneRooted ()
[ * ] onClick
[ * ] Called - isPhoneRooted ()
如果您看到如下错误:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
请记住,您已经在模拟器上启动了frida-server
。
同时,在模拟器屏幕上,如果成功,您应该会看到 toast 消息更改为Device not rooted
。
使用 Frida 挂钩 Android C 源代码。
反编译APK
首先,使用 apktool 反编译 apk,提取共享库,即libnative-lib.so
。
$ cd DecompileApk/app/release
$ apktool d --no-res app-release.apk
找到目标JNI方法
其次,使用以下命令查找要挂钩的 JNI 函数。
$ nm --demangle --dynamic app-release/lib/x86/libnative-lib.so
您应该看到以下输出:
00004d80 T Java_com_arophix_decompileapk_MainActivity_stringFromJNI
000090b0 T std::bad_typeid::what () const
00005cf0 T std::bad_exception::what () const
00005e70 T std::bad_array_length::what () const
00005df0 T std::bad_array_new_length::what () const
00008ff0 T std::bad_cast::what () const
...
按名称挂钩 C 函数
从 hooknative-by-function-name.py 中找到脚本并使用以下命令运行它,然后单击已启动的 Android 应用程序的按钮。
$ python3 hooknative-by-function-name.py
[ * ] Running Arophix Hook Test ...
Java_com_arophix_decompileapk_MainActivity_stringFromJNI called with:
ret: 0x200019
如果您看到如下错误:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
请记住,您已经在模拟器上启动了frida-server
。
同时,在模拟器屏幕上,您应该看到文本更改为Frida is hooking this displayed text from Native layer by function name.
如果成功的话。
通过地址挂钩 C 函数
从 hooknative-by-function-address.py 中找到脚本并使用以下命令运行它,然后单击已启动的 Android 应用程序的按钮。
$ python3 hooknative-by-function-address.py
[ * ] Running Arophix Hook Test ...
[+] membase: 0xb2acd000
[+] addressOfStringFromJni: 0xb2ad1d80
[++] addressOfStringFromJni: 0xb2ad1d80
ret: 0x19
如果您看到如下错误:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
请记住,您已经在模拟器上启动了frida-server
。
同时,在模拟器屏幕上,您应该看到文本更改为Frida is hooking this displayed text from Native layer by function address.
如果成功的话。