Smali语法基础
Smali是什么
Smali是Android虚拟机的反汇编语言。
我们都知道,Android代码一般是用java编写的,执行java程序一般需要用到java虚拟机,在Android平台上也不例外,但是出于性能上的考虑,并没有使用标准的JVM,而是使用专门的Android虚拟机(5。0以下为Dalvik,5。0以上为ART)。Android虚拟机的可执行文件并不是普通的class文件,而是再重新整合打包后生成的dex文件。dex文件反编译之后就是Smali代码,所以说,Smali语言是Android虚拟机的反汇编语言。掌握Smali有哪些好处
1、动态调试APK,通常静态分析APK是不够的,如果需要彻底分析APK的执行逻辑,需要通过动态调试来进行。
具体教程参考:https:www。jianshu。comp9931a1e77066
2、修改APK运行逻辑,通过修改Smali代码,再重新编译打包成新的APK,是Android逆向的基本操作。Smali基本语法数据类型
语法关键词
寄存器
Java中变量都是存放在内存中的,Android为了提高性能,变量都是存放在寄存器中的,寄存器为32位,可以支持任何类型。
为什么寄存器比内存快,可以参考这篇文章:http:www。ruanyifeng。comblog201310register。html
寄存器分为如下两类:
1、本地寄存器
用v开头数字结尾的符号来表示,v0,v1,v2,。。。
2、参数寄存器
用p开头数字结尾的符号来表示,p0,p1,p2,。。。
注意:
在非static方法中,p0代指this,p1为方法的第一个参数。
在static方法中,p0为方法的第一个参数。
Smali代码示例:const4v0,0x1把值0x1存到v0本地寄存器iputbooleanv0,p0,Lcomaaa;IsRegisterd:Z把v0中的值赋给com。aaa。IsRegistered,p0代表this,相当于this。Isregisteredtrue成员变量
成员变量定义格式为:
。fieldpublicprivate〔static〕〔final〕varName:类型
获取指令
iget,sget,igetboolean,sgetboolean,igetobject,sgetobject
操作指令
iput,sput,iputboolean,sputboolean,iputobject,sputobject
array的操作是aget和aput
指令解析
sgetobjectv0,Lcomaaa;ID:LjavalangString;
获取ID这个String类型的成员变量并放到v0这个寄存器中
igetobjectv0,p0,Lcomaaa;view:Lcomaaaview;
igetobject比sgetobject多一个参数p0,这个参数代表变量所在类的实例。这里p0就是this
Smali代码示例1:const4v3,0x0sputobjectv3,Lcomaaa;timer:Lcomaaatimer;
相当于java代码:this。timernull;
Smali代码示例2:。localv0,args:LandroidosMessage;const4v1,0x12iputv1,v0,LandroidosMessage;what:I
相当于java代码:args。what18;
其中args为Message的实例函数
函数定义格式为:
。methodpublicprivate〔static〕〔final〕methodName()类型
。endmethod
Smali代码示例。methodprivateifRegistered()Z。locals2本地寄存器的个数。prologueconst4v0,0x1v0赋值为1ifeqzv0,:cond0判断v0是否等于0,等于0则跳到cond0执行const4v1,0x1符合条件分支:goto0标签returnv1返回v1的值:cond0标签const4v1,0x0cond0分支goto:goto0跳到goto0执行。endmethod
函数分为两类:directmethod和virtualmethod
directmethod就是private方法,virtualmethod就是指其余的方法。
调用指令:
invokedirect
invokevirtual
invokestatic
invokesuper
invokeinterface
调用格式:
invoke指令类型{参数1,参数2,。。。},L类名;方法名
如果不是是静态方法,参数1代表调用该方法的实例。
Smali代码示例:conststringv0,NDKLIBinvokestatic{v0},LjavalangSystem;loadLibrary(LjavalangString;)V
相当于java代码:System。loadLibrary(NDKLIB)
函数返回结果
Smali需要用指令moveresult或moveresultobject来保存函数返回的结果
Smali代码示例:conststringv0,Ericinvokestatic{v0},Lcmbpbi;t(LjavalangString;)LjavalangString;moveresultobjectv2
表示将方法t返回的String对象保存到v2中。方法的定义privatestaticintsum(inta,intb){returnab;}
使用编译后是这样。methodprivatestaticsum(II)I。locals4表示需要申请4个本地寄存器。parameter。parameter这里表示有两个参数。prologue。line27movev0,p0。localv0,a:Imovev1,p1。localv1,b:Imovev2,v0movev3,v1addint2addrv2,v3movev0,v2。endlocalv0a:Ireturnv0。endmethod
从上面可以看到函数声明使用。method开始。endmethod结束,java中的关键词private,static等都可以使用,同时使用签名来表示唯一的方法,这里是sum(II)I。指令执行
smali字节码是类似于汇编的,如果你有汇编基础,理解起来是非常容易的。
比如:
movev0,v3把v3寄存器的值移动到寄存器v0上。
constv0,0x1把值0x1赋值到寄存器v0上。
invokestatic{v4,v5},LmeismingmyapplicationMainActivity;sum(II)I执行方法sum(),v4,v5的值分别作为sum的参数条件跳转分支ifeqvA,vB,:condx如果vA等于vB则跳转到:condxifnevA,vB,:condx如果vA不等于vB则跳转到:condxifltvA,vB,:condx如果vA小于vB则跳转到:condxifgevA,vB,:condx如果vA大于等于vB则跳转到:condxifgtvA,vB,:condx如果vA大于vB则跳转到:condxiflevA,vB,:condx如果vA小于等于vB则跳转到:condxifeqzvA,:condx如果vA等于0则跳转到:condxifnezvA,:condx如果vA不等于0则跳转到:condxifltzvA,:condx如果vA小于0则跳转到:condxifgezvA,:condx如果vA大于等于0则跳转到:condxifgtzvA,:condx如果vA大于0则跳转到:condxiflezvA,:condx如果vA小于等于0则跳转到:condx
转自:https:www。jianshu。compba9b374346dd
更多资料:https:www。52pojie。cnthread40864511。html
国产机为什么再怎么堆料都卖不过苹果?就凭安卓系统下一个APP要一堆权限,我一辈子也不会用它!个人喜好,无所谓国产不国产,更不要拿爱国来道德绑架,一个通讯工具而已,和爱国主义联系在一起它配吗!谢邀!其实并不是这样的,从
697071岁养老金调整差距有多大?697071岁养老金调整会有多大差距,这个没有设置前提条件是不好做对比的。首先可以肯定的是69周岁以及70周岁以上退休人员养老金调整幅度肯定会有一些区别。目前各省在落实养老金调整方
纠结,Q5LXC60都看了,不知道怎么选,请过来人指点?就这两台车来说,XC60更可靠些。因为奥迪Q5L用的是和大众一样的2。0T发动机和七速双离合变速箱。过来人都知道,大众涡轮增压发动机烧机油问题一直没解决,国六排放的车型都增加了颗粒
吃厦门泡面是怎样一种体验?老厦门人绝对知道这款泡面!5毛一包到现在的1块多,作为90后的我来说,童年不少日子可以说都是靠这个打发的,我那个时候应该已经7毛左右一包了吧,厦门泡面里面没有像康师傅那种3包调味料
中国有很多知名白酒,前10名位置怎么排?谢邀,根据国家名酒排名,酱香型,茅台酒,郎酒。浓香型,五粮液酒,泸州老窖特曲,剑南春酒,洋河大曲酒,古井贡酒。清香型,汾酒,黄鹤楼酒,药香型,董酒。目前中国有很多白酒,每个省份都有
学习电商怎么学?哥们儿,说良心话啊,我不太建议新手学电商开网店!不是这行不赚钱也不是这行没前途,而是对于没人教没人带没资源的群体而言,实在太难太难了。举个例子,就像一个小学毕业的成年人,没技术没人
虚寒体质到底有没有可能改善?该怎么做?虚寒体质到底有没有可能改善?该怎么做?首先谢谢你的邀请,我只是一个村医。虚寒体质到底有没有可能改善,当然可以改善了,我们先看看,虚寒体质是怎么形成的,知道了形成虚寒体质的原因,然后
踏空新能源,踩雷白马股,明年靠什么回本?毓美美作答自去年下半年持有白马股至今未放手的散户而言,心情都是难于言表的。经历了一波过山车的刺激,体尝了利润从快速飞升又极速回吐后,到目前依然两手空空,甚至亏损累累。尤其看到新能源
怎样修炼成一名合格的交易员?我做了十几年的交易,14年前后也曾搞过团队接资金托管,现在偶尔做做培训,纯粹的野生交易者(自学自悟)这篇文章,我想从主观经历和旁观听闻的角度来聊一聊对于交易员成长的看法,希望能给关
吃饭的时候同事让我帮她代付款一下,之后也不给我钱,两次了,之后碰到我该怎么办?我的一个同事也是,她买早点的时候从来不给别人捎带,别人买早点的时候,她就让人捎带,别人给捎来了,从来不说给钱,如此几次,再也没有人帮她捎早点了!其实,便宜都是人家给你占的,不给你,
儿子学了3个课外班,妻子还想让他学钢琴,我不同意,该怎么办?学钢琴,把街舞课停了!因为练钢琴可以促进小孩大脑神经元发育,可以变聪明,以后上学背书都会比别的孩子快,专注力和记忆力比不学琴的孩子要强很多。若是剖腹产出生的孩子,更要从小练钢琴,可