Safe6 Blog

macos 多版本frida配置使用

前言

一般不推荐用最新版的frida,这里说的最新版是指大版本。比如17,因为好多我觉得比较不错的工具都用不了,所以还是得用16,但是某些时候最新版也有他的用处。所以,多版本共存就显得很有必要。

笔记记录

以下内容,完全是搭建过程中的记录,看看就行,有点乱。

前置

首先、依赖virtualenvvirtualenvwrapper

virtualenvwrapper是前者的功能增强工具。

用这个两个来快速的创建环境,因为frida,大版本直接差异比较大,需要多版本共存。

但是想装低版本frida,还得低版本的python,所以还要解决python版本共存的问题。

mac下、python版本共存问题,

特别是python3.8,其他版本都能命令行安装 直接下载安装包进行安装 https://www.python.org/downloads/release/python-3810/ 安装后,环境变量就有python3.8,

为什么要3.8是因为,3.8支持frida低版本比如14,而这个版本可以有很多软件使用。

python3.8 -m pip install --upgrade pip
python3.8 -m pip install virtualenv virtualenvwrapper

Windows系统安装

windows 直接用这个是最方便,不怎么需要折腾

pip install virtualenvwrapper-win -i https://pypi.tuna.tsinghua.edu.cn/simple

mkvirtualenv 新建环境 
rmvirtualenv 删除环境

pip install frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple

切换环境
workon py310

mac系统安装

mac 多版本python共存。 思路:首先,把python3.8设置为系统默认python版本,然后其他的由pyenv来管理。

python3.8 直接去下载mac app。不要用brew,因为停更了,安装不上。

1、安装python3.8 app

2、取消链接由brew安装的python,后面使用pyenv来做多版本管理,不能直接卸载,因为还有很多依赖的工具,比如sqlmap这些。
brew list |grep python
brew unlink python
brew unlink python@3.11

设置默认python
sudo rm -rf /usr/local/bin/python
sudo ln -s /usr/local/bin/python3 /usr/local/bin/python


3、安装pyenv,接管python环境
brew reinstall pyenv

vim ~/.zshrc

# 加在最后面
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

source ~/.zshrc

4、看自己需求安装一下其他版本的python

pyenv install 3.9
pyenv install 3.10
pyenv install 3.13

快速切换版本
pyenv global 3.11.9

换回3.8
pyenv global system

查看所有的版本
pyenv versions

查看当前版本
pyenv version


完成上面步骤,共存就完成了。

虚拟环境


推荐全部用虚拟环境,不要破坏原有的环境,不同程序需要的依赖版本不一样,全部隔离开。

创建 py3.8环境(system自带环境)
pyenv virtualenv system frida16

创建一个开发环境
pyenv virtualenv 3.10.18 dev

删除环境
pyenv virtualenv-delete dev 

切换环境
pyenv activate frida16

frida版本共存

python版本共存解决之后,再来看frida版本问题 python3.8使用frida14,但是只支持Windows,mac彻底不支持frida14,最低版本为16


切换到frida16
pyenv activate frida16


# 推荐安装的版本,脱到最后面有版本对应关系。
pip list |grep frida  

frida           16.5.7

frida-tools      13.5.0


pip install frida-tools==13.5.0
pip install frida-tools==16.5.7

安装完成后,刷新一下环境,这里是个坑,一定要这样做。
pyenv deactivate frida16
pyenv activate frida16

adb forward tcp:27042 tcp:27042

frida-ps -Ua

关于frida版本

最新为17,这是server https://github.com/frida/frida/releases

而本地使用需要cli工具,去链接frida server。使用python,需要安装frida-tools,注意这个cli工具的版本和frida版本不一样。不要混淆。

frida=tools最新版是14

自带的frida有很多特征,推荐一个去除特征版本 https://github.com/hackcatml/ajeossida

一些frida的常用命令

随手记

环境切换

pyenv activate frida16

查看当前手机运行的进程


frida-ps -U  

快速查看,当前active和包名

adb shell dumpsys window | grep CurrentFocus

指定端口启动

frida server 默认端口:27042 
taimen:/ $ su 
taimen:/ # cd data/local/tmp/ 
taimen:/data/local/tmp # ./fs1280 -l 0.0.0.0:6666

端口转发

adb forward tcp:27042 tcp:27042

查看已链接的设备

frida-ls-devices

Id                 Type    Name             OS
-----------------  ------  ---------------  ----------
local              local   Local System     macOS 15.5
192.168.2.78:5555  usb     KB2000
barebone           remote  GDB Remote Stub
socket             remote  Local Socket

Spawn模式加载

frida -U -f 包名 -l hook.js

attach模式 :

frida -U 进程名 -l hook.js

使用

frida -U GM -l r0tracer.js

objection使用

其实这才是这篇文章的目录,就是为了用这个。所以一定要解决多版本共存的问题。这个工具非常的好用,不知道为啥就停更了。

最后折腾完后,发现frida16就能使用objection。下面贴一下常用命令,很多来自吾爱破解,正己大佬写的,不了解这个工具的,可以去看视频学习一下。

使用之前,先切换到可用的环境

