首页 > 其他分享 >【安卓】安卓逆向-初识0x0

【安卓】安卓逆向-初识0x0

时间:2023-08-21 15:33:06浏览次数:44  
标签:p0 const 安卓 0x0 widget 初识 寄存器 Landroid 跳转

环境搭建

面具(magisk)介绍

Magisk 是一套用于定制 Android 的开源软件,支持高于 Android 5.0 的设备

关于面具有如下的优点:

  • MagiskSU:为应用程序提供root访问权限
  • Maisk模块:通过安装模块修改只读分区
  • MagiskHide:从根目录/系统完整性隐藏面具(防止一些软件的检查)
  • MagiskBoot:目前最完整的安卓镜像启动和重新打包工具

安装步骤

跟着这个教程一步一步来吧:雷电模拟器9.0.56安装Magisk+LSPosd

安装完成之后大概就是这样子了

APK文件结构

文件 注释
assets目录 存放APK的静态资源文件,比如视频,音频,图片等
lib 目录 armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的android设备,x86常见用于android模拟器,其目录下的.so文件是c或c++编译的动态链接库文件
META-INF目录 保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否又被修改)
res目录 res目录存放资源文件,包括图片,字符串等等,APK的脸蛋由他的layout文件设计
AndroidMainfest.xml文件 APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息
classes.dex文件 classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑
resources.arsc文件 resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源

关于AndroidManifest.xml

AndroidManifest.xml文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity,Service,Content provider和BroadcastReceiver组件信息。每个应用程序在根目录下必须包含一个AndroidManifest.xml文件,且文件名不能修改。它描述了package中暴露的组件,他们各自的实现类,各种能被处理的数据和启动位置。

属性 定义
versionCode 版本号,主要用来更新,例如:12
versionName 版本名,给用户看的,例如:1.2
package 包名,例如:com.zj.52pj.demo
uses-permission android:name="" 应用权限,例如:android.permission.INTERNET 代表网络权限
android:label="@string/app_name" 应用名称
android:icon="@mipmap/ic_launcher" 应用图标路径
android:debuggable="true" 应用是否开启debug权限

什么是JVM、Dalvik、ART

JVM是JAVA虚拟机,运行JAVA字节码程序
Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable)
Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异

smali及其语法

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

关键字

名称 注释
.class 类名
.super 父类名,继承的上级类名名称
.source 源名
.field 变量
.method 方法名
.register 寄存器
.end method 方法名的结束
public 公有
protected 半公开,只有同一家人才能用
private 私有,只能自己使用
.parameter 方法参数
.prologue 方法开始
.line xxx 位于第xxx行

数据类型对应

smali类型 java类型 注释
V void 无返回值
Z boolean 布尔值类型,返回0或1
B byte 字节类型,返回字节
S short 短整数类型,返回数字
C char 字符类型,返回字符
I int 整数类型,返回数字
J long (64位 需要2个寄存器存储) 长整数类型,返回数字
F float 单浮点类型,返回数字
D double (64位 需要2个寄存器存储) 双浮点类型,返回数字
string String 文本类型,返回字符串
Lxxx/xxx/xxx object 对象类型,返回对象

常用指令

关键字 注释
const 重写整数属性,真假属性内容,只能是数字类型
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 获取寄存器数据

其余指令可用语法工具查询

定位方法:搜索弹窗关键字、抓取按钮id

修改方法:修改判断、强制跳转、修改寄存器的值

反编译

使用的是这个反编译工具jadx-gui(拿个教程demo,没有壳),静态分析

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

案例

要充值大会员,​ 既然我们需要绕过这里充值,就需要找到反汇编的代码

不能直接修改Java代码,只能修改Smali代码

 

​ 成功的找到了这个对应的方法名,在Java代码方法名上面是有一一对应的

梳理一下逻辑,直接看代码

