逆向第一步,从frida开始! 用我自己的理解,说一下frida是干什么的。
首先,hook是什么?
在一些大神的文章中,经常会出现“hook它!”,“hook之~”,翻译成大白话就是“盘它!”,说明这个东西起着决定性、结束性的步骤。
要了解一个东西,首先要知道它的应用场景在哪里。
① 做爬虫的时候,有时会发现请求头有个加密值,例如x-sign
值,这个值通常和我们的请求参数有关,当我们编写请求代码,如果不能破解x-sign
值,我们发出的请求就会被对方发现,嘿呀原来你是伪造的,打回,那既然请求错误了,那爬取就自然扑街啦。这时我们的hook就可以登场啦~
② 在做①爬虫的时候,我们有时会发现,我们其实连抓包都抓不到,还构建什么请求,爬什么虫,这大概率是因为对方使用了SSL加密,刚开始用个代理服务器进行代理人攻击进行抓取,现在有很多应用都要对客户端的证书进行验证,那还伪造个屁啊,玩不下去了!这时我们的hook就又登场啦~
③ 还有一些其他逆向破解类的,都会用到hook。
说了这么多,那么hook到底是什么呢?
hook,中文翻译为“钩子”。我的理解是,无论是什么进程,还是函数,都能把它勾过来,然后“加工”一番,再扔出去(执行)。
还有一个问题,我们为什么可以hook呢?
现在应用一般分为B/S架构,C/S架构。
B/S架构,例如应用场景①中,一般我们需要x-sign加密函数会在某一个js文件中,浏览器都帮你解析好了,慢慢找就好了。
而C/S架构中,例如应用场景②中,一般我们需要认证的证书都在本地应用程序中,需要我们自己对应用程序进行反编译,然后慢慢找需要hook的地方。
一般对方也有反制措施,比如混淆文件代码等,实际上只是让我们需要hook的地方变得识别困难一些,但并不影响我们hook它。
什么是Frida?
终于到本篇的正题了,如果说hook是技术,那么Frida就是工具。技术是一个概念,而工具是最终具体的实现。
Frida是二进制动态插桩技术,我的理解就是把一段代码动态的插入程序中,但最终不会改变原有的程序,但我们通过动态的插入,可以快速简单的分析出我们想要的那段源代码。
提示:记得添加环境变量
提示:切记安装路径不要有中文
Python 3.10.6 win-amd64 下载地址:百度云下载
命令行输入:python -V
显示如下,即配置成功。
PS D:\> python -V
Python 3.10.6
pip install frida -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/
提示:若一直卡在 Running setup.py install for frida … –
则下载对应版本的egg文件,egg文件列表,可自行查找。
我电脑win11 64 python3.10对应的是frida-15.2.2-py3.10-win-amd64.egg 点击下载
将egg文件放在D:\Python\Lib\site-packages
下(根据自己的Python安装目录)。
在当前目录cmd,执行easy_install frida-15.2.2-py3.10-win-amd64.egg
提示:若提示easy_install 不是内部或外部命令,也不是可执行的程序
当setuptools版本>51.3.3时,就没有带easy_install,按如下方式重新安装解决。
pip uninstall setuptools
pip install -v setuptools==51.3.3 -i https://pypi.tuna.tsinghua.edu.cn/simple/
最后再执行下载任务
pip install frida -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/
命令行输入:frida --version
显示如下结果,即安装成功。
PS D:\> frida --version
15.2.2
提示:该工具用于在PC端用命令行对安卓手机或模拟器进行调试。
提示:记得添加环境变量
adb工具:百度云下载
以下用逍遥模拟器演示Frida-server端。
打开一个模拟器,通过adb可查看该模拟器设备,查看连接,并查看模拟器设备型号。
PS D:\> adb devices
List of devices attached
127.0.0.1:21503 device
PS D:\> adb connect 127.0.0.1:21503
already connected to 127.0.0.1:21503
PS D:\> adb shell getprop ro.product.cpu.abi
x86_64
在官网找到对应frida版本、对应手机型号的frida-server下载,官网地址。
本次演示对应的frida-server版本为frida-server-15.2.2-android-x86_64.xz
,下载地址为百度云下载。
将解压之后的文件push到设备中,指定到 /data/local/tmp 路径下重命名为 frida-server。
PS D:\> adb push C:\Users\xxx\Desktop\frida-server-15.2.2-android-x86_64 /data/local/tmp/frida-server
C:\Users\xxx\Desktop\frida-server-15.2.2-android-x86...le pushed, 0 skipped. 19.4 MB/s (99542760 bytes in 4.882s)
命令行运行android设备中的frida-server。
PS D:\> adb shell // 进入手机
VOG-AL00:/ # su // 确定手机是root权限
VOG-AL00:/ # cd /data/local/tmp // 进入到tmp目录下
VOG-AL00:/data/local/tmp # chmod 777 frida-server // 给执行权限,可读可写可执行
VOG-AL00:/data/local/tmp # ./frida-server //正式启动frida-server
提示:执行完毕后为运行状态。这个shell不能关闭,关闭了frida就停止了。
进行端口转发监听
PS D:\> adb forward tcp:27042 tcp:27042
27042
PS D:\> adb forward tcp:27043 tcp:27043
27043
27042端口用于frida-server通信的默认端口号,不转发的话客户端是连接不上服务端。
使用默认端口非常容易被检测,可以使用非标准端口来启动frida。启动frida-service的时候设置IP和端口,启动命令。
./frida-server -l 127.0.0.1:9999
之后的每个端口对应每个注入的进程,例如27043端口。
检查是否成功 执行 frida-ps -U
命令成功输出进程列表,如下所示。
PS D:\> frida-ps -U
PID Name
---- ---------------------------------
2364 android.ext.services
2403 android.process.media
1566 audioserver
1567 cameraserver
... ...
test.py
import frida
rdev = frida.get_remote_device()
front_app = rdev.get_frontmost_application()
print(front_app)
PS E:\学习\python> python .\test.py
Application(identifier="com.android.chrome", name="Chrome", pid=13770, parameters={})
基本的入门就是这样了,之后的实战,还需要一点Python知识(不会也没关系其实),一些JavaScript知识(比较重要)。
对于B/S架构的程序,更偏重于JavaScript代码的分析能力。
对于C/S架构的程序,更偏重于Java代码的分析能力。
个人认为Hook最主要的地方,是找出需要Hook的地方,找到后一切都会迎刃而解的。