吕元江,2019年1月加入去哪儿网,现负责app的分析和设备指纹反爬事项,对app脱壳,java/nativec层加解密算法分析还原有丰富经验。java
用于熟悉了解 dalvik 虚拟机中类的加载流程(native层)linux
建立一个 Android 工程(做为调试的目标进程)android
带调试符号文件的替换ios
包含调试符号的文件都保存在编译后的 symbols 目录下算法
手机中原有的/system/lib/libdvm.so 替换成带调试符号信息的 libdvm.so (编译后的安卓系统源码out/target/product/hammerhead/symbols/system/lib/libdvm.so)macos
为目标进程-配置调试模式windows
选择调试模式-Native 模式,在工具栏中-选择点击运行下面的按钮 Edit Configuration:配置好后名字为 APPmarkdown
配置以后,直接以 debug 模式运行 APP\app
手机出现 Wating for Debuger 界面后点击 Android studio 调试器中的暂停按钮 以下有三个窗口:Frames,Variables,LLDB,分别用于查看函数调用堆栈,变量查看,LLDB 交互。函数
可使用 F7 F8 F9 等命令,进行可视化调试。可是不能在 IDE 中直接下断点,只能经过 LLDB 命令下断点,其中为了方即可视化调试有两个下断点的命令比较实用:
A #根据函数名下断点
br s -n DalvikdalviksystemDexFiledefineClassNative
B #根据文件名配合行号下断点
br set --file dalviksystemDexFile.cpp --line 387 或者 br s -f dalviksystemDexFile.cpp -l 387
场景:在修改 dalvik 从新编译后,想对修改后的代码进行调试,自定义的 libdvm.so 运行过程当中遇到崩溃定位。
在没有 APP 源码的状况下没法在 Android studio 上实现可视化调试,常见的是经过 gdb,或者IDA。
本次说说用 LLDB 如何进行远程调试。
LLDB 经常使用命令:
命令 | 功能做用 |
---|---|
p *(Type *)addr | 打印结构体 |
po 对象.属性 | 查看某个结构体或对象中的属性 |
br s -n 函数名 | 对函数名下断点 |
b **.m:NUM | 对某文件设置行断点 |
br del 断点编号 | 删除断点 |
ta v | 查看全局变量 |
ta v baz | //某个具体全局变量 baz |
fr v | 查看本地变量 |
fr v bar | //查看某个具体变量,其中 bar 为变量名 |
s | 步入 |
n | 步过 |
c | 继续运行 |
wa s v b | 将变量 b 设置为观察点 |
watchpoint l | 查看观察点 |
watch del 观察点编号 | 删除观察点 |
前提条件:
****目标 APP 必须为可调试-咱们编译的 rom 为 debug 版本,能够实现调试任意 APP 功能。
LLDB 使用比较简单具体步骤以下:
chmod 777 lldb-server
复制代码
3. 运行手机中的 lldb-server
./lldb-server platform --server --listen unix-abstract:///data/local/tmp/debug.sock
复制代码
4. 在电脑另起一个终端输入 lldb
lldb 支持多种插件可经过 platform list 查看
(lldb) platform list
Available platforms:
host: Local Linux user platform plug-in.
remote-freebsd: Remote FreeBSD user platform plug-in.
remote-linux: Remote Linux user platform plug-in.
remote-netbsd: Remote NetBSD user platform plug-in.
remote-windows: Remote Windows user platform plug-in.
kalimba: Kalimba user platform plug-in.
remote-android: Remote Android user platform plug-in.
remote-ios: Remote iOS platform plug-in.
remote-macosx: Remote Mac OS X user platform plug-in.
remote-gdb-server: A platform that uses the GDB remote protocol as the communication transport.(lldb)
复制代码
咱们选择使用 Android 调试插件
platform select remote-android
复制代码
链接 lldb-server
platform connect unix-abstract-connect:///data/local/tmp/debug.sock
复制代码
attach 目标进程
process attach -p 目标app进程id
复制代码