pyenv activate frida16
objection --help(help命令)
Checking for a newer version of objection...
Usage: objection [OPTIONS] COMMAND [ARGS]...

       _   _         _   _
   ___| |_|_|___ ___| |_|_|___ ___
  | . | . | | -_|  _|  _| | . |   |
  |___|___| |___|___|_| |_|___|_|_|
        |___|(object)inject(ion)

       Runtime Mobile Exploration
          by: @leonjza from @sensepost

  默认情况下,通信将通过USB进行,除非提供了`--network`选项。

选项:
  -N, --network            使用网络连接而不是USB连接。
  -h, --host TEXT          [默认: 127.0.0.1]
  -p, --port INTEGER       [默认: 27042]
  -ah, --api-host TEXT     [默认: 127.0.0.1]
  -ap, --api-port INTEGER  [默认: 8888]
  -g, --gadget TEXT        要连接的Frida Gadget/进程的名称。 [默认: Gadget]
  -S, --serial TEXT        要连接的设备序列号。
  -d, --debug              启用带有详细输出的调试模式。(在堆栈跟踪中包括代{过}{滤}理源图)
  --help                   显示此消息并退出。

命令:
  api          以无头模式启动objection API服务器。
  device-type  获取关于已连接设备的信息。
  explore      启动objection探索REPL。
  patchapk     使用frida-gadget.so补丁一个APK。
  patchipa     使用FridaGadget dylib补丁一个IPA。
  run          运行单个objection命令。
  signapk      使用objection密钥对APK进行Zipalign和签名。
  version      打印当前版本并退出。

获取包名

adb shell dumpsys window | grep CurrentFocus

frida-ps -Ua
objection -g 包名或进程名 explore

启动前hook

objection -g 进程名 explore --startup-command "android hooking watch class 路径.类名"

加载插件

objection -g GM explore -P /Users/safe6sec/tools/apk/objection-plugins

插件使用

 plugin dexdump

memory list modules   -查看内存中加载的库

memory list exports so名称 - 查看库的导出函数

android hooking list activities -查看内存中加载的activity

android hooking list services -查看内存中加载的services



android intent launch_activity 类名  启动activity


 android sslpinning disable    关闭ssl校验

 android root disable        关闭root检测


hook 该类所有方法

android hooking watch class 类名

hook特定方法
android hooking watch class_method 类名.方法名 --dump-args --dump-return --dump-backtrace

android hooking watch class com.j75ed30089.y2295a1512.MainActivity --dump-args --dump-backtrace --dump-return



hook构造方法
android hooking watch class_method 类名.$init

android hooking watch class_method 类名.方法名


memory search --string --offsets-only //搜索内存


android heap search instances 类名(命令) 搜索内存实例,可以用来调用


android heap execute <handle> getPublicInt(实例的hashcode+方法名) 
如果是带参数的方法,则需要进入编辑器环境   
android heap evaluate <handle>   
console.log(clazz.a("吾爱破解")); 
按住esc+enter触发



android hooking list classes -列出内存中所有的类(结果比静态分析的更准确)


android hooking search classes 关键类名 -在内存中所有已加载的类中搜索包含特定关键词的类

android hooking search methods 关键方法名 -在内存中所有已加载的类的方法中搜索包含特定关键词的方法(一般不建议使用,特别耗时,还可能崩溃)

android hooking list class_methods 类名 -内存漫游类中的所有方法


插件

# 搜索类
plugin wallbreaker objectsearch LoginActivity
//返回:
com.example.androiddemo.Activity.LoginActivity
com.example.androiddemo.Activity.LoginActivity$1
 
# 根据类名搜索内存中已经被创建的实例,列出 handle 和 toString() 的结果 --fullname 打印完整的包名
plugin wallbreaker classdump com.example.androiddemo.Activity.LoginActivity --fullname
 
# 搜索对象
plugin wallbreaker objectsearch com.example.androiddemo.Activity.LoginActivity
//返回:
[0x2262]: com.example.androiddemo.Activity.LoginActivity@d8a5160
 
# 查看对象的一些属性和方法
plugin wallbreaker objectdump 0x2262 --fullname

查看某个activit
plugin wallbreaker classdump com.j75ed.MainActivity --fullname


dump dex

plugin dexdump search com.j75ed.MainActivity

plugin dexdump dump

frida 与 frida-tools 对应关系

来自看雪https://bbs.kanxue.com/thread-280436.htm

