安卓相关环境配置

devtools/2024/9/20 4:06:04/ 标签: android

安卓相关环境配置

偶尔更新。。。

JEB(动态调试好用)

JEB动态调试Smali-真机/模拟器(详细,新手必看) 夜步城

JADX官网(静态分析)

https://github.com/skylot/jadx/releases/tag/v1.5.0

雷电模拟器自己去官网下

Magisk 面具

https://www.52pojie.cn/thread-1583586-1-1.html

LSPosed官网

https://github.com/LSPosed/LSPosed/releases/download/v1.8.6/LSPosed-v1.8.6-6712-zygisk-release.zip

MT管理器(吾爱破解论坛里搜)

adb (记得加环境变量)

https://developer.android.google.cn/tools/releases/platform-tools?hl=zh-cn#downloads

android studio(不太行,甚至打不开xml文件,环境难配)

https://developer.android.google.cn/studio?hl=zh-cn

吐槽一下插件套娃:Magisk->LSPosed->核心破解

文章目录

  • 安卓相关环境配置
    • 1. 模拟器环境配置
    • 2. 小概念
    • 3. smali语法
    • 4. 使用JEB进行动态调试
    • 5. debug模式调试
    • 参考

1. 模拟器环境配置

雷电模拟器9,设置把root权限开一下,然后重启

在这里插入图片描述

磁盘共享(可写入)

在这里插入图片描述

将magisk安装目录里的app-debug.apk拖入模拟器中。

点击magisk->永久记住选择->安装->允许

点击右下角的正方形按钮,然后中间向左拖动退回关掉。

在这里插入图片描述

点击magisk->安装->下一步->安装至系统分区->开始

然后重启雷电模拟器,进magisk设置,把Zygisk开启

更多->共享文件->打开电脑文件夹

在这里插入图片描述

把下载好的LSPosed.zip文件拖进共享文件夹

在这里插入图片描述

magisk点击右下角模块->从本地安装->选择Picture目录下的LSPosed.zip进行安装

在这里插入图片描述

重启雷电模拟器,下拉状态栏,打开LSPosed管理器

在这里插入图片描述

在LSPosed仓库里下载核心破解(MT管理器改了xml后,apk不用验证签名就可以安装)。

若模拟器没挂代理,则把网址复制一下,在主机访问进行下载,再把安装包拖进模拟器。

模拟器安装核心破解后,需要启动核心破解模块,然后重新启动。

2. 小概念

详见正己佬的视频

apk 全称 Android Package,它相当于一个压缩文件,只要在电脑上将apk后缀改为zip即可解压。

classes.dex是APK运行的主要逻辑。

Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable)

Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异

安卓四大组件

组件描述
Activity(活动)在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表 Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。
Service(服务)Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等。
Broadcast Receiver(广播接收器)一个用于接收广播信息,并做出对应处理的组件。比如我们常见的系统广播:通知时区改变、电量低、用户改变了语言选项等。
Content Provider(内容提供者)作为应用程序之间唯一的共享数据的途径,Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数据都是使用Content Provider形式,供开发者调用的(如视频,音频,图片,通讯录等)

3. smali语法

smali是Dalvik的寄存器语言,smali代码是dex反编译而来的。类似汇编

关键字

