39.安卓逆向-壳-smali语法3(方法)

devtools/2024/11/16 16:23:54/

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:图灵Python学院

本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:38.安卓逆向-壳-smali语法2(条件语句和for循环)

上一个内容里写了java的条件语句和for循环的smali的样子,本次接着继续认识smali

本次是方法调用的smali,下方是smali的关键字

invoke-virtual 主要用于非私有实例方法的调用。实例方法指不是构造方法、父类方法等的属于

这个类的一般方法。

invoke-direct 主要用于构造方法(包括父类的构造方法)和私有方法的调用

invoke-static 主要用于静态方法的调用

invoke-super 主要用于父类成员方法(不包括父类构造方法)的调用

invoke-interface 主要用于接口方法的调用

实例方法调用

invoke-virtual {参数}, 方法所属类的全包名路径->方法名(参数类型)方法返回值类型

当有多个参数时,格式为 {参数1,参数2} ,使用其他关键字调用时相同

下图实例调用非静态方法

.class public Lcom/example/course1/SmailTest;
.super Ljava/lang/Object;
.source "SmailTest.java"# direct methods
.method public constructor <init>(Ljava/lang/String;)V.registers 2.param p1, "a"    # Ljava/lang/String;.prologue.line 5invoke-direct {p0}, Ljava/lang/Object;-><init>()V.line 6invoke-virtual {p0}, Lcom/example/course1/SmailTest;->getName()Ljava/lang/String;.line 7return-void
.end method# virtual methods
.method public getName()Ljava/lang/String;.registers 2.prologue.line 10const-string v0, "hello"return-object v0
.end method
public class SmailTest {//SmailTest类的构造方法,调用getName方法public SmailTest(String a){getName();}//非私有实例方法getName()public String getName(){return "hello";}
}

下图实例调用静态方法,没什么好说的,和上方非静态的方法一样,区别如下图红框