//一个私有、静态、不可变的方法   方法名
.method private static final onCreate$lambda-2(Lkotlin/jvm/internal/Ref$IntRef;Lcom/zj/wuaipojie/ui/ChallengeSecond;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/view/View;)Z //(这里面是方法的参数)这里是方法返回值类型,表示布尔值类型,返回假或真
    .registers 7  //寄存器数量

    .line 33  //代码所在的行数
    iget p0, p0, Lkotlin/jvm/internal/Ref$IntRef;->element:I  //读取p0(第一个参数,参考寄存器知识)中element的值赋值给p0

    const/4 p5, 0x1  //p5赋值1

    const/16 v0, 0xa //v0赋值10,在16进制里a表示10

    if-ge p0, v0, :cond_15  //判断p0的值是否大于或等于v0的值(即p0的值是否大于或等于10),如果大于或等于则跳转到:cond_15

    .line 34  //以下是常见的Toast弹窗代码
    check-cast p1, Landroid/content/Context; //检查Context对象引用

    const-string p0, "请先获取10个硬币哦" //弹窗文本信息,把""里的字符串数据赋值给p0

    check-cast p0, Ljava/lang/CharSequence; //检查CharSequence对象引用

    invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; 
    //将弹窗文本、显示时间等信息传给p1

    move-result-object p0  //结果传递给p0

    invoke-virtual {p0}, Landroid/widget/Toast;->show()V  //当看到这个Toast;->show你就应该反应过来这里是弹窗代码

    goto :goto_31  //跳转到:goto_31

    :cond_15 //跳转的一个地址

    invoke-virtual {p1}, Lcom/zj/wuaipojie/ui/ChallengeSecond;->isvip()Z  //判断isvip方法的返回值是否为真(即结果是否为1)

    move-result p0  //结果赋值给p0

    if-eqz p0, :cond_43 //如果结果为0则跳转cond_43地址

    const p0, 0x7f0d0018  //在arsc中的id索引,这个值可以进行查询

    .line 37
    invoke-virtual {p2, p0}, Landroid/widget/ImageView;->setImageResource(I)V //设置图片资源

    const p0, 0x7f0d0008

    .line 38
    invoke-virtual {p3, p0}, Landroid/widget/ImageView;->setImageResource(I)V

    const p0, 0x7f0d000a

    .line 39
    invoke-virtual {p4, p0}, Landroid/widget/ImageView;->setImageResource(I)V

    .line 40
    sget-object p0, Lcom/zj/wuaipojie/util/SPUtils;->INSTANCE:Lcom/zj/wuaipojie/util/SPUtils; 

    check-cast p1, Landroid/content/Context;

    const/4 p2, 0x2 //p2赋值2

    const-string p3, "level" //sp的索引

    invoke-virtual {p0, p1, p3, p2}, Lcom/zj/wuaipojie/util/SPUtils;->saveInt(Landroid/content/Context;Ljava/lang/String;I)V //写入数据

    goto :goto_50 //跳转地址

    :cond_43

    check-cast p1, Landroid/content/Context;

    const-string p0, "\u8bf7\u5148\u5145\u503c\u5927\u4f1a\u5458\u54e6\uff01" //请先充值大会员哦!

    check-cast p0, Ljava/lang/CharSequence;

    invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object p0

    invoke-virtual {p0}, Landroid/widget/Toast;->show()V

    :goto_50
    return p5  //返回p5的值
.end method //方法结束

//判断是否是大会员的方法
.method public final isvip()Z
    .registers 2

    const/4 v0, 0x0 //v0赋值0

    return v0 //返回v0的值

.end method

直接修改逻辑,,将硬币数修改成0,从而进入if判断语句,跳转到cond_15,在进行判断是否是vip,长按"isvip()"进行跳转到方法名中,进行修改将v0的值修改为1,为1则为大会员了呢

然后就成功的破解了

标签:p0,const,安卓,0x0,widget,初识,寄存器,Landroid,跳转
From: https://www.cnblogs.com/mu-yi2/p/17646157.html

