【情景分析】Android apk,反编译之后,我们能阅读到的代码是 dalvik字节码 - smali 。有时候,工作需要,必须破解apk里面的一些协议或者方法。以此,借鉴经验,来开发自己的项目。

【官方语法链接】 http://www.blogjava.net/midea0978/archive/2012/01/04/367847.html

【语法】

一. 数据类型

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

原始类型:

void,只能用于返回值类型

Z     boolean

B   byte

S   short

C   char

I   int

J   long64位)

F   float

D   double(64位)

引用类型:

对象 和 数组

Smail表现形式

1

2

3

4

5

6

7

原始类型:用大写字母代替即可,用法无异<br>

引用类型:

  对象:<strong> L + 包名.对象 +</strong> ;

      对象的表示则以L作为开头,格式是LpackageName/objectName;(注意必须有个分号跟在最后),例如String对象在smali中为:Ljava/lang/String;,其中java/lang对应java.lang包,String就是定义在该包中的一个对象。

 <br>   数组:<strong>[ + 数据类型</strong>

     数组的表示方式是:在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F<br>      <br>     [I——表示一个整型一维数组,相当于java中的int[]。<br>   对于多维数组,只要增加[就行了。[[I相当于int[][],[[[I相当于int[][][]。注意每一维的最多255个。<br>    对象数组的表示:[Ljava/lang/String;表示一个String对象数组。<br>

二. 方法

方法定义:

1

2

3

表示形式:Lpackage/name/ObjectName;->MethodName(III)Z

    Lpackage/name/ObjectName;表示类型,MethodName是方法名。III为参数(在此是3个整型参数),Z是返回类型(bool型)。

    方法的参数是一个接一个的,中间没有隔开。<br><br>一个更复杂的例子:<br><br>method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;<br>在java中则为:<br>String method(intint[][], int, String, Object[])

内部类:

1

既然类是用LpackageName/objectName;来表示,那类里面的内部类又如何在smali中引用呢?答案是:LpackageName/objectName$subObjectName;。也就是在内部类前加“$”符号

字段:

1

表示形式: <br>Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;  即包名,字段名和各字段类型。

标记说明:

1

2

3

4

5

static fields             定义静态变量的标记

# instance fields        定义实例变量的标记

# direct methods       定义静态方法的标记

# virtual methods      定义非静态方法的标记

构造函数的返回类型为V,名字为<init>。

语法:If语句

1

2

3

4

5

6

7

8

9

10

11

12

if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程:

    :cond_8

    invoke-direct {p0}, Lcom/paul/test/a;->d()V

调用com.paul.test.a的d()方法<br>

if-ne p1, v0, :cond_b 表示不相等则执行cond_b的流程:

    :cond_b

    const/4 v0, 0x0

    invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V

    invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z

    move-result v0

 

大概意思就是调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法,最后 return v0

  

三. 寄存器(重点)

概念:

1

2

在dalvik字节码中,寄存器都是32位的,能够支持任何类型。64位类型(Long和Double型)用2个寄存器表示。

有两种方式指定一个方法中有多少寄存器是可用的。<br><br>  .registers指令指定了方法中寄存器的总数。 [注意:一个方法内,不允许超过15个;如果超过15个,需要做特殊处理,处理方法找google大神,度娘]<br>  .locals指令表明了方法中非参寄存器的数量。

命名方式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

有两种方式——V命名方式和P命名方式。P命名方式中的第一个寄存器就是方法中的第一个参数寄存器。在下表中我们用这两种命名方式来表示上一个例子中有5个寄存器和3个参数的方法。

v0  第一个local register

v1  第二个local register

v2  p0  第一个parameter register

v3  p1  第二个parameter register

v4  p2  第三个parameter register

你可以用任何一种方式来引用参数寄存器——他们没有任何差别。

注意:baksmali默认对参数寄存器使用P命名方式。如果想使用V命名方式,可以使用-pl—no-parameter-registers选项。

使用P命名方式是为了防止以后如果要在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点。

<br>Long/Double值

Long和double类型是64位的,需要2个寄存器(切记切记)。

例如,对于非静态方法LMyObject;->MyMethod(IJZ)V,参数分别是LMyObject;,intlong,bool。故该方法需要5个寄存器来存储参数。

p0  this

p1  I

p2,p3   J

p4  Z

下篇文章继续。

Smail语法(1)相关推荐

  1. android -------- NDK 入门指南

    NDK介绍 原生开发工具包 (NDK) 是一组可让您在 Android 应用中利用 C 和 C++ 代码的工具. 可用以从您自己的源代码构建,或者利用现有的预构建库. NDK 不适用于大多数初学的 A ...

  2. android黑科技系列——静态分析技术来破解Apk

    一.前言 从这篇文章开始我们开始我们的破解之路,之前的几篇文章中我们是如何讲解怎么加固我们的Apk,防止被别人破解,那么现在我们要开始破解我们的Apk,针对于之前的加密方式采用相对应的破解技术,And ...

  3. Android安全:代码注入

    一.常用的Smail注入代码  在逆向分析APK文件的时候,我们往往需要注入一些自己的代码方便调试,如增加调试Log信息等.常用的Smail注入代码如下:  1.增加调试Log信息:  Log.i(& ...

  4. Android 逆向基础

    Android 反编译教程 博客内容 基本知识 几个重要的工具 技术原理 apktool dex2jar + jd-gui DEX文件结构学习 Monkey使用手册 Android权限列表以及说明 博 ...

  5. MT管理器解锁某APP部分功能

    事由:搞电脑二十年整了,忽然发现现在空余时间比较多,而且沉迷王者荣耀居然有年多了.玩物丧志啊.基于少年时大学就拿个结业证,朋友劝诫,决定趁时间充裕去拿自考证.于是乎开始背书,然后做练习,然因计算机习惯 ...

  6. 常见的 App 安全问题

    常见的 App 安全问题 据2015年第三季度移动安全报告显示,Android 16个行业 TOP 10 应用漏洞类别和数量中,Webview远程代码执行占到了第一位,第二位是Webview文明存储密 ...

  7. CSDN技术主题月:实战解读移动信息安全技术

    摘要:11 月 12 日,由 CSDN 社区主办的"CSDN 技术主题月--移动信息安全技术的挑战与创新"在北京中关村隆重举行,此次沙龙活动邀请到黄帅(@猴子搬来的救兵Castie ...

  8. 移动安全学习教程:移动安全学习框架

    移动Android安全学习体系: 1.熟悉Android程序包APK结构文件格式.运行流程.资源基础等基础知识 2.熟悉掌握APK的反编译.静态分析.动态分析.内存数据.网路传输.本地数据等分析技能 ...

  9. Android知识点总结

    Android知识总结:(内容有很多还在补全中) Activity: 用来跟用户来进行交互的界面,使用过程中要注意的就是他的生命周期, onCreate的时候只是加载布局文件,进行控件的初始化,这个时 ...

  10. 网络安全工程师的学习路线

    Web安全工程师 概念基础 一.了解黑客是如何工作的 1.在虚拟机配置Linux系统 2.漏洞测试工具 3.msf控制台 4.远程工具RATS 5.远程访问计算机 6.白帽 二.技术基础 漏斗扫描工具 ...

最新文章

  1. data的值 如何初始化vue_vue data恢复初始化数据的实现方法
  2. hibernate相关收集
  3. oracle 动态sql列转行_oracle行转列(动态行转不定列)
  4. 16位转8位 winhex_078期中4位2复式3码232,排列五第19079期爱我彩规
  5. 最终计算供应链管理生产计划排程逻辑管理
  6. 前端实现炫酷动效_20个网页动效设计的炫酷神器
  7. 计算机考博哪个学校好考,管理学博士哪个学校好考
  8. 数据分析JSON板块的基本使用(以分析比特币收盘价为例),附完整的Python代码及json文件详解---数据可视化
  9. 【elasticsearch】 elasticsearch 写一致性
  10. lua qt 编译_Win32下 Qt与Lua交互使用(一):配置Qt下Lua运行环境
  11. git的简单使用(windows)
  12. 浅谈程序员的数学修养
  13. 微信开发与应用实验一、创建微信公众号
  14. 使用webp进行图像压缩
  15. 编写一个js函数,实时显示当前时间,格式:“年-月-日 时:分:秒”
  16. 猛兽之地服务器维护,猛兽之地Roguelands全材料获取途径详解
  17. java基于springboot二手物品交易网站
  18. 景安服务器做网站seo怎样,虚拟主机和SEO优化的关系很大吗?景安
  19. matlab openblas,ubuntu上Caffe使用OpenBLAS多线程加速
  20. 招聘会求贤也蛮拼的 老总的大奔开出来接面试者

热门文章

  1. RGB颜色查询对照代码表
  2. 基于QT的IM(jabber)库和客户端
  3. 中国图形图象学报和计算机科学,《中国图象图形学报》编辑部
  4. 联想Thinkpad sl400 7HC入手感觉
  5. 程序员玩游戏之四--娱网棋牌大连打滚子记牌器
  6. 华为网络工程师认证有了解的吗?
  7. [信息论与编码理论专题-6]:物理层信道编码
  8. 实验二 语法分析1——递归子程序法
  9. Tera term的TTL脚本使用方法
  10. 电子制作:红外遥控器检测仪的制作