cmd常用快捷键

新选项卡: ctrl+shift+d/t

划分窗格: alt+shift+d/加号/减号

关闭窗格: ctrl+shift+w

调整窗格: alt+shift+方向键

窗格切换: alt+方向键

Java

位运算符

右移>>

4 -> 0000 0100
4 >> 1 -> 0000 0010

Hex编码

1 byte = 8 bit
每个十六进制数对应4个二进制位

数组

初始化方法

静态初始化

元素类型[] 数组名 = new 元素类型[]{元素,元素,、、、}
int[] arr = new int[]{1,2,3,4,5}
int[] arr = {1,2,3,4,5}
相当于
int[] arr = new int[5]
arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5

动态初始化

元素类型[] 数组名 = new 元素类型[数组长度]
int[] arr = new int[5]

二维数组

定义

int[][] arr = new int[2][3];
arr[0][1] = 78;

int[][] arr = new int[2][]; arr[0] = new int[2]; arr[1] = new int[3];

int[][] arr = {{1,2,3},{4,5,6}}

长度

arr.length;
arr[0].length

帮助文档

https://www.matools.com/

static

静态方法与实例方法

  • 静态方法中只能调用静态方法,不能访问实例属性

  • 实例方法中可以调用静态方法和实例方法,也可以访问静态属性和实例属性

可变参数

可变参数的本质就是数组,实参可以为0个或任意多个

可变参数的实参可以为数组,只能传一个数组参数

static int sum(int... a)

封装

把属性私有,定义公开的get、set方法来验证数据合理性

继承

语法

class 子类 extends 父类

adb

构成

  • client端,在电脑上,负责发送adb命令
  • daemon守护进程adbd,在手机上,负责接收和执行adb命令
  • server端,在电脑上,负责管理client和daemon之间的通信

工作原理

  • client端将命令发送给server端
  • server端会将命令发送给daemon端
  • daemon端进行执行
  • 将执行结果,返回给server端
  • server端将结果再返回给client端

配置

在sdk下的platform-tools下

常用命令

adb version 显示adb版本和路径
adb start-server 启动server
adb kill-server 停止server
adb devices 显示连接的设备列表
adb install xxx.apk 通过adb安装app
adb install -r xxx.apk 覆盖安装
adb uninstall 包名 通过adb卸载app

adb push xxx xxx推送电脑的文件到手机
adb pull xxx xxx拉取手机的文件到电脑
adb shell 进入到手机的Linux控制台
adb -s 设备名 shell 多设备时,指定设备

logcat

常用选项

adb logcat -help 查看帮助
adb logcat 常规显示
adb logcat -c 清除日志
adb logcat -g 显示缓冲区大小
adb logcat -G 256M 修改缓冲区大小

根据tag过滤日志

adb logcat -s xiaojianbang

根据pid过滤日志

ps -A |grep com.xiaojianbang.app 先获取进程pid
adb logcat |findstr 5568

Linux常用命令

pwd:显示当前目录的绝对路径

ls 路径:显示对应路径下的文件信息

touch:创建空文件

mkdir:创建目录

rm -rf xxx:删除

frida配置

安装

pip install frida-14.2.18-cp38-cp38-win_amd64.whl
pip install frida==14.2.18
pip install frida-tools==9.2.5

判断安装成功

frida --version 显示出frida版本说明frida tools安装成功
python进入python命令行,输入import frida,没有报错说明成功

frida-server配置

adb push ..frida-server.. /data/local/tmp/fsarm64

frida-server使用

adb shell
su
cd data/local/tmp
chmod 777 fsarm64
./fsarm64

注意

python的环境变量的改变不会是pip中python路径改变,如果在安装时勾选了add to path后期又改变python的位置,使用pip时会出错

rocapture

原理:Hook了一些SSL相关的系统函数

使用方式

先安装依赖

pip install hexdump

attach模式,抓包内容可以保存成pcap文件供后续分析,使用WireShark

python r0Capture.py -U com.qiyi.video -v -p iqiyi.pcap

spawn模式

python r0capture.py -U com.qiyi.video -v

windows系统证书库

certlm.msc

app界面控件查看

使用这个Android SDK\tools\uiautomatorviewer.bat
新版的SDK已经没有,虚拟机有旧的

配置frida的代码提示f

在js工程下输入:

npm i @types/frida-gum

frida的使用

frida -UF -l test1.js
U表示连接到usb线连接的设备, l是路径
ps -A | grep fsarm:查找fsarm进程
kill pid:结束进程

frida-hook

进行hook的步骤

1、找到类  Java.use("完整类名")
2、hook类的方法 方法名.implementation = function

java hook的代码都要写在Java.perform中

例子

hook非重载方法

Java.perform(function(){
var jsonRequest = Java.use("com.dodonew.online.http.JsonRequest");
console.log("jsonRequest: ",jsonRequest);
jsonRequest.paraMap.implementation = function(a){
console.log("param: ",a);
this.paraMap(a);
}
});

hook重载方法

  • 使用.overload(‘ 完整参数类型’,’完整参数类型’……)
Java.perform(function(){
var jsonRequest = Java.use("com.dodonew.online.http.JsonRequest");
console.log("jsonRequest: ",jsonRequest);
jsonRequest.addRequestMap.overload('java.util.Map','int').implementation = function(a,b){
console.log("paramexi1: ",a," param2: ",b);
this.addRequestMap(a,b);
}
});

报错

TypeError: cannot set property 'implementation' of undefined
at <anonymous> (/test1.js:7)
at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:11)
at _performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:238)
at <anonymous> (frida/node_modules/frida-java-bridge/index.js:213)
at <anonymous> (frida/node_modules/frida-java-bridge/lib/vm.js:11)
at _performPendingVmOpsWhenReady (frida/node_modules/frida-java-bridge/index.js:232)
at perform (frida/node_modules/frida-java-bridge/index.js:192)
at <eval> (/test1.js:8)
意思是没找到类或方法

向下转型进行参数打印

Java.cast(a,Java.use("java.util.HashMap")) //第一个参数,要转换的对象;第二个参数,要转换的类,需要类,不是字符串
Java.perform(function(){
var jsonRequest = Java.use("com.dodonew.online.http.JsonRequest");
jsonRequest.addRequestMap.overload('java.util.Map','int').implementation = function(a,b){
var c = Java.cast(a,Java.use("java.util.HashMap"));
console.log(c.toString());
}
});

hook构造方法

Java.perform(function(){
var dESKeySpec = Java.use("javax.crypto.spec.DESKeySpec");
dESKeySpec.$init.overload("[B").implementation = function(a){
console.log("DESKeySpec: ",a)
this.$init(a);
}

});


静态方法的主动调用

Java.perform(function(){
var base64 = Java.use("android.util.Base64");
var dESKeySpec = Java.use("javax.crypto.spec.DESKeySpec");
dESkeySpec.$init.overload("[B").implementation = function(a){
console.log("DESKeySpec params: ",base64.encodeToString(a,0));
this.$init(a);
}
});

frida查看帮助

frida --help