安卓逆向入门-安全合规
安卓逆向入门-安全合规Android基础Android要求所有APK使用证书进行数字签名,否则无法安装或更新。签名利用摘要和非对称加密技术确保APK 由开发者发布且未被修改,摘要是用哈希算法计算出来的APK内部文件唯一映射值,相当于APK指纹。签名用开发者私钥进行加密。用户端安装APK时系统重新计算APK文件摘要,用开发者公钥解密签名中摘要,两者对比一致则说明APK来源可信且未被修改。
Android 11及之前支持4中应用签名方案。v1签名是最基本的基于JAR的签名方案。v2签名在Android 7引入,提高验证速度并增强完整性保证。v3签名在Android 9引入,支持密钥轮替。v4签名在Android 11引入,根据APK所有字节计算得出Merkle哈希树,需要通过v2或v3签名进行补充,签名信息单独存储在.apk.idsig文件中。应用验证时,系统优先寻找并校验最高版本的签名,无法找到则逐级向下寻找,直到找到兼容的签名方案。
签名后应用中新增META-INF文件夹,文件夹中包含3个文件。MANIFEST.MF记录应用中每个文件的Hash摘要,除了META-INF文件夹。*.SF ...
安卓逆向入门-Native层入门
安卓逆向入门-Native层入门入门动态注册方法:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include <jni.h>#include <string>#include "aes_utils.h"#include "tools.h"#include "junk.h"#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))JNIEXPORT jstring JNICALL method02(JNIEnv *env, jclass jcls, jstring str_) { if (str_ == nullptr) return nullptr; const char *str = env->GetStringUTFChars(str_, JNI_F ...
安卓逆向入门-Android后端开发入门
安卓逆向入门-Android后端开发入门Activity在一个Android应用中,多个Activity组成Activity栈,当前活动的Activity位于栈顶,之前的被压入下面,成为非活动Activity,等待是否可能被恢复为活动状态。Activity声明周期中有4个状态:
状态
描述
运行状态
当前Activity,位于Activity栈顶,用户可见,可获得焦点
暂停状态
失去焦点的Activity,仍然可见
停止状态
被其他Activity覆盖,不可见,但保存所有状态信息。低内存状态可能被系统kill
销毁状态
该Activity结束
生命周期中回调方法有:
方法
描述
onCreate
创建Activity时被回调
onStart
启动Activity时被回调
onResume
由暂停恢复为活动状态时调用
onPause
暂停Activity时被回调
onRestart
重启Activity时被回调
onStop
停止Activity时被回调
onDestroy
销毁Activity时被回调
创建Activi ...
Linux二进制分析入门
Linux二进制分析入门碎碎念常用工具:
123456789101112131415161718objdump -D <elf_object> #ELF文件所有节的数据或代码objdump -d <elf_object> #ELF文件程序代码objdump -tT <elf_object> #所有符号objcopy -only-section=.data <infile> <outfile> #把某文件.data段复制到另一个文件中strace /bin/ls -o ./ls.out #跟踪ls系统调用strace -p <pid> -o daemon.out #附加的现存进程上strace -e read=3 /bin/ls #对每个SYS_read(3,buf,sizeof(buf))其中文件描述符3内容查看ltrace <program> -o program.out #打印共享库/静态库符号readelf -S <object> #查询节头表readelf -l <object ...
安卓逆向入门-DEX文件格式初探
安卓逆向入门-DEX文件格式初探整体本篇为Android 10的DEX文件格式,分为:
12345678910111213DEX头部:HeaderDEX数据索引:STRING_IDSTYPE_IDSPROTO_IDSFIELD_IDSMETHOD_IDSDEX数据:CLASS_DEFDATA
定义在dalvik/libdex/DexFile.h:
12345678910111213141516171819202122232425262728293031/* * Structure representing a DEX file. * * Code should regard DexFile as opaque, using the API calls provided here * to access specific structures. */struct DexFile { /* directly-mapped "opt" header */ const DexOptHeader* pOptHeader; /* ...
安卓逆向入门-Unidbg入门
安卓逆向入门-Unidbg入门入门Unidbg是个基于Unicorn的逆向工具,可黑盒调用Android和iOS的so文件。它不需要直接运行App或逆向so文件,通过在App中找到对应JNI接口,用Unicorn引擎直接执行该so文件。
先给Intellij IDEA配Maven环境。先下载Maven:https://maven.apache.org/download.cgi,并将\apache-maven-3.9.9\bin目录添加到环境变量,在IDEA设置中“构建、执行、部署\-\>构建工具\-\>Maven”的主路径设为\apache-maven-3.9.9,用户配置文件为\apache-maven-3.9.9\conf\settings.xml,本地仓库自己随便搞一个,取消使用\.mvn/maven\.config中的设置。再在“Maven\-\>运行程序”中虚拟机选项添加-DarchetypeCatalog=internal。
打开settings.xml,在mirrors标签内添加一个mirror块:
123456<mirror> <i ...
安卓逆向入门-Unicorn入门
安卓逆向入门-Unicorn入门入门安装:
1pip install unicorn capstone
入门:
12345678910111213from unicorn import *from unicorn.x86_const import * #32-bit x86X86_CODE32=b"\x41\x4a" #INC ecx;DEC dex;ADDRESS=0x1000000 #模拟运行时地址mu=Uc(UC_ARCH_X86,UC_MODE_32) #初始化Unicorn实例 硬件架构、硬件模式mu.mem_map(ADDRESS,2*1024*1024) #再ADDRESS处映射2MB内存空间 所有CPU操作只能访问该内存 默认权限rwx 首地址和内存长度必须为0x1000整数倍 否则抛出UC_ERR_ARG异常mu.mem_write(ADDRESS,X86_CODE32) #代码装入分配的内存中mu.reg_write(UC_X86_REG_ECX,0x1234) #设置寄存器值mu.reg_write(UC_X86_REG_EDX,0x7890 ...
安卓逆向入门-Frida入门
安卓逆向入门-Frida入门环境准备12345678910pip install frida frida-tools objection frida-dexdump jnitrace#objection需要安装比frida晚的版本 有必要时自己指定一下版本号 frida应为14.2.18及之前版本frida --version #根据版本去Github下载相应frida-serveradb push ./frida-server-16.3.3-android-x86_64 /data/local/tmpadb shellsucd /data/local/tmpmv ./frida-server-16.3.3-android-x86_64 ./frida-serverchmod 777 ./frida-server./frida-server #运行不了则尝试setenforce 0关闭SELinuxfrida-ps -U #另开一个终端
对于Objection 1.11.0的打开\\Lib\\site-packages\\objection\\commands\\frida_comma ...
安卓逆向入门-安全基线
安卓逆向入门-安全基线安卓OWASP10组件安全Android有Activity、Service、ContentProvider、Broadcast Receiver、Indent五大组件,不需要进行跨应用运行的组件需要在AndroidManifest.xml中将属性android\:exported设为false,否则该组件可被任意应用启动,被恶意调用。实在需要设为true的组件应用android\:permission指定自定义权限,如下:
123456789101112131415<permission android:name="example.permission.USESERVICE" android:protectionLevel="normal"/><service android:name="com.example.haohai.helloWorldService" android:exported="true" android:label="@string/a ...
安卓逆向入门-基础知识
安卓逆向入门-基础知识adb常用命令:
12345678910111213141516171819adb devicesadb install *.apkadb install -r -t *.apk #升级/覆盖 测试模式adb uninstall *.apk #卸载adb push 本地路径 设备路径adb pull 设备路径 本地路径 #若所在文件夹需要root 则先转移到/sdcard再拉取adb logcat > log.txtadb shell dumpsys package 包名 #获取指定应用详细信息 包名如com.example.myappadb shell dumpsys activity top #查看当前应用activity信息adb shell dumpsys dbinfo 包名 #查看数据库信息、执行操作的查询语句等adb shell dumpsys meminfo 包名/进程ID #查看内存信息adb shell input text "xxx" #在屏幕选中输入框内输入文字 不能中文adb shell pm list packa ...