apk反编译修改教程系列---反编译apk中Smali基础语法说明 基础对应代码修改【十三】

本文主要是介绍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基础语法说明 基础对应代码修改【十三】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/823912

相关文章

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.