名称注释
.class类名
.super父类名,继承的上级类名名称
.source源名
.field变量
.method方法名
.local v0,"bytes":[B定义局部变量v0为字节数组,"bytes"是局部变量的名称(调试时有用)
.register寄存器
.end method方法名的结束
public公有
protected半公开,只有同一家人才能用
private私有,只能自己使用
.parameter方法参数
.prologue方法开始
.line xxx位于第xxx行

数据类型对应

smali类型java类型注释
Vvoid无返回值
Zboolean布尔值类型,返回0或1
Bbyte字节类型,返回字节
Sshort短整数类型,返回数字
Cchar字符类型,返回字符
Iint整数类型,返回数字
Jlong (64位 需要2个寄存器存储)长整数类型,返回数字
Ffloat单浮点类型,返回数字
Ddouble (64位 需要2个寄存器存储)双浮点类型,返回数字
stringString文本类型,返回字符串
Lxxx/xxx/xxxobject对象类型,返回对象
[Iint[]int数组
[[Iint[][]二维整型数组
[Ljava/lang/StringString对象数组

常用指令

关键字注释
const重写整数属性,真假属性内容,只能是数字类型,const/4为4bit数字
const-string重写字符串内容
const-wide重写长整数类型,多用于修改到期时间。
return返回指令
if-eq全称equal(a=b),比较寄存器ab内容,相同则跳
if-ne全称not equal(a!=b),ab内容不相同则跳
if-eqz全称equal zero(a=0),z即是0的标记,a等于0则跳
if-nez全称not equal zero(a!=0),a不等于0则跳
if-ge全称greater equal(a>=b),a大于或等于则跳
if-le全称little equal(a<=b),a小于或等于则跳
goto强制跳到指定位置
switch分支跳转,一般会有多个分支线,并根据指令跳转到适当位置
iget获取寄存器数据

调用方法

invoke-virtual {v0, v1}, Ljava/lang/String;->length()I
//调用`v0`对象的实例方法`length()`,传参为`v1`,返回值类型为`Int`invoke-super {v0, v1}, Ljava/lang/Object;->toString()Ljava/lang/String;
//v0重写了Object类的toString方法,这里调用了Object类原本的toString方法invoke-direct {v0}, Lcom/example/MyClass;-><init>()V
//调用实例的私有方法、构造方法或者父类的私有方法invoke-static {}, Ljava/lang/Math;->random()D
//调用静态方法,由于静态方法属于类而非类的实例,因此调用时不需要对象引用。invoke-interface {v0}, Ljava/util/List;->size()I
//v0是实现了List接口的对象的引用,调用List接口中的方法size()invoke-custom {v0, v1}, Ljava/lang/invoke/LambdaMetafactory;->metafactory(...)Ljava/lang/invoke/CallSite;
//用于动态绑定方法调用

结果处理

invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v0
//将这个返回的字符串对象引用移动到寄存器v0中move-result v0
//将前一个函数调用返回的基本数据类型的结果移动到指定的寄存器中。const/4 v1, 0x5
move v0, v1  //将v1中的值0x5移动到v0中

​ 在smali里的所有操作都必须经过寄存器来进行:本地寄存器用v开头数字结尾的符号来表示,如v0、 v1、v2。 参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2。特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0代指“this",p1表示函数的第一个 参数,p2代表函数中的第二个参数。而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法)

4. 使用JEB进行动态调试

想要动态调试,首先得修改debug权限

​ 法一:在AndroidManifest.xml里添加可调试权限

android:debuggable="true"

在这里插入图片描述

​ 法二:XappDebug模块hook对应的app

​ 法三:Magisk命令(重启失效)

1.  adb shell #adb进入命令行模式
2.  su #切换至超级用户
3.  magisk resetprop ro.debuggable 1
4.  stop;start; #一定要通过该方式重启

自行下载吾爱破解第五课的课后作业

安装配置好JEB

shift+鼠标滚轮	代码横向滚动
Ctrl+B	打断点
Tab 根据java代码找到smali代码所在处

jadx全局搜索无效后,全局搜索unsuccessed,追踪onClick函数

在这里插入图片描述

在这里插入图片描述

jadx追踪checkSN

private boolean checkSN(String userName, String sn) {  // 如果用户名为空,直接返回false  if(userName == null) {  return false;  }  try {  // 检查用户名非空且SN非空且长度为16  if(userName.length() != 0 && (sn != null && sn.length() == 16)) {  // 获取MD5 MessageDigest实例  MessageDigest digest = MessageDigest.getInstance("MD5");  digest.reset();//注意:reset()在这里实际上是多余的,因为每次new MessageDigest实例时,它都是初始化的 digest.update(userName.getBytes()); // 这里使用默认字符集编码,可能在不同环境中导致不同结果  // 将字节数组转换为十六进制字符串  String hexstr = MainActivity.toHexString(digest.digest(), "");  // 尝试将十六进制字符串转换为字符数组StringBuilder sb = new StringBuilder();  int i;  for(i = 0; true; i += 2) { // 无限循环,直到i超出hexstr长度  if(i >= hexstr.length()) {  // 这里应该是比较整个转换后的字符串与sn  return sb.toString().equalsIgnoreCase(sn);  }  // 这里直接将单个十六进制字符转换为字符,而不是每两个十六进制字符转换为一个字节的字符sb.append(((char)hexstr.charAt(i))); //(char)会将十六进制字符转换为ASCII字符  }  }  }  catch(NoSuchAlgorithmException e) {  // MD5算法通常总是可用的,这里的catch块可能永远不会执行  e.printStackTrace();  }  // 如果没有匹配,返回false  return false;  
}

在这里插入图片描述

JEB反编译一下并找到return sb.toString().equalsIgnoreCase(sn); 的位置,按Tab键,使左侧smali代码跟踪到该函数位置,然后Ctrl+B打断点。

在这里插入图片描述

雷电模拟器启动apk程序,JEB附加进程调试

在这里插入图片描述

程序输入用户名,注册码(必须16位),点击注册

在这里插入图片描述

JEB查看v5寄存器的值,实际就是注册的sn码。

在这里插入图片描述

a96fa7cd071995a2

在这里插入图片描述

5. debug模式调试

  • **普通模式:**无法调试界面的 创建,即 onCreate 函数
  • **debug 模式:**可以调试 界面的 onCreate 函数,即刚开始创建界面是就开始调试

下载攻防世界android-app-100的附件。

模拟器设置里面,版本号点击7次以上进入开发者模式。

系统->高级->开发者选项->打开USB调试

模拟器MT管理器->安装包提取->查看附件安装包->修改AndroidManifest.xml

加上android:debuggable="true"

在这里插入图片描述

可以选择不签名,然后虽然校验不通过,但是可以安装(已经核心破解)。

把修改后的安装包通过共享文件夹的方式传到主机。

jadx查看应用程序包名/应用程序入口界面,因为MT没充会员,xml与真实的有出入。

在这里插入图片描述

主机开启cmd

adb shell am start -D  -n 应用程序包名/应用程序入口界面
adb shell am start -D -n com.example.ctf2/.MainActivity

然后模拟器打开程序,JEB附加调试

在这里插入图片描述

在这里插入图片描述

然后在输入框输入东西,再点login就会断在断点处。

但是这题IsCorrect函数在运行时加载,没法步入函数,需要IDA打开libadnjni.so才能看到逻辑。

在这里插入图片描述

是个字符串比较函数

ef57f3fe3cf603c03890ee588878c0ec就是注册码

参考

  1. 吾爱破解安卓逆向入门教程《安卓逆向这档事》一、模拟器环境搭建

  2. 《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修 正己

  3. 最新Windows安装adb方法 飞⑧风暴

  4. JEB动态调试Smali-真机/模拟器(详细,新手必看) 夜步城

  5. Smali基础语法总结 bmjoker

  6. 安卓逆向_5 — jeb 和 AndroidStudio 动态调试 smali 擒贼先擒王


http://www.ppmy.cn/devtools/96917.html

相关文章

最新图像修复论文汇总(2024年以来)(三)

汇总了自2024年以来新提出的高质量图像修复工作&#xff0c;包含扩散模型、transformer、mamba、sam等最前沿的技术&#xff0c;其中一些是ICLR、ICML、CVPR、ECCV、ACM MM 2024年的新作。 这里是第三部分&#xff0c;还有两部分请参阅。 最新图像修复论文汇总&#xff08;20…

redis散列若干记录

字典 redis本身使用字典结构管理数据 redis使用hash表实现字典结构 使用了什么hash算法 使用SipHash算法&#xff0c;该算法能有效防止Hash表碰撞&#xff0c;并有不错的性能 hash冲突怎么解决 使用链表法解决hash冲突 hash表如何扩容 渐进式扩容&#xff0c;不会引起线程长期阻…

springboot的自动配置原理

一、自动配置的原理 Spring Boot 的自动配置原理主要基于以下几个核心概念和步骤&#xff1a; 1. 条件注解 (Conditional Annotations)&#xff1a;Spring Boot 使用 Conditional 系列注解来决定是否加载某个配置类或 Bean。这些注解包括但不限于&#xff1a; ConditionalO…

机器学习中的多模态学习

多模态学习(MultiModal Machine Learning,MMML)是一种结合多种不同类型或模态的数据和信息进行统一建模和分析的学习方法。其核心目标是通过机器学习的方法实现对多源模态信息的处理和理解。 多模态学习的基本概念与定义 多模态学习可以涵盖各种不同的数据类型,如图像、文…

ESP32CAM人工智能教学18

ESP32CAM人工智能教学18 获取数据并显示 如果我们给ESP32Cam外挂一些传感器&#xff08;比如温湿度传感器、超声波测距传感器、红外人体传感器等&#xff09;&#xff0c;我们怎么把ESP32Cam捕获到的数据&#xff0c;传递到客户端的浏览器&#xff0c;并在网页index.html中显示…

Redis非关系型数据库

Redis是什么 Redis&#xff1a;REmote DIctionary Server&#xff08;远程字典服务器&#xff09; 是完全开源免费的&#xff0c;用C语言编写的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的&#xff08;Key/Value&#xff09;分布式内存数据 库&#xff0c;基于内存运行…

react18 + ts 使用video.js 直播.m3u8格式的视频流

一、安装依赖 我使用的video.js版本是8.17.3&#xff0c;从 Video.js 7.x 开始&#xff0c;HLS 支持被内置到了 Video.js 中所以不需要安装其他依赖 npm i video.js 二、创建VideoPlayer组件 import React, { useEffect, useRef } from react import videojs from video.js …

使用Webstorm进行高效的全栈JavaScript开发

使用WebStorm进行高效的全栈JavaScript开发是一个很好的选择&#xff0c;因为WebStorm是JetBrains出品的一款功能强大的IDE&#xff0c;专为前端和后端开发者设计&#xff0c;支持JavaScript、TypeScript、Node.js、React、Vue.js、Angular等多种技术栈。以下是一些建议&#x…

Linux软件编程day(12) -udp

任务&#xff1a; 1.利用套接字实现两台主机全双工通信 socket socket bind 发一次数据(数据可以随便) 接收一次数据(目的&#xff1a;接收发送方的IPPort) 两个任务 …

saas服务,对同一个功能,需要使用不同客户的接口。那么哪种设计模式可以解决我的问题?

Q: 我现在遇到的问题&#xff1a;我在做一个saas服务&#xff0c;现在面对多家客户。对同一个功能&#xff0c;需要使用不同客户的接口。比如&#xff0c;我的发送短信功能&#xff0c;每个客户的发消息接口都不同。那么哪种设计模式可以解决我的问题&#xff0c;可以使用c#来给…

Redis:缓存击穿,缓存穿透,缓存雪崩

缓存穿透 缓存和数据库中都没有的数据&#xff0c;可用户还是源源不断的发起请求&#xff0c;导致每次请求都会到数据库&#xff0c;从而压垮数据库。 这将导致这个不存在的数据每次请求都要到存储层去查询&#xff0c;失去了缓存的意义。 *** 解决方案** 对空值进行缓存标…

应急响应:挖矿木马-实战 案例一.【Linux 系统-排查和删除】

什么是挖矿木马 挖矿木马是一种恶意软件&#xff0c;它在未经用户许可的情况下&#xff0c;利用用户的计算资源来挖掘加密货币&#xff0c;从而为攻击者带来非法收益。这类软件通常通过多种手段传播&#xff0c;例如利用系统漏洞、弱密码爆破、伪装正常软件等方法感染目标设备…

【CTF | WEB】003、攻防世界WEB题目之xff_referer

文章目录 xff_referer题目描述:解题思路&#xff1a;XFF与Referer基本了解1. XFF&#xff08;X-Forwarded-For&#xff09;&#xff1a;2. Referer&#xff1a;简单总结&#xff1a; 解题实操&#xff1a; xff_referer 题目描述: X老师告诉小宁其实xff和referer是可以伪造的。…

Springboot-从服务器获取一个输入流,转成视频文件存到oss

要在Spring Boot应用中从服务器获取一个输入流,然后将该流转换为视频文件并存储到阿里云 OSS中,你可以遵循以下步骤: 设置阿里云OSS客户端:首先,你需要配置阿里云OSS客户端,以便能够上传文件到OSS。 获取输入流:使用HTTP客户端(如RestTemplate或WebClient)从服务器…

c语言通过逻辑运算符和if语句制作招聘筛选程序

c语言里逻辑运算符 && 逻辑与 a&&b || 逻辑或 a||b ! 逻辑非 逻辑运算符计算结果是true和false,其中用1表示true,0表示false 这里要制作一个招聘筛选程序&#xff0c;要求年龄大于等于25&#xff0c;身高不低于1米7 代码如下 #include<s…

4.4、配置交换机vlan

一、配置前的碎碎恋 前面大致了解了二层交换机的一些缺点&#xff0c;还有什么是vlan&#xff0c;不同vlan之间的通信。 接下来看看配置交换机vlan用到哪些命令&#xff1a; 1.进入全局配置模式 Switch> enable Switch# configure terminal Switch(config)# 2. 创建VLAN…

结合GPT与Python实现端口检测工具(含多线程)

端口检测器是一个非常实用的网络工具&#xff0c;它主要用于检测服务器或本地计算机上的特定端口是否处于开放状态。通过这个工具&#xff0c;你可以快速识别和诊断网络连接问题&#xff0c;确保关键服务的端口能够正常接收和处理数据。这对于网络管理员和开发者来说是一个不可…

【PGCCC】使用 Postgres 递归 CTE 进行图形检索

您是否知道可以将 Postgres 用作某些用例的图形数据库&#xff1f; 假设您有如下图表&#xff1a; 我们可以在 NetworkX 中构建此图&#xff1a; 1import networkx as nx23G nx.Graph()45G.add_edges_from([6 ("A", "B"),7 ("A", "…

Windows 环境下 Go 语言使用第三方压缩包 gozstd 的报错处理

该文章主要记录在windows平台用go语言使用gozstd包时&#xff0c;遇到的错误及处理过程&#xff08;踩坑之旅&#xff09;&#xff01; 一、gozstd简介 gozstd是一个针对Zstandard&#xff08;简称Zstd&#xff09;的Go语言包装器&#xff0c;它提供了简单且高效的API&#xf…

从0开发一个 组件/插件 并部署

从零开始发布一个 Vue3 Vite 的 npm 包 1. npm账号配置 1.1 注册新账号 注册地址&#xff1a; www.npmjs.com/signup 1.2 登录账号 在命令行输入&#xff1a; npm login&#xff0c;此时会提醒你打开浏览器进行登录&#xff0c;然后邮件接收验证码&#xff0c;输入登录 …