版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Smali语言学习了
最近一周在研究rom移植,所以就对Smali语言学习了一下,Smali语言其实就是Davlik的寄存器语言;Smali语言就是android的应用程序.apk通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件,文件的展示语言。
如图,下面是HelloWorldApp通过apktool反编译出来的目录:
Smali文件夹里面的目录,
先打开一个主类HelloWorldAppActivity.smali文件,先来浏览一下里面的语言,在来说说smali的语法规则:[html]
viewplaincopyprint?.class
public
Lcom/cn/daming/activity/HelloWorldAppActivity;
.super
Landroid/app/Activity;
.source
"HelloWorldAppActivity.java"
#
instance
fields
.field
private
mTextView:Landroid/widget/TextView;
#
direct
methods
.method
public
constructor
<init>()V
.locals
0
.prologue
.line
7
invoke-direct
{p0},
Landroid/app/Activity;-><init>()V
return-void
.end
method
#
virtual
methods
.method
public
onCreate(Landroid/os/Bundle;)V
.locals
2
.parameter
"savedInstanceState"
.prologue
.line
12
invoke-super
{p0,
p1},
Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line
13
const/high26
v0,
0x7f03
invoke-virtual
{p0,
v0},
Lcom/cn/daming/activity/HelloWorldAppActivity;->setContentView(I)V
.line
14
const/high26
v0,
0x7f05
invoke-virtual
{p0,
v0},
Lcom/cn/daming/activity/HelloWorldAppActivity;->findViewById(I)Landroid/view/View;
move-result-object
v0
check-cast
v0,
Landroid/widget/TextView;
iput-object
v0,
p0,
Lcom/cn/daming/activity/HelloWorldAppActivity;->mTextView:Landroid/widget/TextView;
.line
15
iget-object
v0,
p0,
Lcom/cn/daming/activity/HelloWorldAppActivity;->mTextView:Landroid/widget/TextView;
const/high26
v1,
0x7f04
invoke-virtual
{v0,
v1},
Landroid/widget/TextView;->setText(I)V
.line
16
return-void
.end
method
上面的smali语言对应的java类就是HelloWorldAppActivity.java类如下:[java]
viewplaincopyprint?package
.daming.activity;
import
android.app.Activity;
import
android.os.Bundle;
import
android.widget.TextView;
public
class
HelloWorldAppActivity
extends
Activity
{
private
TextView
mTextView;
/**
Called
when
the
activity
is
first
created.
*/
@Override
public
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTextView
=
(TextView)findViewById(R.id.text_view);
mTextView.setText(R.string.hello);
}
}
通过对比发现基本的方法名称没有改变,多了一个.methodpublicconstructor<init>()V表示该类的不带参数缺省的构造方法,onCreate()方法是以.methodpubliconCreate(Landroid/os/Bundle;)V开始,.endmethod结束;方法的表示形式就是这个样子的,就像赵本山说小品一样:“就算你穿上马甲,我也认识你”;哈哈。
下面介绍一下Smali代码注入,原理:在已有APK或JAR包中插入一些Dalvik虚拟机的指令,从而改变原有程序的路径和行为。例如把上面的HelloWorldAppActivity的mTextView.setText(R.string.hello);修改一个字符串“Thisisdamingchangethesmaliprogrammer”替换原代码的R.string.hello;只需要修改HelloWorldAppActivity.smali文件的50,51,52行就可以了,[html]
viewplaincopyprint?const/high26
v1,
0x7f04
invoke-virtual
{v0,
v1},
Landroid/widget/TextView;->setText(I)V
修改为[html]
viewplaincopyprint?const-string
v1,
"This
is
daming
change
the
smali
programmer"
invoke-virtual
{v0,
v1},
Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
再通过apktool
b
需要打包回去的文件打包回去就在反编译后的HelloWorldApp文件里生成一个dist文件夹,里面就有打包的HelloWorldApp.apk。如图
注意:要直接安装到手机或模拟器是不行的,需要签名,可以通过APKSign_gr这个签名软件来签名,也可以通过其他方式签名,在签名的时候如果一开始在eclipse里运行生成的apk是使用了ADB的debug权限签名,如果使用APKSign_gr这个签名,需要在手机或模拟器中把原来的apk卸载掉,在安装新的apk,就ok了,这个是解决安装apk时“INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES”这个错误的。效果图如下:
修改前
修改后
Smali语法简单介绍如下:
Davlik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个寄存器表示;
Dalvik字节码有两种类型:原始类型;引用类型(包括对象和数组)
原始类型:v
void
只能用于返回值类型
Z
boolean
B
byte
S
short
C
char
I
int
J
long(64位)
F
float
D
double(64位)
对象类型:Lpackage/name/ObjectName;
相当于java中的.ObjectName;解释如下:
L:表示这是一个对象类型
package/name:该对象所在的包
;:表示对象名称的结束
数组的表示形式:
[I
:表示一个×××的一维数组,相当于java的int[];
对于多维数组,只要增加[
就行了,[[I=int[][];注:每一维最多255个;
对象数组的表示形式:
[Ljava/lang/String
表示一个String的对象数组;
方法的表示形式:
Lpackage/name/ObjectName;——>methodName(III)Z
详解如下:
Lpackage/name/ObjectName
表示类型
methodName
表示方法名
III
表示参数(这里表示为3个整型参数)
说明:方法的参数是一个接一个的,中间没有隔开;
字段的表示形式:
Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;
即表示:包名,字段名和各字段类型
有两种方式指定一个方法中有多少寄存器是可用的:
.registers
指令指定了方法中寄存器的总数
.locals
指令表明了方法中非参寄存器的总数,出现在方法中的第一行
方法的传参:
当一个方法被调用的时候,方法的参数被置于最后N个寄存器中;
例如,一个方法有2个参数,5个寄存器(v0~v4)
那么,参数将置于最后2个寄存器(v3和v4)
非静态方法中的第一个参数总是调用该方法的对象;
说明:对于静态方法除了没有隐含的this参数外,其他都一样
寄存器的命名方式:
V命名
P命名
第一个寄存器就是方法中的第一个参数寄存器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《工程伦理学》练习题集
- 荣华-水岸新城住宅小区二、三、四期项目报告书
- 随机梯度下降在大数据处理中的应用
- 福州2024年06版小学四年级下册英语第二单元测验试卷
- 人教版七年级英语下册期末复习易错点知识归纳
- 2024年绕线绞线设备项目投资申请报告代可行性研究报告
- 2024年AOI光学检测系统项目资金需求报告代可行性研究报告
- 强化社会监管-服务转型跨越-推动文化事业大发展大繁荣
- 2024年电表箱项目资金申请报告代可行性研究报告
- 2023年商用半导体投资申请报告
- 洗胃法操作(课堂)课件
- 先天性青光眼课件
- 总监带班巡视记录
- 价值流程图培训讲义(-53张)课件
- (整理)打印机配件英文名称
- 痔疮精品课件
- 县级中职网络搭建技能比赛题和答案
- 白血病试题及答案
- 单片机中用矩阵键盘实现计算器
- 现代写作教程全套课件
- 老年友善医疗机构建设项目报价函
评论
0/150
提交评论