版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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年广西高考生物试卷真题(含答案)
- 中国铁路国际有限公司招聘考试试卷2022
- 电子政务概论-形考任务5(在线测试权重20%)-国开-参考资料
- 古代小说戏曲专题-形考任务2-国开-参考资料
- 高中学生物理教学论文7篇
- 守株待兔演讲稿
- 串并联电路说课稿
- 画法几何习题集第六章答案大连理工大学版
- 中控考勤管理系统数据库结构
- 医院关键财务管理岗位定期轮换与交接制度
- 设备包机管理实施细则
评论
0/150
提交评论