手机需要root

刷入kernelsu

刷入Kali NetHunter

刷入Kali NetHunter后可以通过strace命令直接跟踪所有的系统调用

刷入Kali NetHunter相当于在原android内核的基础上打上了补丁,对驱动程序做了一些修改,可以使用Arrack-ng工具进行渗透,模拟鼠标键盘进行HID Badusb工具,模拟CDROM利用手机绕开计算机开机密码,一键部署Mana钓鱼热点等功能

基础知识

android系统的基础知识

系统架构

  • linux内核层 android的内核与linux内核基本一致,但是android内核去掉了大部分的驱动程序,只保留了最基本的驱动程序,如CPU,内存,硬盘,网络等驱动程序,所以android内核非常小,只有几MB大小.

  • 系统运行库 android 5.0之前使用Dalvik 虚拟机 libdvm.so,5.0之后使用ART虚拟机 libart.so

  • 应用框架层 应用框架层相当于Linux层级的so文件,用于给android的Java层提供API.加壳和未加壳的APP,其框架层的代码在应用层代码加载前就存在.

  • 应用层 应用层是Android系统中最上层的部分,包括各种应用程序,如通讯录,浏览器,设置等.应用层代码是Java代码,运行在ART虚拟机中.

Android的四大组件

  • Activity Activity是Android应用中最基本的组件,用于显示用户界面,可以包含一个或多个界面元素,如按钮,文本框等.一个应用可以有多个Activity,每个Activity都有自己的生命周期,当用户切换到另一个Activity时,当前Activity会被暂停或停止.

  • Service Service是Android应用中用于在后台执行任务的组件,可以执行一些耗时的操作,如下载文件,播放音乐等.一个应用可以有多个Service,每个Service都有自己的生命周期,当用户切换到另一个应用时,当前Service会被暂停或停止.

  • BroadcastReceiver BroadcastReceiver是Android应用中用于接收系统或应用发出的广播消息的组件,可以用于接收系统或应用发出的各种事件,如电话拨入,短信接收等.一个应用可以有多个BroadcastReceiver,每个BroadcastReceiver都有自己的生命周期,当用户切换到另一个应用时,当前BroadcastReceiver会被暂停或停止.

  • ContentProvider ContentProvider是Android应用中用于共享数据的组件,可以用于在不同应用之间共享数据,如联系人,短信等.一个应用可以有多个ContentProvider,每个ContentProvider都有自己的生命周期,当用户切换到另一个应用时,当前ContentProvider会被暂停或停止.

Android开发的基础

仅逆向相关的基础知识

src/main包含了APP的主体部分,通常存储代码文件,界面描述文件,资源文件以及AndroidManifest.xml文件.AndroidManifest.xml文件是Android应用的配置文件,包含了应用的名称,版本号,权限,组件等信息.(Android四大组件必须在这个文件中声明,不然无法使用)

资源代码

比如R.layout.activity_main,其中R是自动生成的类,layout是文件夹,activity_main是文件名,main是文件后缀名,而R.layout.activity_main是activity_main.xml文件的唯一标志id. 可以修改activity_main.xml视图文件,可以修改里面的控件.其中android:id="@+id/button"中的id是控件的唯一标识符,可以在代码中通过findViewById方法获取控件对象,然后通过控件对象调用方法来操作控件.例如

kotlin
Button button = findViewById(R.id.button);
button.setText("Hello World!");
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) { 
      Log.i("MainActivity", "Button clicked!");
    }
})

这里的Log.i是Android中用于输出日志的方法,其中i表示info级别,还有Log.d,Log.w,Log.e等级别."MainActivity"是日志的标签,用于标识日志的来源,"Button clicked!"是日志的内容.

Android逆向过程中常用命令

包括adb命令,frida命令,apktool命令,apk签名命令等.

常用的Linux命令

ps命令,查看当前设备运行的进程,在Android8以后,ps命令只能打印出当前进程,需要加上-e参数才能打印全部进程.

bash
ps -e

netstat命令

该命令输出App运行过程中所使用的网络端口,包括TCP和UDP端口.通常使用的参数组合为-alpe.其中-a表示显示所有端口,包括监听和非监听端口;-l表示只显示监听端口;-p表示显示进程ID和进程名称;-e表示显示扩展信息,包括TCP和UDP端口的状态.netstat -alpe命令可以查看当前设备上所有监听端口的状态,包括TCP和UDP端口的状态.

bash
netstat -alpe | grep -E "tcp|udp"

lsof命令

该命令可以查看当前设备上所有打开的文件,包括网络连接,进程,设备等.通常使用的参数组合为-i.其中-i表示显示网络连接.例如lsof -i命令可以查看当前设备上所有打开的网络连接.

bash
lsof -i
lsof -p 1234 -l -n -i # 1234为进程id

top命令

