Frida开发环境搭建

pyenv环境配置

科学上网:pyenv/pyenv: Simple Python version management (github.com)

直连:pyenv-installer: pyenv(gitee的地址)

首先下载依赖包(参考:Common build problems · pyenv/pyenv Wiki (github.com)):

1
apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev

在这之前,可能需要更新apt-get

之后下载pyenv

1
curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash 

因为raw.githubusercontent.com域名被污染的原因,需要我们修改/etc下的hosts文件,指定域名跟ip的映射(ip通过ipaddress.com查询):

1
185.199.108.133 raw.githubusercontent.com	//多加几条也没关系

为了加快访问外网的速度,需要修改/etc下的proxychains.conf文件(我这里是proxychains4.conf),禁掉第一行,添加第二行(ip为宿主机ip,端口是宿主机开启的代理端口)

1
2
#socks4 	127.0.0.1 9050
socks5 ip port

这样就将流量代理到宿主机上,从而实现虚拟机依靠宿主机的翻墙软件达到翻墙目的。

安装结束后,提示我们缺少pyenv的加载路径,如图所示:

即我们需要将以下命令添加到/root下的.bash_profile文件中,如果没有该文件,则添加到.profile文件和.bashrc文件中。

1
2
3
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

同时还需要将下面的命令添加到.bashrc文件中。

1
eval "$(pyenv virtualenv-init -)"

之后重新启动shell窗口,说是执行

1
source ~/.bashrc

如果你这样做了,就会遇到很多麻烦,比如执行source ~/.bashrc找不到命令 “shopt”,这个好说,可以执行以下指令解决:

1
2
3
exec bash	//将命令行从zsh切换为bash
source ~/.bashrc
exec zsh //重新运行zsh命令行工具

而且新开的shell窗口并不能识别pyenv指令,而且除pyenv所在用户以外的其他用户不能使用pyenv指令

简而言之,不要按照提示来操作!!!

正确的操作是,将以下指令写入root目录和home/kali目录下(kali是我的虚拟机的用户名)的.zshrc文件中:

1
2
3
4
export PYENV_ROOT="/home/kali/.pyenv"	//pyenv的安装路径
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

分别对各自用户目录下的.zshrc文件执行source /.zshrc命令。最后执行exec $SHELL。这样随便启动shell窗口都可以识别pyenv指令。

(虽然写的这么简洁,但是费了好长时间才解决的,惨痛的教训)

然后是pyenv的基本用法:

1
2
3
4
5
6
7
pyenv install --list	//查询目前所有的python版本
pyenv install 2.7. //查询所有2.7.x版本
pyenv install 2.7.10 //安装2.7.10版本的python
pyenv uninstall 2.7.10 //卸载2.7.10版本的python
pyenv versions //查看当前系统中包含的Python版本
pyenv local 2.7.10 //切换为pyenv中的python版本
pyenv local system //切换为系统的python

下载时需要更改/etc/proxychain4.conf配置,注释掉proxy_dns

frida环境配置

首先是给我们的虚拟机配置frida环境。选定好pyenv中的python版本后,执行如下指令来安装fridafrida-tools

1
2
pip install frida
pip install frida-tools

建议使用proxychain代理。

安装完成后,在终端中输入frida-ps命令查看,如果能显示当前系统进程则证明安装成功

然后是给我们的手机配置frida环境。在Releases · frida/frida (github.com)中下载frida-server。需要注意版本!比如我的虚拟机下载的frida版本是16.1.3,Android手机是arm64架构,则应该下载frida-server-16.1.3-android-arm64.xz 文件。

查看手机cpu架构的指令如下:

1
./adb shell getprop ro.product.cpu.abi

下载后解压,可以将得到的文件重命名为frida-server,通过adb push传入手机里:

1
./adb push frida-server /data/local/tmp/

执行frida-server使用如下指令:

1
2
3
4
5
./adb shell
su
cd /data/local/tmp/
chmod 777 frida-server
./frida-server

正常启动后,另开一个终端,使用frida-ps -U命令检查frida是否正常运行,如果正常运行则会列出Android设备上当前正在运行的进程。

