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调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意