本文主要是介绍apk反编译修改教程系列---反编译apk中Smali基础语法说明 基础对应代码修改【十三】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
往期教程:
安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识
apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】
apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】
apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】
apk反编译修改教程系列---简单去除apk联网权限 其他权限 无法自动更新等【四】
apk反编译修改教程系列---简单去除apk开屏广告【五】
apk反编译修改教程系列---修改apk设置菜单选项名称 修改默认设置 增加减少选项【六】
apk反编译修改教程系列---简单给app添加启动弹窗 添加对话框 跳转指定网页等【七】
安卓玩机-----给app加注册码 app加弹窗 云注入弹窗
apk反编译修改教程系列---如何简单的汉化apk 手机端与电脑端同步演示【八】
apk反编译修改教程系列---修改apk包名等信息 让一个应用拥有无限分身 手机电脑同步演示【九】
apk反编译修改教程系列---修改apk的默认颜色 布局颜色 手机电脑同步演示【十】
apk反编译修改教程系列---简单修改apk默认横竖屏显示 手机端与电脑端同步演示【十一】
apk反编译修改教程系列---简单去除apk登陆 修改vip与一些反编译基础常识【十二】
APK反编译基础常识与对应基础代码
在前面的博文有几个案例修改操作。但有些步骤的代码修改对于初学友友不太明了。这期将对一些反编译apk中的基础代码做一些说明和基本代码修改的意义.
APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版本):
Where's My Water.zip\
asset\ <资源目录1:asset和res都是资源目录但有所区别,见下面说明>
lib\ <so库存放位置,一般由NDK编译得到,常见于使用游戏引擎或JNI native调用的工程中>
|---armeabi\ |---<so库文件分为不同的CPU架构>
|---armeabi-v7a\
META-INF\ <存放工程一些属性文件,例如Manifest.MF>
res\ <资源目录2:asset和res都是资源目录但有所区别,见下面说明>
|---drawable\ |---<图片和对应的xml资源>
|---layout\ |---<定义布局的xml资源>
|---...
AndroidManifest.xml <Android工程的基础配置属性文件>
classes.dex <Java代码编译得到的Dalvik VM能直接执行的文件,下面有介绍>
resources.arsc <对res目录下的资源的一个索引文件,保存了原工程中strings.xml等文件内容>
asset和res资源目录的不同区别在于:
1. res目录下的资源文件在编译时会自动生成索引文件(R.java),在Java代码中用R.xxx.yyy来引用;而asset目录下的资源文件不需要生成索引,在Java代码中需要用AssetManager来访问;
2. 一般来说,除了音频和视频资源(需要放在raw或asset下),使用Java开发的Android工程使用到的资源文件都会放在res下;使用C++游戏引擎(或使用Lua binding等)的资源文件均需要放在asset下。
因为Where's My Water是使用迪斯尼公司自家的DMO游戏引擎开发,所以游戏中用到的所有资源文件都存放在asset下,除了应用图标这些资源仍需要放在res下。
smali就是Dalvik VM内部执行的核心代码。它有自己的一套语法,
.field private isFlag:z 定义变量
.method 方法
.parameter 方法参数
.prologue 方法开始
.line 12 此方法位于第12行
invoke-super 调用父函数
const/high16 v0, 0x7fo3 把0x7fo3赋值给v0
invoke-direct 调用函数
return-void 函数返回void
.end method 函数结束
new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
条件跳转分支修改:
"if-eq vA, vB, :cond_**" 如果vA等于vB则跳转到:cond_**
"if-ne vA, vB, :cond_**" 如果vA不等于vB则跳转到:cond_**
"if-lt vA, vB, :cond_**" 如果vA小于vB则跳转到:cond_**
"if-ge vA, vB, :cond_**" 如果vA大于等于vB则跳转到:cond_**
"if-gt vA, vB, :cond_**" 如果vA大于vB则跳转到:cond_**
"if-le vA, vB, :cond_**" 如果vA小于等于vB则跳转到:cond_**
"if-eqz vA, :cond_**" 如果vA等于0则跳转到:cond_**
"if-nez vA, :cond_**" 如果vA不等于0则跳转到:cond_**
"if-ltz vA, :cond_**" 如果vA小于0则跳转到:cond_**
"if-gez vA, :cond_**" 如果vA大于等于0则跳转到:cond_**
"if-gtz vA, :cond_**" 如果vA大于0则跳转到:cond_**
"if-lez vA, :cond_**" 如果vA小于等于0则跳转到:cond_**
类似语句:
if-eq vx,vy,target:eq:equal 如果vx==xy 跳转到target目标代码,否则执行顺序执行下一句代码
if-ne vx,vy,target:nq :not equal 如果vx!=xy 跳转到target目标代码,否则执行顺序执行下一句代码
if-eqz vx,target:eqz : equal zero 如果vx==0 跳转到target目标代码,否则执行顺序执行下一句代码
if-nez vx,target:nez :not equal zero 如果vx!=0 跳转到target目标代码,否则执行顺序执行下一句代码
●Smail代码基础
方法的调用:
invoke-direct {p0}, Lcom/paul/test/a,;->d()V
用于构造函数和调用私有方法
invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
用于调用调用非私有方法
invoke-static{pO}, Lcom/paul/test/a;->d()V调用静态函数
invoke-super {p0, p1, p2}, Landroid/viewView;-
>onKeyUp(IL android/view/KeyEvent; )Z
用于调用父类方法
iget vx,px,Lxxxxxx;->xxxx;将xxxx类的xxxx变量赋值给vx
iput vx,px,Lxxxxxx;->xxxx;将vx的值赋值给xxxx类的xxxx变量
sget vx,Lxxxx->xxxx;将xxxx类的xxxx变量赋值给vx
sput vx,Lxxxx->xxxx;将vx的值赋值给xxxx类的xxxx变量 静态变量(sget/sput),变量(iget/iput),const/4 vx,xx
const vx,xx
const-wide vx,xx
const-string vx,"xxxx"
这几个则是赋值
goto对应方法说明
goto :cond_xxx 无条件跳转到:cond_xx
return-void 返回结果
return vx 返回vx的结果
.end method 方法结束
.registers 本方法寄存器使用数
)J是long类型
)Z是boolean类型
)I是int类型
)D是double类型
)Ljava/lang/String;是String类型
)V则是代表void
当然如果把)换成->后的:xx也是同理
Smail代码示例:
1. 变量和数据类型
Smail中的变量可以用来存储数据,可以是数字、字符串等不同的数据类型。例如:
```
var name = "John";
var age = 25;
```
2. 输出
可以使用print语句将数据打印到控制台:
```
var name = "John";
print(name);
```
3. 输入
使用input语句从用户获取输入:
```
var name = input("What is your name?");
print("Hello, " + name + "!");
```
4. 条件语句
使用if语句根据条件执行不同的操作:
```
var age = input("How old are you?");
if (age > 18) {
print("You are an adult.");
} else {
print("You are a minor.");
}
```
5. 循环
使用while或for循环重复执行一段代码:
```
var i = 1;
while (i <= 10) {
print(i);
i = i + 1;
}
for (var i = 1; i <= 10; i = i + 1) {
print(i);
}
```
6. 函数
可以定义并调用函数来执行特定的任务:
```
function greet(name) {
print("Hello, " + name + "!");
}
greet("John");
```
7. 邮件发送
使用sendMail函数发送邮件:
```
var to = "example@example.com";
var subject = "Hello";
var body = "This is a test email.";
sendMail(to, subject, body);
```
这些是一些Smail的基础知识和代码示例,你可以根据需要进一步学习和探索Smail的功能和用法。
这就是一些反编译apk中最基础smali语法
下期预告:apk实例去除广告 弹窗步骤解析
**系列教程只是让初学者了解反编译的一些初步常识,尽量每一步都图文说明。详细的由浅入深解析apk的各种反编译操作。有兴趣的友友可以关注
这篇关于apk反编译修改教程系列---反编译apk中Smali基础语法说明 基础对应代码修改【十三】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!