该命令可以查看当前设备上所有进程的运行状态,包括CPU使用率,内存使用率,进程ID,进程名称等.通常使用的参数组合为-n 1.其中-n表示刷新次数,1表示只刷新一次.例如top -n 1命令可以查看当前设备上所有进程的运行状态.

bash
top -n 1

常用的adb命令

adb命令用于连接Android设备,并执行各种操作,如安装应用,卸载应用,查看设备信息等.

bash
adb devices
adb shell
adb push
adb pull
adb install
adb uninstall
adb logcat
adb shell ps

adn shell getprop ro.product.cpu.abi
# 查看CPU架构
adb shell getprop ro.build.version.release # 查看Android版本
adb shell getprop ro.product.brand # 查看设备品牌
adb shell getprop ro.product.model # 查看设备型号
adb shell getprop ro.product.manufacturer # 查看设备制造商
adb shell getprop ro.serialno # 查看设备序列号


adb shell dumpsys activity top
# 查看当前处于前台的Activity

adb shell dumpsys activity
#查看当前所有Activity的信息

adb shell dumpsys package
#查看当前所有应用的包名

adb shell dumpsys package <package-name>
#查看当前包信息,包括四大组件信息以及MIME等相关信息

adb shell dumpsys window
#查看当前所有窗口的信息

adb shell dumpsys window displays
#查看当前所有显示器的信息

adb shell dumpsys window policy
#查看当前窗口策略的信息

adb shell dumpsys window manager
#查看当前窗口管理器的信息

adb shell dbinfo <package-name>
# 查看APP使用数据库的信息,包括执行操作的语句等信息

adb shell screencap -p <path>
# 截屏

adb shell screenrecord <path>
# 录屏

# am命令主要用于启动和停止Android应用或服务,以及发送广播等操作.
adb shell am start -n <package-name>/<activity-name>
# 启动APP

adb shell am force-stop <package-name>
# 强制停止APP

adb shell am broadcast -a <action-name>
# 发送广播

adb shell am instrument -w <package-name>/<instrumentation-class>
# 启动Instrumentation

# pm命令主要用于管理Android应用,包括安装,卸载,更新等操作.
adb shell pm list packages
# 列出所有已安装的APP

adb shell pm path <package-name>
# 查看APP的安装路径

adb shell pm dump <package-name>
# 查看APP的详细信息

adb shell pm clear <package-name>
# 清除APP的数据

adb shell pm uninstall <package-name>
# 卸载APP

adb shell pm install <path>
# 安装APP

adb shell input text <text>
# 在屏幕选中的输入框输入文本

frida

frida是一个动态插桩工具,可以在运行时修改和注入代码到目标进程中,可以用于调试,测试,逆向工程等场景.可以用于Windows,Mac,Linux,Android,iOS调试,并且开源免费.该框架不仅能java层Hook还能Native层Hook。不过持久化需要依赖Xposed等框架。 如果手上有源码,就算带调试符号的二进制文件,也可以直接使用GDB,lldb连上去进行调试,不需要使用Frida. Frida使用的是Python,JavaScript等语言,可以编写脚本进行Hook操作,也可以使用Frida提供的API进行更复杂的操作.

frida的安装

bash
pip install frida-tools

如果不是对本机调试,那还需要安装frida-server,并且需要将frida-server push到手机上,然后启动frida-server。

bash
adb push frida-server /data/local/tmp/  #一般/data目录需要授权,但/data/local/tmp是个例外
adb shell chmod 755 /data/local/tmp/frida-server
adb shell /data/local/tmp/frida-server &
安装提示插件

fridaExtension FridaGPT

frida基本介绍

Frida一般有两种操作方式,一种是通过命令行,一种是通过脚本(这种模式称为RPC模式,使用python注入javascript脚本)。命令行一般用于快速测试,脚本一般用于持久化。 Frida注入也有两种方式,一种是通过加上-f参数制定包名以spawn模式,一种是通过attach。spawn是创建一个新的进程(已经打开也会重启),attach是附加到一个已经存在的进程上。如果不加-f参数默认使用attach模式。

frida的常用命令

bash
frida-ps -U
# 查看当前设备上所有进程

## java层hook

frida -U -l hook.js -f com.example.app --no-pause
# 在com.example.app上运行hook.js脚本,不暂停应用

## native层hook

frida -U -l hook.js -f com.example.app --no-pause

### frida的常用命令

``` bash
frida-ps -U
# 查看当前设备上所有进程

## java层hook


## 安装

```bash
pip install frida-tools

美版系统联网后依然出现"此wifi网络无法访问互联网"

美版系统联网后依然出现"此wifi网络无法访问互联网"以及时间不同步

bash
adb shell settings put global captive_portal_http_url https://www.google.cn/generate_204
adb shell settings put global ntp_server 1.hk.pool.ntp.org  # 修改为国内服务器