root
root1、adb reboot bootloader
2、fastboot boot recovery.img
3、清除
4、重启
5、adb push magisk.apk /data/locla/tmp/a.zip
6、fastboot boot recover.img
7、install
8、重启
9、修改语言,卸载magisk应用,重新安装magisk的apk
10、选择安装,直接安装,重启
dex反编译工具的安装和使用
jadx的安装和使用简介jadx可以一键把apk文件还原成Java代码,使用起来很简单,功能强大,还具有一些附加功能可以辅助代码追查,其主要具有如下几个功能:
1、除了反编译apk文件,还可以反编译jar、class、dex、arr、等文件和zip文件中的Dalvik字节码
2、解码AndroidManifest.xml文件和一些来自resources.arsc中的资源文件
3、一些apk文件在打包过程中增加了java代码的混淆机制,对比jadx提供反混淆的支持。
jadx本身是一个命令行工具,仅仅通过jadx这个命令就可以反编译一个apk文件。除此之外,它也可以有配套的图形化界面工具——jadx-gui。
安装过程就略过了
jadx命令jadx xxx.apk -d xxx,运行完成后本地会生成一个xxx文件夹
jadx-gui的使用方法jadx-gui是一个图形界面工具,它就像一个IDE,支持很多方便快捷的交互式操作
保存为Gradle项目
导出后的项目目录结构和我们在 jadx-gui 界面里看到的结构基本一致,这个项目是可以被 Android Studio 工具打开的,打开之 ...
adb
adb介绍Android调试桥(adb)是一种功能多样的命令行工具,它可以让你与设备进行通信,adb命令可以用于执行各种设备操作(例如安装和调试应用),并提供对Unix shell(可用来再设备上运行各种命令)的访问权限,它是一种C/S架构的程序,包括以下三个组件:
1、客户端:主要用于发送命令,adb client在开发机器上运行,我们可以通过adb命令从命令行终端调用客户端,它主要的工作是解析像push、shell、install等命令的参数,做必要的预处理,然后转移为指令或数据,发送给adb server。
2、守护程序(adbd):是运行在Android设备(真机/模拟器)后台的一个进程,它是由init进程启动的,并且系统一开机就以及启动,它主要作用是出来来自adb server的命令行请求,然后获取对应Android设备的信息,再将结果返回给adb server。
3、服务器:是运行再开发机器上的一个后台进程,它有两个作用:1、检测usb端口感知设备的连接和拔出,以及模拟器实例的启动或停止;2、将adb client的请求通过usb或者tcp的方式发送到对 ...
题目3
CFF_100链接:https://github.com/ThunderJie/CTF-Practice/tree/master/CTF-Andorid%20Reverse/CFF2016-%E7%88%AC%E6%A5%BC%E6%A2%AF
解题思路:查看题目是需要我们点击到对应层数显示flag
setClickable()函数作用是设置控件点击无效,但是可以点击,颜色不会变灰色,也就是右边的按钮如果可以点击,那么就能够显示flag了
输入命令java -jar apktool_2.6.1.jar d CFF_100.apk对apk文件进行解包
找到setClickable函数
推测v5和v3即为true或false的标记位,v3一直为0x1,v5一直为0x0,因此考虑修改v5为0x1
再输入命令java -jar apktool_2.6.1.jar b CFF_100进行重打包
这里进行重打包时有问题,以我目前水平还是无法解决
DD-Androideasy and smali
DD-Android Easy链接:https://github.com/ThunderJie/CTF-Practice/tree/master/CTF-Andorid%20Reverse/DD%20-%20Android%20Easy解题思路:下载完成后发现是.zip格式,将后缀改为.apk格式,安装到模拟器中,发现是输入注册码的题目
用jeb打开分析
可以看出只要得到字符串i的值便可以得到flag
解密脚本:p = [-40, -62, 107, 66, -126, 103, -56, 77, 122, -107, -24, -127, 72, -63, -98, 64, -24, -5, -49, -26, 79, -70, -26, -81, 120, 25, 111, -100, -23, -9, 122, -35, 66, -50, -116, 3, -72, 102, -45, -85, 0, 126, -34, 62, 83, -34, 48, -111, 61, -9, -51, 114, 20, 81, -126, -18, 27, -115, -76, -11 ...
Androideasy&simplecheck
androideasy链接:https://github.com/ThunderJie/CTF-Practice/tree/master/CTF-Andorid%20Reverse/androideasy解题思路:文件下载后发现是zip格式,将后缀改为.apk然后用jeb打开进行分析
对于一般比较简单的题目,我们只需要找到函数的入口,即MainActivity中onCreate方法下的onClick点击事件,因为是找注册码(flag),那就肯定有一个按钮负责判断注册码是正确,这个按钮的点击事件是否正确,这个按钮的点击事件就是用onClick实现的,所以大部分这种题目直接找onClick就对了。我们双击之后可以看到以下代码,这里是smali代码。
java代码如下
这里是要调用MainActivity的check()函数来判断flag是否正确,我们直接定位到check()函数
分析函数内容,可以看出数组v0即是我们输入的注册码,根据if语句可以确定注册码的长度和s[]数组一样有31位,下面又有一个if语句判断即为我们的关键语句:s[i]==chars[i]^23 ...
Android常见风险2
安卓常见风险Android重打包风险风险:插入广告、扣费
防范措施:使用一些混淆工具,阻止反编译,加壳
敏感数据明文保存风险含义:对app来说重要的数据
防范措施:不能放在公共区域
组件越权风险防范措施
android:exported = "false"
WebView跨域访问风险安卓应用克隆漏洞原理分析及复现(CNVD-2017-36682)
ContentProvider目录遍历漏洞组件拒绝服务漏洞讲解安全审计工具Drozer的安装与使用下载地址:https://github.com/WithSecureLabs/drozer
出现这个图片即算成功(中间过程复杂,都可以询问gpt)
使用
Drozer代码阅读从drozer console connect命令中drozer.bat开始
drozer.bat
@echo offpython.exe "%~dp0drozer" %*
Android常见风险1
安卓常见风险Android重打包风险风险:插入广告、扣费
防范措施:使用一些混淆工具,阻止反编译,加壳
敏感数据明文保存风险含义:对app来说重要的数据
防范措施:不能放在公共区域
组件越权风险防范措施
android:exported = "false"
WebView跨域访问风险(明天再更,难度太大,一时难以理解)
Arm
Arm汇编工具网站谷歌官网:https://developer.arm.com/documentation-beta/
ARM汇编-opcode转换:http://armconverter.com
寻址方式1、立即数寻址:mov r0,#0x1
2、寄存器寻址:mov r0
3、寄存器间接寻址:ldr r0,[r1]
4、寄存器偏移寻址:mov r0,r1,[r1,#4]
5、寄存器基址变址寻址:ldr r0,[r1,#4]
6、多寄存器寻址:ldmia r0,{r1,r2,r3,r4}
7、相对寻址:bl label
8、堆栈寻址:stmfd sp!,{r1-r7,lr}
9、块拷贝寻址:stmia r0,{r1-r7}
跳转指令B label:直接跳,无条件,需要条件就B后面增加条件
BL:跳转之前,下一条指令地址保存到LR寄存器中,然后再调
MOV PC,LR:直接修改PC指针,实现跳转
LDR PC,0x?:和上一条一样,修改PC寄存器
传参参数小于等于4:用r0,r1,r2,r3
大于4:多出来的用栈
内联汇编方式asm(“指令” :输出 :输入 :变化寄存器);
方式asm ...
Smali
Smali汇编了解安卓虚拟机Dalvik虚拟机JIT(Just-In-Time Compile 即时编译),高频率使用代码空闲时间编译好并存储到内存
Art虚拟机AOT(Ahead-Of-Time 预先编译) 一次编译好,oat文件
头文件定义与接口实现(“<>”表示可选)
.class作用:定义类,包括包名和类名
格式:.class <访问权限> [关键修饰字] <完整类名> (“<>”表示可选)
.super作用:定义所属父类
格式:.super <父类完整类名>
.source作用:指定该smail代码所属java源文件
格式:.source <java源代码名称>
.implements作用: 声明实现接口类名称
格式:.implements <接口类名>
静态变量作用:相当于全局变量,跟类实例没关系,属于类
格式:.field <访问权限> static [修饰词] <字段名> : <变量类型>
.field <访问权限> stat ...