.class public Lcom/example/course1/SmailTest;
.super Ljava/lang/Object;
.source "SmailTest.java"# direct methods
.method public constructor <init>(Ljava/lang/String;)V.registers 2.param p1, "a"    # Ljava/lang/String;.prologue.line 5invoke-direct {p0}, Ljava/lang/Object;-><init>()V.line 6invoke-static {}, Lcom/example/course1/SmailTest;->getNames()Ljava/lang/String;.line 7return-void
.end method.method private static getNames()Ljava/lang/String;.registers 1.prologue.line 14const-string v0, "hello world"return-object v0
.end method# virtual methods
.method public getName()Ljava/lang/String;.registers 2.prologue.line 10const-string v0, "hello"return-object v0
.end method
public class SmailTest {//SmailTest类的构造方法,调用getName方法public SmailTest(String a){getNames();}//非私有实例方法getName()public String getName(){return "hello";}private static String getNames(){return "hello world";}}

然后来一个复杂点的方法,如下图红框

对应关系

完整smali代码

.class public Lcom/example/course1/SmailTest;
.super Ljava/lang/Object;
.source "SmailTest.java"# direct methods
.method public constructor <init>(Ljava/lang/String;)V.registers 2.param p1, "a"    # Ljava/lang/String;.prologue.line 13invoke-direct {p0}, Ljava/lang/Object;-><init>()V.line 14invoke-static {}, Lcom/example/course1/SmailTest;->func3()V.line 15invoke-virtual {p0}, Lcom/example/course1/SmailTest;->getName()Ljava/lang/String;.line 16invoke-static {}, Lcom/example/course1/SmailTest;->getNames()Ljava/lang/String;.line 17return-void
.end method.method public static func3()V.registers 14.prologueconst/4 v10, 0x1const/4 v9, 0x0.line 28const-string v7, "http://appapi.yndaily.com/api/v2/articles/10?pageToken=&size=20&headPageSize=&clientVersionCode=409&pjCode=code_ynrb&device_s ize=1080.0x2236.0&deviceOs=10&channel=qq&deviceModel=Google\u0002Pixel+4&clientVersion=4.0.9&udid=11ec2adac162837a&platform=android".line 30.local v7, "url":Ljava/lang/String;new-instance v3, Ljava/util/HashMap;invoke-direct {v3}, Ljava/util/HashMap;-><init>()V.line 31.local v3, "paramMap":Ljava/util/Map;, "Ljava/util/Map<Ljava/lang/String;Ljava/lang/String;>;"const-string v8, "\\?"invoke-virtual {v7, v8}, Ljava/lang/String;->split(Ljava/lang/String;)[Ljava/lang/String;move-result-object v4.line 32.local v4, "parts":[Ljava/lang/String;array-length v8, v4if-le v8, v10, :cond_41.line 33aget-object v8, v4, v10const-string v10, "&"invoke-virtual {v8, v10}, Ljava/lang/String;->split(Ljava/lang/String;)[Ljava/lang/String;move-result-object v5.line 34.local v5, "queries":[Ljava/lang/String;array-length v10, v5move v8, v9:goto_1cif-ge v8, v10, :cond_41aget-object v6, v5, v8.line 35.local v6, "query":Ljava/lang/String;const-string v11, "="invoke-virtual {v6, v11}, Ljava/lang/String;->split(Ljava/lang/String;)[Ljava/lang/String;move-result-object v2.line 36.local v2, "kv":[Ljava/lang/String;array-length v11, v2const/4 v12, 0x2if-ne v11, v12, :cond_39.line 38const/4 v11, 0x0:try_start_2baget-object v11, v2, v11const/4 v12, 0x1aget-object v12, v2, v12const-string v13, "UTF-8"invoke-static {v12, v13}, Ljava/net/URLDecoder;->decode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;move-result-object v12invoke-interface {v3, v11, v12}, Ljava/util/Map;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;:try_end_39.catch Ljava/io/UnsupportedEncodingException; {:try_start_2b .. :try_end_39} :catch_3c.line 34:cond_39:goto_39add-int/lit8 v8, v8, 0x1goto :goto_1c.line 39:catch_3cmove-exception v0.line 40.local v0, "e":Ljava/io/UnsupportedEncodingException;invoke-virtual {v0}, Ljava/io/UnsupportedEncodingException;->printStackTrace()Vgoto :goto_39.line 47.end local v0    # "e":Ljava/io/UnsupportedEncodingException;.end local v2    # "kv":[Ljava/lang/String;.end local v5    # "queries":[Ljava/lang/String;.end local v6    # "query":Ljava/lang/String;:cond_41invoke-virtual {v3}, Ljava/lang/Object;->toString()Ljava/lang/String;move-result-object v8invoke-virtual {v8}, Ljava/lang/String;->getBytes()[Bmove-result-object v8invoke-static {v8, v9}, Landroid/util/Base64;->encodeToString([BI)Ljava/lang/String;move-result-object v1.line 48.local v1, "encodedParams":Ljava/lang/String;const-string v8, "Base64"invoke-static {v8, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I.line 49return-void
.end method.method private static getNames()Ljava/lang/String;.registers 1.prologue.line 24const-string v0, "hello world"return-object v0
.end method# virtual methods
.method public getName()Ljava/lang/String;.registers 2.prologue.line 20const-string v0, "hello"return-object v0
.end method

完整java代码

package com.example.course1;import android.util.Base64;
import android.util.Log;import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;public class SmailTest {//SmailTest类的构造方法,调用getName方法public SmailTest(String a){func3();getName();getNames();}//非私有实例方法getName()public String getName(){return "hello";}private static String getNames(){return "hello world";}public static void func3() {String url = "http://appapi.yndaily.com/api/v2/articles/10?pageToken=&size=20&headPageSize=&clientVersionCode=409&pjCode=code_ynrb&device_s ize=1080.0x2236.0&deviceOs=10&channel=qq&deviceModel=GooglePixel+4&clientVersion=4.0.9&udid=11ec2adac162837a&platform=android";// 解析查询参数Map<String, String> paramMap = new HashMap<>();String[] parts = url.split("\\?");if (parts.length > 1) {String[] queries = parts[1].split("&");for (String query : queries) {String[] kv = query.split("=");if (kv.length == 2) {try {paramMap.put(kv[0], URLDecoder.decode(kv[1], "UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}}// 使用Base64编码String encodedParams =Base64.encodeToString(paramMap.toString().getBytes(), Base64.DEFAULT);Log.d("Base64", encodedParams);}
}

img


http://www.ppmy.cn/devtools/134472.html

相关文章

Rust 模板匹配——根据指定图片查找处于大图中的位置(支持GPU加速)

Rust 模板匹配——根据指定图片查找处于大图中的位置(支持GPU加速) 01 前言 在手搓RPA工具的时候,总会碰到不好定位的情况,那么,就需要根据小图来找到对应屏幕上的位置(以图识图),这个需求也比较简单。想到市面上也有不少RPA工具都有这个功能,那么人家有的,俺也可以…

通过css的哪些方式可以实现隐藏页面上的元素?

1&#xff1a;opacity:0 通过将元素的透明度设置为o&#xff0c;实现隐藏效果&#xff0c;但是依然会占用空间并可以进行交互。 2&#xff1a;visibility:hidden 与透明度度为0的方案类似&#xff0c;会占据空间&#xff0c;但不可以进行交互。 3&#xff1a;Overflow:hi…

如何将java项目打包成docker 镜像并且可运行

java 项目打包成 Docker 可运行的镜像&#xff0c;其目的是便于运用docker容器来管理项目。下面是具体的步骤&#xff0c;如果大家遇到啥问题可以留言有空会逐一回复。 目录 1. 确保项目已经打包成 JAR 文件 2. 编写 Dockerfile 3. 构建 Docker 镜像 4. 运行 Docker 容器 …

【计网不挂科】计算机网络第四章< 网络层 >习题库(含答案)

前言 大家好吖&#xff0c;欢迎来到 YY 滴计算机网络 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 本博客主要内容&#xff0c;收纳了一部门基本的计算机网络题目&#xff0c;供yy应对期中考试复习。大家可以参考 本章为分章节的习题内容题库&#x…

【大数据学习 | HBASE高级】hbase的参数优化

Zookeeper 会话超时时间 属性&#xff1a;zookeeper.session.timeout 解释&#xff1a;默认值为 90000 毫秒&#xff08;90s&#xff09; hbase.client.pause&#xff08;默认值 100ms&#xff09;重试间隔 hbase.client.retries.number&#xff08;默认 15 次&#xff09;重试…

【JavaScript】JavaScript开篇基础(6)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

VRRP HSRP GLBP 三者区别

1. VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由冗余协议&#xff09; 标准协议&#xff1a;VRRP 是一种开放标准协议&#xff08;RFC 5798&#xff09;&#xff0c;因此支持的厂商较多&#xff0c;通常用于多种网络设备中。主备模式&#xff1a;…

常见查找排序算法

算法 作用: 提高代码运行效率 评判算法是否优良 时间复杂度 预测代码执行所需的时间与关键系数的关系 代码执行时间越短越好 空间复杂度 代码执行所需占用的空间,越小越好 常用算法 两数交换 方式1: int a10; int b1; int c a; a b; b c; 方式2: int a10; int b1; aab; b…