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 }}
长度
帮助文档
static 静态方法与实例方法
可变参数 可变参数的本质就是数组,实参可以为0个或任意多个
可变参数的实参可以为数组,只能传一个数组参数
封装 把属性私有,定义公开的get、set方法来验证数据合理性
继承 语法
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相关的系统函数
使用方式 先安装依赖
attach模式,抓包内容可以保存成pcap文件供后续分析,使用WireShark
python r0Capture.py -U com.qiyi.video -v -p iqiyi.pcap
spawn模式
python r0capture.py -U com.qiyi.video -v
windows系统证书库
app界面控件查看 使用这个Android SDK\tools\uiautomatorviewer.bat 新版的SDK已经没有,虚拟机有旧的
配置frida的代码提示f 在js工程下输入:
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查看帮助