尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

安卓逆向学习笔记(三)初识smali语法

安卓逆向学习笔记(三)初识smali语法 *一、课程目标*1.了解JVM、Dalvik、ART2.初识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或1Bbyte字节类型返回字节Sshort短整数类型返回数字Cchar字符类型返回字符Iint整数类型返回数字Jlong 64位 需要2个寄存器存储长整数类型返回数字Ffloat单浮点类型返回数字Ddouble 64位 需要2个寄存器存储双浮点类型返回数字stringString文本类型返回字符串Lxxx/xxx/xxxobject对象类型返回对象常用指令*关键字**注释*const重写整数属性真假属性内容只能是数字类型const-string重写字符串内容const-wide重写长整数类型多用于修改到期时间。return返回指令if-eq全称equal(ab)比较寄存器ab内容相同则跳if-ne全称not equal(a!b)ab内容不相同则跳if-eqz全称equal zero(a0)z即是0的标记a等于0则跳if-nez全称not equal zero(a!0)a不等于0则跳if-ge全称greater equal(ab)a大于或等于则跳if-le全称little equal(ab)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代指“thisp1表示函数的第一个 参数p2代表函数中的第二个参数。而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法*四、课后小作业*把第二关作为例子点击想要完成的功能点按操作找到关键字打开jadx-gui调整设置使得可以直接搜索中文关闭转义并保存打开apk搜索定位在左下角smali代码中可以直接搜索图示函数直接定位定位具体实现分析代码见上文该工具适合静态分析修改需要使用mt管理器破解会员方法1修改寄存器的值在mt管理器中搜索定位修改v0值为0xa后续就会跳转到cond_15处此处会判断是不是会员找到判断函数将寄存器值改为1保存退出重新安装即可方法2修改判断图中判断改为if-le后续会跳转至cond_15处上方判断了会员状态此处改为if-nez会跳转至cond_43处效果方法3强制跳转比较v0和v0相同则跳转说明跳转的位置效果1.关掉视频自己复现三种方法2.完成这个作业demo(因为最近实在是太太太忙了绝对不是因为我懒咕咕咕。搞懂这个demo那也基本上能理解本节课的内容)丑小鸭师傅的demo链接https://pan.baidu.com/s/1cUInoi 密码07p9原文链接教我兄弟学Android逆向02 破解第一个Android程序主要参考https://www.52pojie.cn/thread-1701353-1-1.html
返回列表