静态加载
ABI
CPU的指令集,调用规范
lldb
llvm的一个组件,而llvm是编译市场的王者。可用来调试第三方的so库。在aosp源码当中tree -NCfhl |grep lldb
找到lldb-server,32位和64位push到手机的/data/local/tmp,具体采用lldb的几位server,需要根据app的具体编译架构来决定。
交叉编译
用于编译第三方的c/c++的库,并能在android中使用。以下照搬官方的说明和使用方法
从 NDK r19 开始,NDK 默认安装的工具链可供使用。与任意构建系统进行交互时不再需要使用 make_standalone_toolchain.py 脚本。
为了确保使用正确的架构进行构建,请在调用 Clang 时使用 -target 传递适当的目标,或调用具有目标前缀的 Clang。例如,若要为 64 位 ARM Android 编译值为 21 的 minSdkVersion,可使用以下两种方法,您可以选择使用其中最方便的方法:
1 | $ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \ |
1 | $ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \ |
以上要编译c文件则需要把clang++替换成clang。
在这两种情况下,请将 $NDK 替换为指向 NDK 的路径,将 $HOST_TAG 替换为指向根据下表所下载的 NDK 的路径:
NDK 操作系统变体 | 主机标记 |
---|---|
macOS | darwin-x86_64 |
Linux | linux-x86_64 |
32 位 Windows | windows |
64 位 Windows | windows-x86_64 |
这里的前缀或目标参数的格式是目标三元组,带有表示 minSdkVersion 的后缀。该后缀仅与 clang/clang++ 一起使用;binutils 工具(例如 ar 和 strip)不需要后缀,因为它们不受 minSdkVersion 影响。Android 支持的目标三元组如下:
ABI | 三元组 |
---|---|
armeabi-v7a | armv7a-linux-androideabi |
arm64-v8a | aarch64-linux-android |
x86 | i686-linux-android |
x86-64 | x86_64-linux-android |
注意:对于 32 位 ARM,编译器会使用前缀 armv7a-linux-androideabi,但 binutils 工具会使用前缀 arm-linux-androideabi。对于其他架构,所有工具的前缀都相同。
许多项目的构建脚本都预计使用 GCC 风格的交叉编译器,其中每个编译器仅针对一种操作系统/架构组合,因此可能无法正常处理 -target。在这些情况下,最好使用三元组前缀的 Clang 二进制文件。
查看app的so在哪个目录下
- 打开app
- ps -e |grep -i 包名的关键字
拿到其pid- cat /proc/上面拿到的pid/maps | grep -i so名
查看so的基地址
- 打开app
- ps -e |grep -i 包名的关键字拿到其pid
ps -e|grep so名
基地址+偏移的计算
使用pythonhex(0x基地址+0x偏移地址)
so解密流程
- 定位到最细粒度的算法逻辑
- 确保算法里最好不要有任何第三方的调用,哪怕是libc的函数
- 模拟执行整个算法
- 模拟整个系统
3不行就4
ExAndroidNativeEmu
基于unicode的模拟器
花指令
旨在用于对抗反编译工具的指令
https://www.jianshu.com/p/0390f598c34c
手机装objdump
- 安装termux
- 在termux中
pkg install binutils
执行一遍这个命令,然后执行一下which objdump
查看objdump的路径,如果还需要在执行什么命令安装会有提示的
GDB
GDB的优势
- 支持所有编译型语言
- 支持所有平台
- 可调内核(更传统legend)
- 内核硬件断点,开启内存断点
- 历史悠久
流程体验
- 在data/local/tmp下运行对应app的cpu下的gdbserver
其中attach的是当前需要调试的app的pid。gdbserver端口默认23946 - 然后再kali中运行相应的gdb,此步骤只需运行gdb即可
- 然后运行
target remote 手机ip:gdbserver端口
,此时就连接到手机端的gdbserver,然后会看到一堆加载的so符号,等待这些符号刷完。获取顶层activity
adb dumpsys activity top
HyperPwn调试
HyperPwn:GDB+GUI
安装
安装hyper
安装这个版本的hyper-canary
https://github.com/vercel/hyper/releases/tag/v3.1.0-canary.4dpkg -i hyper_3.1.0-canary.4_amd64.deb
可能会有依赖问题,需要到这个网去手动下载依赖。
https://www.debian.org/distrib/packages#search_packages
选择自己的PC架构下的包
选个镜像站的源下载,然后dpkg -i 这个下载下来的包即可,如果这个包再报请重复刚才的步骤,直到我们想装的包装好。
- 切到kali用户,并给chrome-sandbox赋权4755
chrome-sandbox位于/opt/Hyper
下
然后注销当前root用户,切到kali
此时hyper就安装好了
- 安装hyper插件
(此时还在kali用户里)
安装插件需要科学,否则很有可能安装不成功,但是proxychains在这里用不了,需要把科学配成全局。
需要使用这个库redsocks
,这个库最香的是kali自带了他,改改配置文件。
vi /etc/readsocks.conf
然后再terminal输入redsocks直接就启动了。
然后ss -lntp|more
查看是否有在监听12345这个端口。
然后运行肉师傅给的脚步
1 | 不重定向目的地址为服务器的包 |
修改shadowsocks那一行的ip即可
可以开始安装插件辣~hyper i hyperinator
hyper i hyperpwn
分别运行这两行代码,安装好之后
update一下hyper,倘若有通知弹出来说rawgithubuser ….这个的话可以看看这篇文章
https://www.cnblogs.com/sinferwu/p/12726833.html
查看so的所有符号
- 7z x 相应的apk
- nm -s 想查看的.so
导出所有的符号
nm -s 想查看的.so |grep method
查看so的基址
gdb查看相应函数的内容
示例:(两个相加的地址取自上图)
x/20i 0xbf0d6000+0x00002e38
下断点
b *(0xbf0d6000+0x00002e38)
也可以b 函数导出符号名
直接下段导出函数时,因为arm三级流水线(取值、译码、执行三者会同时执行)的关系,pc(程序计数器,主要用来存地址)需要+8
反编译某个导出函数
disassemble 导出函数名
例如
hypepwn查看汇编上一次操作的值(快捷键)
ctrl+shift+PgUp
操作前:
操作后:
回到当前状态就是ctrl+shift+PgDn