查看: 298|回复: 0

[技术分享] 《安卓逆向这档事》三、初识smali,vip终结者

[复制链接]
累计签到:206 天
连续签到:1 天

219

主题

1689

回帖

9974

积分

版主

自出洞来无/敌手,得饶人处且饶人。

名望
145
星币
2114
星辰
38
好评
411

夜猫子勋章实习版主勋章版主勋章中秋勋章星座专属勋章星辰勋章灌水天才奖鼎力支持奖热心助人奖优秀会员奖明星会员奖魅力会员奖欢乐天使奖国庆节勋章在线大神动漫大使幸运猪

发表于 2023-7-27 20:02:16 | 显示全部楼层 |阅读模式

注册登录后全站资源免费查看下载

您需要 登录 才可以下载或查看,没有账号?立即注册

×
转载自吾爱破/解精华帖正已

一、课程目标
1.了解JVM、Dalvik、ART
2.初识smali语法
3.实战修改smali
二、工具
1.教程Demo(更新)
2.MT管理器/NP管理器
3.雷电模拟器
4.jadx-gui
5.核心破/解
三、课程内容
1.什么是JVM、Dalvik、ART
JVM是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或1
Bbyte字节类型,返回字节
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方法)
四、课后小作业
1.关掉视/频自己复现三种方法
2.完成这个作业demo(因为最近实在是太太太忙了,绝对不是因为我懒,咕咕咕。搞懂这个demo那也基本上能理解本节课的内容)
丑小鸭师傅的demo
链接:https://pan.baidu.com/s/1cUInoi 密码:07p9
原文链接:教我兄弟学Android逆向02 破/解第一个Android程序
五、反思&答疑
关于jadx搜不到大会员的unicode编码,这是因为我录视/频之前在设置里把unicode的转义打开而导致的,像你们第一次安装jadx都是默认关闭这个选项的,所以能直接搜到大会员的汉字!!!
由于准备不是很充足,我感觉我讲的不是太好,多看看我列举参考文档有利于理解smali语法。
对于开发者而言,在打包应用时,最好对代码进行混淆,否则逆向人员轻而易举得进行Crack,或者说在写代码的时候就不要用isvip、getvip等易辨识的单词作为方法名
待更新
六、视/频及课件地址
百度云
阿里云
PS:阿里云在维护,暂时看不到第三课内容
哔哩哔哩
PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压
七、其他章节
八、参考文档
【原木文章】Android改造者之路-02.初探smali功法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|偏爱技术社区-偏爱技术吧-源码-科学刀-我爱辅助-娱乐网--教开服-游戏源码

偏爱技术社区-偏爱技术吧-源码-科学刀-我爱辅助-娱乐网-游戏源码

Powered by Discuz! X3.5

GMT+8, 2024-4-28 00:07 , Processed in 0.084808 second(s), 33 queries .

快速回复 返回顶部 返回列表