首页
文章分类
逆向网安
中英演讲
杂类教程
学习笔记
前端开发
汇编
数据库
.NET
服务器
Python
Java
PHP
Git
算法
安卓开发
生活记录
读书笔记
作品发布
人体健康
网上邻居
留言板
欣赏小姐姐
关于我
Search
登录
1
利用AList搭建家庭个人影音库
4,655 阅读
2
浅尝Restful Fast Request插件,一句话完成 逆向过程
3,944 阅读
3
完美破解The Economist付费墙
2,714 阅读
4
i茅台app接口自动化csharp wpf实现,挂机windows服务器每日自动预约
2,607 阅读
5
青龙面板基本使用并添加修改微信/支付宝步数脚本
2,030 阅读
Search
标签搜索
PHP
Laravel
前端
csharp
安卓逆向
JavaScript
Python
Java
爬虫
抓包
Git
winform
android
Fiddler
Vue
selenium
LeetCode
每日一题
简单题
docker
Hygge
累计撰写
95
篇文章
累计收到
445
条评论
首页
栏目
逆向网安
中英演讲
杂类教程
学习笔记
前端开发
汇编
数据库
.NET
服务器
Python
Java
PHP
Git
算法
安卓开发
生活记录
读书笔记
作品发布
人体健康
页面
网上邻居
留言板
欣赏小姐姐
关于我
用户登录
搜索到
1
篇与
的结果
2023-07-24
第二篇Android逆向:初识smali破解vip
一、基本概念1.什么是JVM、Dalvik、ARTJVM是JAVA虚拟机,运行JAVA字节码程序Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable)Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异2.smali及其语法smali是Dalvik的寄存器语言,smali代码是dex反编译而来的。关键字名称注释.class类名.super父类名,继承的上级类名名称.source源名.field变量.method方法名.register寄存器.end method方法名的结束public公有protected半公开,只有同一家人才能用private私有,只能自己使用.parameter方法参数.prologue方法开始.line xxx位于第xxx行数据类型对应smali类型java类型注释Vvoid无返回值Zboolean布尔值类型,返回0或1Bbyte字节类型,返回字节Sshort短整数类型,返回数字Cchar字符类型,返回字符Iint整数类型,返回数字Jlong (64位 需要2个寄存器存储)长整数类型,返回数字Ffloat单浮点类型,返回数字Ddouble (64位 需要2个寄存器存储)双浮点类型,返回数字stringString文本类型,返回字符串Lxxx/xxx/xxxobject对象类型,返回对象常用指令关键字注释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例子://一个私有、静态、不可变的方法 方法名 .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修改方法:修改判断、强制跳转、修改寄存器的值3.寄存器在smali里的所有操作都必须经过寄存器来进行:本地寄存器用v开头数字结尾的符号来表示,如v0、 v1、v2。 参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2。特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0代指“this",p1表示函数的第一个 参数,p2代表函数中的第二个参数。而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法)二、实现修改教程中使用的是jadx来分析smail代码,然后通过mt管理器打包修改。最近逛看雪论坛发现一个神器GDA,可以分析并直接完成打包。目标: 长按一键三连按钮可以点亮图标2.1 定位关键类2.1.1 搜索关键字直接搜索关键字大会员2.1.2 抓取按钮id分析界面布局,获取控件Id-Hex切换Mt管理器,使用Dex编辑器++打开Classes.dex,搜索控件2.2 修改方式2.2.1 修改判断分析图按下R重打包运行2.2.2 强制跳转2.2.3 修改寄存器的值三、实战demo搜索关键字登录失败可以直接拿到密钥引用1.《安卓逆向这档事》三、初识smali,vip终结者:https://www.52pojie.cn/thread-1701353-1-1.html2.[原创]基于Smali即时编译的DEX静态补丁技术实现:https://bbs.kanxue.com/thread-278098.htm3.GDA-android-reversing-Tool:https://github.com/charles2gan/GDA-android-reversing-Tool4.GJoy Dex Analyzer(GDA),亚洲第一款全交互式的现代反编译器,同时也是世界上最早实现的dalvik字节码反编译器。:http://www.gda.wiki:9090/
2023年07月24日
377 阅读
0 评论
0 点赞