Dwarf本质上是一款调试器,这个项目起初知识想使用PyQt来给Frida增加一个有好的UI界面,并且主要用于Android端。但是通过开发人员的努力之后,该工具已经支持iOS端了。目前,得益于整个社区的共同努力,该工具已完全开源,并且支持对任何类型的操作系统进行分析,并运行在任意桌面端操作系统。
更详尽的介绍可参考:https://www.freebuf.com/sectool/212123.html
项目地址:https://github.com/iGio90/Dwarf
环境
- Python3(仅支持python3)
- 安装Frida环境
- adb 调试 驱动程序
- root手机环境或模拟器(本文教程用的是mumu模拟器)
安装
git clone https://github.com/iGio90/Dwarf
cd Dwarf
pip install -r requirements.txt
可选项:
可以安装keystone-engine来启用汇编程序
Windows
x86: https://github.com/keystone-engine/keystone/releases/download/0.9.1/keystone-0.9.1-python-win32.msi
x64: https://github.com/keystone-engine/keystone/releases/download/0.9.1/keystone-0.9.1-python-win64.msi
OSX / Unix
pip3 install keystone-engine
dex2jar工具(baksmali /反编译所需)
Guide: https://sourceforge.net/p/dex2jar/wiki/UserGuide/
Files: https://github.com/pxb1988/dex2jar/releases
On Windows add d2j folder to %PATH% and change:
'java -Xms512m -Xmx1024m -cp "%CP%" %*'
in d2j_invoke.bat to
'java -Xms512m -Xmx4096m -cp "%CP%" %*'
设置
您可以在.dwarf中更改
"dwarf_ui_hexedit_bpl": 32 (default: 16) - Bytes per line in hexview
"dwarf_ui_hexstyle": "upper", "lower" (default: "upper") - overall hexstyle 0xabcdef or 0xABCDEF (note: click on the "Offset (X)" in hexview to change)
"dwarf_ui_font_size": 12 (default: 12) - (note: hexview/disasm use other font wait for settingsdlg or change lib/utils.py get_os_monospace_font())
运行
官方教程中建议:进入Dwarf目录,运行dwarf.py,屏幕会展示Frida的引导界面,然后一步一步往下。
但由于国内网络状况,这并不是一个好的选择,因为Dwarf实在是太热情了,它会首先核实你的Frida是不是最新版,如果不是最新版就去Git上给你下载,其次,如果你server没启动,它会帮你启动server,但它期待你的server位于 /system/bin|xbin 目录下,但我们Frida server一般在/data/local/tmp目录下,因此即使你有server,它也会找不到,然后去Git帮你下载。。。因此很容易在某一步卡死。
因为如果已经安装好Frida环境的话可以修C:\Users\用户.dwarf下的preferences.json,preferences.json主要用于记录用户的一些偏好设置,比如调试器背景颜色,是否自动更新server,字体大小,展示风格等等。
preferences.json中的内容修改为 {“dwarf_ui_theme”: “light”, “disable_local_frida_update”: true}
disable_local_frida_update即不更Frida;
注:如果没有preferences.json可以使用python dwarf.py启动一下程序,第一次启动后会自动生成
在模拟器中运行frida-server
运frida-server服务
adb connect 127.0.0.1:7555
adb shell
cd /data/local/tmp
chmod 777 frida-server
./frida-server
#转发端口注:尽量使用此端口
adb forward tcp:27042 tcp:27042
运行dwarf并指定应用程序
格式:python dwarf.py -t android 应用程序包名
例:python dwarf.py -t android com.zyz.zmw
启动后界面如下:
其中右下角为所有类/so hook的日志输出,可以通过该日志大体查看app所有类与so模块调用情况
如果默认gui中模拟不小心删除了,可以通过菜单栏view下面进行勾选或使用快捷键ctrl+F2进行全部显示,具体显示于隐藏查看view菜单
对类或方法查添断点
菜单栏java下面有两个选项
class: 点击class会弹出JVM instector,该标签主要用于对指定的类 构造器及类的方法进行下断点
trace:点击trace会弹出JVM trace标签,该签主要用于对指定类进行调用关系的展示
我们选择class会弹出JVM inspetor标签如下图:
JVM inspetor中会显示所有已加载的所有类,我们在该标签中右健-》search可以进行过滤显示如下图:
点中图中class列中com.xiaoshijie.network.bean.AgentInfoResp会在method列下显示对应包含的方法
此时我可以通过双击class列com.xiaoshijie.network.bean.AgentInfoResp或method中内容对类或方法进行下断点,这里我对方法进行下断点如图
此时要下断的方法显示在左侧的breakpoint中
说明:breakpoint最下面按扭说明
+号:可以自已输入包名进行添加
-号:称除当前断点
删除图标:清空所有断点
移除 或清空后,该断点不可再次添加,如果需要添加需要重启应用程序:即菜单process->restart 快捷键F9
下好断点后切换点击app中我的
此时出现一个JVM debugger标签,可以此时可以看到一些拦截到的变量值
最右侧的threads则显示当前当前线程,可以选中内容右健-》resume进行断点释放如果有多个断点则resume,右下角的日志栏也有相应信息
注:菜单process-> step F7 ,setp call f8 ,step block也可以释放断点,目前测试功能好像一样,释放断点后如需再次对该方法进行断点需要重启
我们选择trace会弹出JVM trace标签如下图
trace列是要查看调用关系的类
class列是显示所有已加载的类,可以右键-》search进行过滤显示,选择要trace的类双击,然后在trace会添加上选择的类点击start开始,然后切换到app到我的标签此时如图
上图中显示类中的方法的调用关系,点击stop退出该功能以上是通过下断点查看内容进行分析下面通过js脚本进行注入修改内容
cosole标签左侧就是写脚本的区域,此处我们选中javascript并点右下角的小图标
在弹出框架写入脚本,可以通过open打开已写好的本地脚本
点击inject进行注入然后再点击app我的进行查看如图
说明修改内容成功
以上就是Dwarf的简单使用