android毕设(2)

来源:互联网 发布:手机乐园java手机版 编辑:程序博客网 时间:2024/09/21 09:26

1. Android  反射反编译

apktool dxxx.apk     →这是反编译命令。xxx.apk就是在E:/apktool目录下欲反编译的apk文件

2. smali语法详解

在smali中,数据类型和Android中的一样,只是对应的符号有变化:

B---byte

C---char

D---double

F---float

I---int

J---long

S---short

V---void

Z---boolean

[XXX---array

Lxxx/yyy---object

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

  二、函数的定义

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

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

方法的参数是一个接一个的,中间没有隔开。

字段表示形式:

Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;

 

 

寄存器

在dalvik字节码中,寄存器都是32位的,能够支持任何类型。64位类型(Long和Double型)用2个寄存器表示。有两种方式指定一个方法中有多少寄存器是可用的。.registers指令指定了方法中寄存器的总数.locals指令表明了方法中非参寄存器的数量。

方法的传参

当一个方法被调用的时候,方法的参数被置于最后N个寄存器中。如果一个方法有2个参数,5个寄存器(v0-v4),那么参数将置于最后2个寄存器——v3和v4。

非静态方法中的第一个参数总是调用该方法的对象

寄存器的命名方式

有两种方式——V命名方式和P命名方式。P命名方式中的第一个寄存器就是方法中的第一个参数寄存器

两种命名方式来表示上一个例子中有5个寄存器和3个参数的方法。

v0    第一个local register

v1    第二个local register

v2  p0  第一个parameter register

v3  p1  第二个parameter register

v4  p2  第三个parameter register

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

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

Long/Double值Long和double类型是64位的,需要2个寄存器(切记切记)。例如,对于非静态方法LMyObject;->MyMethod(IJZ)V,参数分别是LMyObject;,int,long,bool。故该方法需要5个寄存器来存储参数。p0  this| p1 I| p2,p3  J| p4  Z

 

 

 

 

# static fields            定义静态变量的标记

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

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

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

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

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

:cond_8

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

数据定义指令

数据定义指令用于定义代码中使用的常量,类等数据,基础指令是const

指令

描述

const/4 vA,#+B

将数值符号扩展为32后赋值给寄存器vA

const-wide/16 vAA,#+BBBB

将数值符号扩展为64位后赋值个寄存器对vAA

const-string vAA,string@BBBB

通过字符串索引高走字符串赋值给寄存器vAA

const-class vAA,type@BBBB

通过类型索引获取一个类的引用赋值给寄存器vAA

通过baksmali.jar反编译出来每个.smali,都对应与java中的一个类,每个smali文件都是Davilk指令组成的,并遵循一定的结构.smali存在很多的指令用于描述对应的java文件,所有的指令都以”.”开头,常用的指令如下:

关键词

说明

.filed

定义字段

.method…end method

定义方法

.annotation…end annotation

定义注解

.implements

定义接口指令

.local

指定了方法内局部变量的个数

.registers

指定方法内使用寄存器的总数

.prologue

表示方法中代码的开始处

.line

表示java源文件中指定行

.paramter

指定了方法的参数

.param

.paramter含义一致,但是表达格式不同

aget-object v6,v2, v3---》v6=v2[v3]

0 0