frida-tools==1.0.0 ------ 12.0.0<=frida<13.0.0  
frida-tools==1.1.0 ------ 12.0.0<=frida<13.0.0  
frida-tools==1.2.0 ------ 12.1.0<=frida<13.0.0  
frida-tools==1.2.1 ------ 12.1.0<=frida<13.0.0  
frida-tools==1.2.2 ------ 12.1.0<=frida<13.0.0  
frida-tools==1.2.3 ------ 12.1.0<=frida<13.0.0  
frida-tools==1.3.0 ------ 12.3.0<=frida<13.0.0  
frida-tools==1.3.1 ------ 12.3.0<=frida<13.0.0  
frida-tools==1.3.2 ------ 12.4.0<=frida<13.0.0  
frida-tools==2.0.0 ------ 12.5.3<=frida<13.0.0  
frida-tools==2.0.1 ------ 12.5.9<=frida<13.0.0  
frida-tools==2.0.2 ------ 12.5.9<=frida<13.0.0  
frida-tools==2.1.0 ------ 12.5.9<=frida<13.0.0  
frida-tools==2.1.1 ------ 12.5.9<=frida<13.0.0  
frida-tools==2.2.0 ------ 12.5.9<=frida<13.0.0  
frida-tools==3.0.0 ------ 12.6.17<=frida<13.0.0  
frida-tools==3.0.1 ------ 12.6.17<=frida<13.0.0  
frida-tools==4.0.0 ------ 12.6.21<=frida<13.0.0  
frida-tools==4.0.1 ------ 12.6.21<=frida<13.0.0  
frida-tools==4.0.2 ------ 12.6.21<=frida<13.0.0  
frida-tools==4.1.0 ------ 12.6.21<=frida<13.0.0  
frida-tools==5.0.0 ------ 12.6.21<=frida<13.0.0  
frida-tools==5.0.1 ------ 12.7.3<=frida<13.0.0  
frida-tools==5.1.0 ------ 12.7.3<=frida<13.0.0  
frida-tools==5.2.0 ------ 12.7.3<=frida<13.0.0  
frida-tools==5.3.0 ------ 12.7.3<=frida<13.0.0  
frida-tools==5.4.0 ------ 12.7.3<=frida<13.0.0  
frida-tools==6.0.0 ------ 12.8.5<=frida<13.0.0  
frida-tools==6.0.1 ------ 12.8.5<=frida<13.0.0  
frida-tools==7.0.0 ------ 12.8.12<=frida<13.0.0  
frida-tools==7.0.1 ------ 12.8.12<=frida<13.0.0  
frida-tools==7.0.2 ------ 12.8.12<=frida<13.0.0  
frida-tools==7.1.0 ------ 12.8.12<=frida<13.0.0  
frida-tools==7.2.0 ------ 12.8.12<=frida<13.0.0  
frida-tools==7.2.1 ------ 12.8.12<=frida<13.0.0  
frida-tools==7.2.2 ------ 12.8.12<=frida<13.0.0  
frida-tools==8.0.0 ------ 12.10.4<=frida<13.0.0  
frida-tools==8.0.1 ------ 12.10.4<=frida<13.0.0  
frida-tools==8.1.0 ------ 12.10.4<=frida<13.0.0  
frida-tools==8.1.1 ------ 12.10.4<=frida<13.0.0  
frida-tools==8.1.2 ------ 12.10.4<=frida<13.0.0  
frida-tools==8.1.3 ------ 12.10.4<=frida<13.0.0  
frida-tools==8.2.0 ------ 12.10.4<=frida<13.0.0  
frida-tools==9.0.0 ------ 14.0.0<=frida<15.0.0  
frida-tools==9.0.1 ------ 14.0.0<=frida<15.0.0  
frida-tools==9.1.0 ------ 14.2.0<=frida<15.0.0  
frida-tools==9.2.0 ------ 14.2.9<=frida<15.0.0  
frida-tools==9.2.1 ------ 14.2.9<=frida<15.0.0  
frida-tools==9.2.2 ------ 14.2.9<=frida<15.0.0  
frida-tools==9.2.3 ------ 14.2.9<=frida<15.0.0  
frida-tools==9.2.4 ------ 14.2.9<=frida<15.0.0  
frida-tools==9.2.5 ------ 14.2.9<=frida<15.0.0  
frida-tools==10.0.0 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.1.0 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.1.1 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.2.0 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.2.1 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.2.2 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.3.0 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.4.0 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.4.1 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.5.0 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.5.1 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.5.2 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.5.3 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.5.4 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.6.0 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.6.1 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.6.2 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.7.0 ------ 15.0.0<=frida<16.0.0  
frida-tools==10.8.0 ------ 15.0.0<=frida<16.0.0  
frida-tools==11.0.0 ------ 15.2.0<=frida<16.0.0  
frida-tools==12.0.0 ------ 16.0.0<=frida<17.0.0  
frida-tools==12.0.1 ------ 16.0.0<=frida<17.0.0  
frida-tools==12.0.2 ------ 16.0.0<=frida<17.0.0  
frida-tools==12.0.3 ------ 16.0.0<=frida<17.0.0  
frida-tools==12.0.4 ------ 16.0.0<=frida<17.0.0  
frida-tools==12.1.0 ------ 16.0.0<=frida<17.0.0  
frida-tools==12.1.1 ------ 16.0.9<=frida<17.0.0  
frida-tools==12.1.2 ------ 16.0.9<=frida<17.0.0  
frida-tools==12.1.3 ------ 16.0.9<=frida<17.0.0  
frida-tools==12.2.0 ------ 16.0.9<=frida<17.0.0  
frida-tools==12.2.1 ------ 16.0.9<=frida<17.0.0  
frida-tools==12.3.0 ------ 16.0.9<=frida<17.0.0