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

相关文章

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm