范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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.com/p/9931a1e77066
  2、修改APK运行逻辑,通过修改Smali代码,再重新编译打包成新的APK,是Android逆向的基本操作。Smali基本语法数据类型
  语法关键词
  寄存器
  Java中变量都是存放在内存中的,Android为了提高性能,变量都是存放在寄存器中的,寄存器为32位,可以支持任何类型。
  为什么寄存器比内存快,可以参考这篇文章:http://www.ruanyifeng.com/blog/2013/10/register.html
  寄存器分为如下两类:
  1、本地寄存器
  用v开头数字结尾的符号来表示,v0, v1, v2,...
  2、参数寄存器
  用p开头数字结尾的符号来表示,p0,p1,p2,...
  注意:
  在非static方法中,p0代指this,p1为方法的第一个参数。
  在static方法中,p0为方法的第一个参数。
  Smali代码示例:const/4 v0, 0x1 //把值0x1存到v0本地寄存器 iput-boolean v0,p0,Lcom/aaa;->IsRegisterd:Z //把v0中的值赋给com.aaa.IsRegistered,p0代表this,相当于this.Isregistered=true 成员变量
  成员变量定义格式为:
  .field public/private [static][final] varName:<类型>
  获取指令
  iget, sget, iget-boolean, sget-boolean, iget-object, sget-object
  操作指令
  iput, sput, iput-boolean, sput-boolean, iput-object, sput-object
  array的操作是aget和aput
  指令解析
  sget-object v0,Lcom/aaa;->ID:Ljava/lang/String;
  获取ID这个String类型的成员变量并放到v0这个寄存器中
  iget-object v0,p0,Lcom/aaa;->view:Lcom/aaa/view;
  iget-object比sget-object多一个参数p0,这个参数代表变量所在类的实例。这里p0就是this
  Smali代码示例1:const/4 v3, 0x0 sput-object v3, Lcom/aaa;->timer:Lcom/aaa/timer;
  相当于java代码:this.timer = null;
  Smali代码示例2:.local v0, args:Landroid/os/Message; const/4 v1, 0x12 iput v1,v0,Landroid/os/Message;->what:I
  相当于java代码:args.what = 18;
  其中args为Message的实例函数
  函数定义格式为:
  .method public/private [static][final] methodName()<类型>
  .end method
  Smali代码示例.method private ifRegistered()Z     .locals 2            // 本地寄存器的个数     .prologue     const/4 v0, 0x1      //v0赋值为1     if-eqz v0, :cond_0   //判断v0是否等于0,等于0则跳到cond_0执行     const/4 v1, 0x1      //符合条件分支     :goto_0              //标签     return v1            //返回v1的值     :cond_0              //标签     const/4 v1, 0x0      //cond_0分支     goto :goto_0         //跳到goto_0执行 .end method
  函数分为两类:direct method和virtual method
  direct method就是private方法,virtual method就是指其余的方法。
  调用指令:
  invoke-direct
  invoke-virtual
  invoke-static
  invoke-super
  invoke-interface
  调用格式:
  invoke-指令类型 {参数1, 参数2,...}, L类名;->方法名
  如果不是是静态方法,参数1代表调用该方法的实例。
  Smali代码示例:const-string v0, "NDKLIB" invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
  相当于java代码:System.loadLibrary("NDKLIB")
  函数返回结果
  Smali需要用指令move-result或move-result-object来保存函数返回的结果
  Smali代码示例:const-string v0, "Eric" invoke-static {v0}, Lcmb/pbi;->t(Ljava/lang/String;)Ljava/lang/String; move-result-object v2
  表示将方法t返回的String对象保存到v2中。方法的定义private static int sum(int a, int b) {         return a+b; }
  使用编译后是这样.method private static sum(II)I     .locals 4   #表示需要申请4个本地寄存器     .parameter     .parameter #这里表示有两个参数     .prologue     .line 27      move v0, p0     .local v0, a:I     move v1, p1     .local v1, b:I     move v2, v0     move v3, v1     add-int/2addr v2, v3     move v0, v2     .end local v0           #a:I     return v0 .end method
  从上面可以看到函数声明使用.method开始 .end method结束,java中的关键词private,static 等都可以使用,同时使用签名来表示唯一的方法,这里是sum(II)I。指令执行
  smali字节码是类似于汇编的,如果你有汇编基础,理解起来是非常容易的。
  比如:
  move v0, v3 #把v3寄存器的值移动到寄存器v0上.
  const v0, 0x1 #把值0x1赋值到寄存器v0上。
  invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I #执行方法sum(),v4,v5的值分别作为sum的参数条件跳转分支"if-eq vA, vB, :cond_x" --- 如果vA等于vB则跳转到:cond_x "if-ne vA, vB, :cond_x" --- 如果vA不等于vB则跳转到:cond_x "if-lt vA, vB, :cond_x" --- 如果vA小于vB则跳转到:cond_x "if-ge vA, vB, :cond_x" --- 如果vA大于等于vB则跳转到:cond_x "if-gt vA, vB, :cond_x" --- 如果vA大于vB则跳转到:cond_x "if-le vA, vB, :cond_x" --- 如果vA小于等于vB则跳转到:cond_x "if-eqz vA, :cond_x" --- 如果vA等于0则跳转到:cond_x "if-nez vA, :cond_x" --- 如果vA不等于0则跳转到:cond_x "if-ltz vA, :cond_x" --- 如果vA小于0则跳转到:cond_x "if-gez vA, :cond_x" --- 如果vA大于等于0则跳转到:cond_x "if-gtz vA, :cond_x" --- 如果vA大于0则跳转到:cond_x "if-lez vA, :cond_x" --- 如果vA小于等于0则跳转到:cond_x
  转自:https://www.jianshu.com/p/ba9b374346dd
  更多资料:https://www.52pojie.cn/thread-408645-1-1.html

企业微信将按用户量收费,私域流量将受冲击我是卢松松,点点上面的头像,欢迎关注我哦!朋圈友都炸锅了,传闻企业微信要按用户量收费了,企业微信加好友收费1人1年的毛钱?5000好友500元年,2W好友2000元年,真的假的?如女性喂奶后胸下垂怎么恢复?女性喂奶后胸下垂怎么恢复女性喂奶后胸下垂可以通过运动锻炼来恢复,也可以通过手术的方法复原。哺乳结束以后乳房萎缩,出现胸部下垂。哺乳结束以后,建议适当减去多余的脂肪,减少脂肪含量有助怀孕后多少周去做第一次产检比较好?为什么?怀孕多少周去做第一次产检比较好?先说一下我的情况,我是停经一个月后发现自己怀孕了,之前经期一直不准确,知道自己怀孕后,简直是又开心又害怕,开心的是自己即将要当妈妈了,害怕的是怕自己为什么婆婆总在孩子面前炫耀她自己有多好,总是说妈妈不好?这种婆婆就是不自爱,希望孙子听自己的,树立自己的威信,打压损坏孩子母亲在孩子心目中的伟大形象,说白了就是想给儿子媳妇当家,想让家里所有人都听她的话,控制欲太强,搞不清楚自己的位置总怀孕乳房越来越大是怎么回事?怀孕乳房越来越大是怎么回事怀孕乳房越来越大是由于体内激素刺激乳腺腺管乳腺腺泡发育而引起的。妊娠期胎盘分泌大量雌激素刺激乳腺腺管发育,分泌大量孕激素刺激乳腺腺泡发育而引起乳房增大。另如果从香港台湾大陆各选一个有代表性的歌手,选谁?香港应数谭咏麟,张学友虽然后来居上,但资历远不及谭咏麟。台湾歌手排名,非邓丽君莫属,张惠妹虽然名声不菲,但是在全世界华人心中的地位排名,邓丽君永远是大姐大,张惠妹只能称阿妹。大陆歌李玉成一人击毙日军30名,日军为此疯狂,我军给予他隆重的军礼在抗日战争那段艰苦的岁月中,在国家危亡之际我国涌现出了非常多的抗日英雄,他们一刻也没有放弃努力,最终使我们迎来了现在的和平与安宁。有这样一位英雄,他为了拖住日军大队的脚步,一人一枪毛启国武警湖北省总队第三支队的前世今生中国人民武装警察部队湖北省总队第三支队,简称武警湖北总队三支队。组建于1983年元月,前身是中国人民解放军第四野战军警卫二团三营。是一支驻守在湖北荆门市沙洋县,担负看押任务的武警内清明前夕,宿迁学院师生寻访朱瑞将军故居扬子晚报网3月27日讯(通讯员王姗郭琪记者高峰)一年一度的清明节即将到来之际,宿迁学院外国语学院朱瑞将军研究工作室开展我们的清明寻访将军里活动。宿迁学院师生在朱瑞将军故居前合影朱瑞第三次世界大战会到来吗?战争爆发之前,有哪些征兆会出现?随着世界政治经济军事等方面的紧张局势不断升级,人们对于第三次世界大战的担忧也越来越大。但是,第三次世界大战是否真的会到来,以及在战争爆发之前会有哪些征兆出现呢?首先,需要明确的是,红米Note12T一加厮杀惨烈?真我GTNeo5SE或许才是真王者!3月17日高通发布了第二代骁龙7处理器,随后RedmiNote12Turbo和真我GTNeo5SE两款手机纷纷宣布搭载,真米大战一触即发。而红米今日先于真我GTNeo5SE发布了R
NBA东部实时排名76人坐稳第2,骑士力克雄鹿20222023赛季NBA常规赛正在如火如荼的进行中,1月22日比赛结束后,来看下今日赛况以及东部最新排名恩比德哈登轮休,76人客场129127逆转击败西部第3的国王。布朗命中4个4换1!湖人开拓者交易方案,扣篮王西蒙斯驰援詹姆斯冲击总冠军据NBAAnalysis报道,湖人队准备在交易截止日之前对阵容再进行一些补强,有意得到开拓者队的首发得分后卫安芬尼西蒙斯,目前已经给出4换1的交易报价。具体交易方案湖人队获得安芬尼美媒湖人换报价雄鹿,威少兄弟驰援湖人,浓眉替身完美现身头条创作挑战赛本赛季的不管是东部还是西部排位之争,非常惨烈!东部头名凯尔特人领先第二名雄鹿。个胜场,不出意外凯尔特人将会取得常规赛东部第一名!雄鹿胜负与同为胜负的人分列第二第三!拥戈登交易被紧急叫停!三年重建正式失败,斯通学爵士转建队思路?目前的火箭在经历了一波12连败后,以10胜35负的成绩联盟倒数第一名,比上赛季同期成绩还差。目前的火箭球员不满情绪爆棚,火箭重建连遭曾经的火箭人或者媒体火爆调侃和戏弄,可以说火箭正追光丨这个春节新年俗中国体育很有戏今天是大年初一兔年的钟声已经敲响春节假期也来到第二天在刚刚过去的除夕守岁贴春联吃年夜饭一些地方还放起了烟花鞭炮这些都是流传千百年充满中国味的传统习俗而看春晚发拜年小视频,甚至滑冰滑癸卯年开门红谷爱凌等相继夺金以往兔年中国体育有啥亮点兔年象征着吉祥如意。大年初一,谷爱凌和乒羽国手在国际比赛奋勇夺金,打响中国体育癸卯年第一枪。新年来临之际,和大家聊聊前6个兔年的中国体育亮点,回味中国体育健儿创造的一个个振兴人心的一进一出,省4000万欧!张康阳神了,国米无缝补强,不被巴黎要挟本赛季国米在欧冠死亡之组小组出线,在联赛也算是杀回到了前三行列。而对于国米队内的转会问题则是相当负责得了,毕竟什克在夏窗时候和球队内部发生了转会和留队的争议闹剧。当时什克是嘴巴说着怀斯曼运气不佳,错过最佳培养时间,勇士这代价有点高赛季至今,勇士的战绩仅仅只有五成,而球队休赛期一直期望的怀斯曼,本赛季依然没有成为一个合格的轮换球员。而就在怀斯曼刚刚有所起色的时候,他的伤病也是如约而至。怀斯曼错过了最佳培养时间欧文3879篮网力克勇士!库里26分汤神狂铁NBA常规赛1月23日继续进行,本场比赛库里汤普森复出,而篮网这边杜兰特继续缺阵。最终,篮网以120116战胜勇士。首节开始,奥尼尔连中三分帮助篮网80开局。随后库里维金斯和普尔合老汉砍37带湖人逆转25分,持续记录更新老詹生涯常规赛数据排名北京时间2023年1月23日在今日结束的NBA常规赛中,湖人客场以121112战胜开拓者队。老詹本场比赛数据上场36分钟37分11板4助0断2冒三分7投2中4失误24投14中10铁四个选秀权报价戈登!火箭雄鹿商讨交易,字母哥迎来强力帮手?据美媒休斯顿纪事报记者乔纳森费根统计,塞拉斯作为主教练执教火箭队三年,在他所执教的200场比赛中,火箭队战绩为47胜153负,胜率仅有23。5。这样糟糕的成绩单放在其他球队不知已经