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

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

UE3脚本UnrealScript UC语法点滴

持续更新 目录 类定义修饰符  1.dependson(CLASSNAME) 2.config(ININAME) 3.native 4.notplaceable 5.inherits(CLASSNAME1[,CLASSNAME2,...]) 类对象实例创建 类默认属性设置 变量 1.声明 var local 2.修饰符 config  3.array 类型变量 以及

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

ps基础入门

1.基础      1.1新建文件      1.2创建指定形状      1.4移动工具          1.41移动画布中的任意元素          1.42移动画布          1.43修改画布大小          1.44修改图像大小      1.5框选工具      1.6矩形工具      1.7图层          1.71图层颜色修改          1

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std