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]
- android毕设(2)
- android毕设(1)
- android毕设(3)
- 毕设log 2
- 毕设小结(一)Android程序包验证
- 毕设小结(三)Android自身组件禁用
- Android毕设之Fragment+TabHost(三)
- Android 毕设源码大派送
- 代做安卓毕设,代做android毕设!!!!
- android Material Design (材质设设计)
- 毕设日记(一)
- 毕设日记(二)
- Android毕设总结(基于Android的金融软件系统)
- 毕设
- 毕设
- 毕设
- 毕设..
- 毕设
- 推荐 浙江省国税vpdn安装正确的方法 如何安装后缀为ocx的控件 由于无法验证发布者 ,所以windows 已经阻止次软件
- 实验二 阶乘while循环
- 失业66天(转载自zhao_yin的记事本)
- Java回调机制解读
- ajax最最常用的七个属性
- android毕设(2)
- 初识前端框架(Vue)打包遇到的坑~
- 《VR产业白皮书》
- 富士伺服电机速度转换公式
- C++编程调试秘笈(第1次阅读)
- .net导出excel 向客户端推送文件 下载文件 ClosedXML导出Excel NPOI导出Excel
- ZOJ 1648Circuit Board
- MyEclipse2014 Maven项目建立
- Aspect注解进行通知的配置