【Android-Debuging】安卓真机调试native层步骤

环境需求

android stdio套装
装这一套单纯是为了里头的tools文件夹,以及迟早要用到ndk,android开发等功能。所以配环境时可以考虑直接一步到位
ida
不用我多说了吧
一台部分root的手机
adb shell连接进去之后,shell能提权为root就行,不要求挂在adb root
建议200~300块去淘宝入个google pixel(代号seilfish)
刷机 & root教程https://www.jianshu.com/p/ec043ef9e0c3
记得开启ro.debuggable

利用 Magisk 模块永久修改 ro.debuggable & 获取 adb root


刷机后连国内wifi提示无网络,先本地调整手机时间到现在的真实时间(时间差距不大于5分钟),然后按照这个链接去改下配置文件就行:
修改NTP服务器配置以解决wifi检测错误问题

正片

首先装上需要被调试的程序,此处略。
随后使用adb push指令将ida的安卓调试服务文件上传至机器的/data/local/tmp文件夹
以root权限启动android_server(如果被调试对象是64位程序,那就使用android_server64)

然后使用下面的指令启动待调试程序
am start -D -n 包名/类名

如何找入口点class?在mainfest里头搜索关键词”LAUNCHER”
带有下图红框中关键词的activity即为安卓java层的起始activity。取它作为类名

启动:

然后执行下面的指令获取刚起起来的程序的pid,一会儿要用上
ps -ef | grep 包名

接着在主机这边的shell,使用下面俩个指令开放端口

adb forward tcp:23946 tcp:23946 //ida的调试端口
adb forward tcp:12345 jdwp:{pid} //{pid}处填写刚才获取的pid。jdwp协议有兴趣的可以去查下,这里不多讲

然后使用ida连接attach到目标进程。
当然,我们得先在Debug-Debuger Options里头做点设置

然后Debugger-Attach to Process,附加到进程。在下边的窗口中找到我们要调试的程序,然后选择它

顺利的话可以看到ida成功附加上来了

接下来我们需要让jvm跑起来。我们的目的只是调试native层,jvm我们不管。
需要使用jdb连接上目标程序
下面这一行指令中的PORT修改为之前adb forward绑定的jdwp对本机窗口,也即是12345
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port={PORT}
然后就不用管jdb这边了

剩下的,根据需求自由用ida调试nativelib吧~

瓶颈

有时候还是挺难顶的,缺少开发经验导致对一些代码始终停留于看得懂但是写不出来。这对以后的安全生涯有很大影响。
补,现在就补。
个人认为做安全并不需要特别高的开发能力。但是最基本的,怎么写,如何实现,其原理如何还是得了解。

唉、、、大学这个时间点,我本因在开心的玩才对,但是为了生计,不得不这样努力下去。

【Android壳】有关一代壳和二代壳那点事

android的加壳保护类型

  1. dex整体加壳

  2. 类抽取

    去除整体加壳之后,发现各个类成员函数的代码全部被设置为了nop

  3. vmp和dex2c

  • advmp:解释器本身用ollvm保护,被保护的函数属性变为Native
  • dcc:把dex文件整成lib,被保护的函数属性变为Native

    vmp保护中,可能出现多个函数的注册地址相同,函数逻辑相似

    dcc保护中,不同函数的注册地址不同,函数逻辑不相似

android壳的进化历史

第一代:DEX加密

对DEX进行一个整体加密。对抗调试手段和反编译手段。
这种壳通过hook掉ART加载DEX文件的函数即可完成脱壳
常用脱壳点:
有关DexFile的构造函数点或者类成员函数调用点。常见于InMemoryDexClassLoader,DexClassLader等DEX文件解析类中
都玩烂的东西,和Davlik虚拟机一样的地位————进入了历史的垃圾桶

第二代:dex抽取与so加固

大多数企业版/商用壳的实现(目前)
把DexMethod代码抽取到外部。Dex动态加载,在加载之前由so还原回去原代码。
简单的说就是把dex文件中各函数的具体指令给替换成nop,将原先的指令备份于so中。等需要执行某个函数的时候,再把原先的指令写回dex文件中。
一般情况下,二代壳都把dex2oat这个过程给ban了。因为一旦dex被解析为oat,程序再次运行的时候就会直接使用oat文件作为“指令”,二代壳的指令还原将失效!

三代壳:dex动态解密与so混淆

Dex Method代码动态解密和so代码膨胀混淆。字面意义上来理解,其实就是加更加复杂的smc和代码混淆来继续增大逆向工程难度。

二代壳:实现方式

Dex文件->函数体结构->指令全部设置为nop,并备份原线指令
hook掉dex2oat
hook掉loadMethod:
先读取dex文件,并恢复函数中的内容,再loadMethod

二代壳:破解方式

因为二代壳使用非root inlinehook技术hook掉了安卓系统的一些机制,所以直接从外部手段脱壳是比较困难的
比较可行的方式是直接修改一下android系统,从系统内部出发干他

第一步:选择脱壳点。
二代壳的原理是函数运行前才把具体指令还原回去,那么我们选择的脱壳点就得晚于这个时机。
所有的函数在进入art解释器之前,都会先经历namespace中interpter的execute函数。
在这里插入代码,直接将DexFile写入/sdcard即可

第二步: 编译系统镜像,刷入测试机

第三步:运行想要脱壳的程序

然后我们就可以在/sdcard目录下获得脱壳后的dex文件。
当然,这只是个朦胧的概述。实际上要复杂一些。我们总不能把所有程序的dex文件都dump下来。