然后是frida的其他命令

1
2
3
4
5
6
7
8
//修改启动端口并启动frida-server
./frida-server -l 0.0.0.0:9999
//电脑端通过网络连接手机端的frida-server
frida-ps -H 手机ip:端口 (手机ip可在adb shell中使用ifconfig | grep "inet addr"
//电脑端通过USB连接手机端的frida-server
frida-ps -U
//-f 参数用于指定要运行的目标应用程序。这里是启动设置程序
frida -H 手机ip:端口 -f com.android.settings

objection配置

执行如下指令代理下载objection

1
proxychains pip install objection

然后在使用的时候,会出错:

1
ModuleNotFoundError: No module named '_lzma'

这时候需要安装相应的依赖:

1
2
3
4
5
6
# centos系统执行
yum install xz-devel -y
yum install python-backports-lzma -y

# Debian/ubuntu系统执行
apt-get install liblzma-dev -y

执行完后需要重新编译安装python环境,也就是卸载重装python。

(参考ModuleNotFoundError: No module named ‘_lzma’ - 知乎 (zhihu.com)

使用objection来连接frida-server,成功的情况如下图所示:

frida脚本编写的环境配置

下载vscode安装包,参考:vscode官方下载太慢解决办法_vscodeusersetup-x64-1.79.2.exe_luffy5459的博客-CSDN博客

下载完后,进入到所在目录,执行如下指令安装vscode:

1
dpkg -i code_1.81.1-1691620686_amd64.deb

之后代理下载frida-agent-example

1
proxychain git clone https://github.com/oleavr/frida-agent-example

如果文件图标加锁了,就需要修改权限:

1
chmod -R 777 frida-agent-example

为了获取代码提示,下载Node.js:

1
2
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs

(不过下不了版本10.x的,直接给下最新的了)

然后是到frida-agent-example目录下执行npm install,可惜报错:

1
2
3
4
5
6
7
8
9
Error: compilation failed
at Module.build (file:///home/kali/%E6%A1%8C%E9%9D%A2/frida-agent-example/node_modules/frida-compile/dist/compiler.js:35:15)
at main (file:///home/kali/%E6%A1%8C%E9%9D%A2/frida-agent-example/node_modules/frida-compile/dist/cli.js:37:39)
at file:///home/kali/%E6%A1%8C%E9%9D%A2/frida-agent-example/node_modules/frida-compile/dist/cli.js:56:1
at ModuleJob.run (node:internal/modules/esm/module_job:194:25)
npm ERR! code 1
npm ERR! path /home/kali/桌面/frida-agent-example
npm ERR! command failed
npm ERR! command sh -c npm run build

但是在vscode中仍然可以有代码提示!!!

环境配置好了。接下来就写个脚本试一试。

使用vscode打开frida-agent-example目录下的agent目录,创建一个js脚本,代码如下所示:

1
2
3
4
5
6
7
# filename: ts1.js
function main(){
Java.perform(function x(){
console.log("nihao123")
})
}
setImmediate(main)

然后在vscode中开启Terminal,执行指令

1
frida -H 192.168.0.101:9999 -f com.android.settings -l ts1.js --no-pause

可是报错:

1
frida: error: unrecognized arguments: --no-pause

去掉--no-pause就可以执行了(原因参考frida: error: unrecognized arguments: –no-pause · Issue #2277 · frida/frida (github.com))

(这可不是我加上去的)

接下来就利用python的firda库尝试批量化处理。(python的firda没有代码提示!!),创建一个python脚本,代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
# filename: loader.py
import time
import frida

device = frida.get_device_manager().add_remote_device("192.168.0.101:9999")
pid = device.spawn(['com.android.settings'])
device.resume(pid)
session = device.attach(pid)
with open('ts1.js') as f:
script = session.create_script(f.read())
script.load()
imput()

在控制台中输入python loader.py,成功了!

如果没有成功,则可能是pyenv环境没有配置对。


Frida开发环境搭建
http://example.com/2023/08/24/Android安全/Frida开发环境搭建/
作者
gla2xy
发布于
2023年8月24日
许可协议