相关文章

  • VR/AR眼镜方案,MTK联发科平台智能眼镜安卓主板设计方案
    随着人工智能在不同领域的逐渐深入,人们对一款产品的需求不再局限于某种单一的功能或单一场景,尤其是在工业医疗等专业领域,加快数字化转型才能实现产业的升级。AR智能眼镜,是一个可以让现场作业更智能的综合管控设备。采用移动互联网、大数据和云计算等技术,现场数据的采集与分析;同时实......
  • 计算机萌新的成长历程——初识C语言3
    今天我将继续分享数据类型的相关内容,本篇的主要内容将围绕short/int/long/longlong——整型数据类型的区别。在介绍他们的区别前,首先我们要先了解计算机中的单位,计算机的单位有以下几种单位:bit——比特位,计算机中最小的单位,1个比特位只能存放一个“1”或一个“0”byte——字节,1字......
  • 计算机萌新的成长历程——初识C语言2
    今天我将分享初识数据类型的学习体会和心得。刚刚开始接触数据类型,我学习到了以下几个数据类型char——字符数据类型short——短整型int——整型long——长整型longlong——更长的整型float——单精度浮点数double——双精度浮点数下面我将分享一下我对这些数据类型的理解。理解这......
  • 计算机萌新的成长历程——初识C语言
    2020.8.12晚上11:00我自己正式下定决心开始学习C语言,通过公众号“枫月软件”安装了VisualStudio2019Professional,随后在B站上跟着鹏哥的教学视频正式开始接触C语言。(PS:鹏哥的B站名称是“c语言编程学习”)51CTO网站也是通过视频才知道,并按照要求注册账号编写自己的第一篇博客。我......
  • Qt安卓开发经验技巧总结V202308
    01:01-05pro中引入安卓拓展模块QT+=androidextras。pro中指定安卓打包目录ANDROID_PACKAGE_SOURCE_DIR=$$PWD/android指定引入安卓特定目录比如程序图标、变量、颜色、java代码文件、jar库文件等。AndroidManifest.xml每个程序唯一的一个全局配置文件,里面xml格式的......
  • 【逍遥西游中变】Linux手工服务端+安卓苹果双端
    5月整理大话回合手游【逍遥西游中变】Linux手工服务端+充值后台+安卓苹果双端压缩包内有详细的视频搭建教程,亲测有效,点击下面链接  提取码:8co9......
  • 【教程】初识云函数,实现无需服务器的项目上云!
    转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]你是否也在忧愁,想把自己的项目放在云上跑,但又不想花大价钱购买云服务器?云函数介绍        云函数(Serverless Cloud Function,SCF)的简单理解就是:可以部署在云上的项目,但不需要特地购买服务器,并且可以通过“定时/url访问......
  • 初识目标检测
    初识目标检测什么是目标检测?在图像或视频中,找到目标位置并进行分类。早期的目标检测模型是通过集成一系列手工设计的特征提取器来构造的,速度慢、精度低、跨域性能差。目标检测的目的检测出图像中所有实例的类别,并用一个轴对称的矩形框大致给出实例的位置。检测器应当识别出所......
  • Maui Blazor 安卓文字随系统文字缩放问题解决
    MauiBlazor的文字在正常情况下会随着用户手机内的系统文字设置大小而变化,所以可能导致手机应用内APP的布局由于文字变得过大或者过小而错乱。可以通过设置Webview里的文字缩放,保持应用内文字大小不变,代码如下:1.首先在Mainpage.xaml里设置好初始化事件,BlazorWebViewInitialize......
  • angular初识
    电脑环境已安装node和npm,其中node是通过nvm管理的,参考:https://www.cnblogs.com/PrintY/p/16892116.html1、安装脚手架npminstall-gangular-cli测试安装结果ng-v运行项目修改package.json(非必须)//加上--open,启动项目打开浏览器"start":"ngserve--open",vscode......