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

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

内容参考于:图灵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 5
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 6
    invoke-virtual {p0}, Lcom/example/course1/SmailTest;->getName()Ljava/lang/String;

    .line 7
    return-void
.end method


# virtual methods
.method public getName()Ljava/lang/String;
    .registers 2

    .prologue
    .line 10
    const-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 5
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 6
    invoke-static {}, Lcom/example/course1/SmailTest;->getNames()Ljava/lang/String;

    .line 7
    return-void
.end method

.method private static getNames()Ljava/lang/String;
    .registers 1

    .prologue
    .line 14
    const-string v0, "hello world"

    return-object v0
.end method


# virtual methods
.method public getName()Ljava/lang/String;
    .registers 2

    .prologue
    .line 10
    const-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 13
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 14
    invoke-static {}, Lcom/example/course1/SmailTest;->func3()V

    .line 15
    invoke-virtual {p0}, Lcom/example/course1/SmailTest;->getName()Ljava/lang/String;

    .line 16
    invoke-static {}, Lcom/example/course1/SmailTest;->getNames()Ljava/lang/String;

    .line 17
    return-void
.end method

.method public static func3()V
    .registers 14

    .prologue
    const/4 v10, 0x1

    const/4 v9, 0x0

    .line 28
    const-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, v4

    if-le v8, v10, :cond_41

    .line 33
    aget-object v8, v4, v10

    const-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, v5

    move v8, v9

    :goto_1c
    if-ge v8, v10, :cond_41

    aget-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, v2

    const/4 v12, 0x2

    if-ne v11, v12, :cond_39

    .line 38
    const/4 v11, 0x0

    :try_start_2b
    aget-object v11, v2, v11

    const/4 v12, 0x1

    aget-object v12, v2, v12

    const-string v13, "UTF-8"

    invoke-static {v12, v13}, Ljava/net/URLDecoder;->decode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

    move-result-object v12

    invoke-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_39
    add-int/lit8 v8, v8, 0x1

    goto :goto_1c

    .line 39
    :catch_3c
    move-exception v0

    .line 40
    .local v0, "e":Ljava/io/UnsupportedEncodingException;
    invoke-virtual {v0}, Ljava/io/UnsupportedEncodingException;->printStackTrace()V

    goto :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_41
    invoke-virtual {v3}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v8

    invoke-virtual {v8}, Ljava/lang/String;->getBytes()[B

    move-result-object v8

    invoke-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 49
    return-void
.end method

.method private static getNames()Ljava/lang/String;
    .registers 1

    .prologue
    .line 24
    const-string v0, "hello world"

    return-object v0
.end method


# virtual methods
.method public getName()Ljava/lang/String;
    .registers 2

    .prologue
    .line 20
    const-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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《FreeRTOS任务基础知识以及任务创建相关函数》

目录 1.FreeRTOS多任务系统与传统单片机单任务系统的区别 2.FreeRTOS中的任务&#xff08;Task&#xff09;介绍 2.1 任务特性 2.2 FreeRTOS中的任务状态 2.3 FreeRTOS中的任务优先级 2.4 在任务函数中退出 2.5 任务控制块和任务堆栈 2.5.1 任务控制块 2.5.2 任务堆栈…

RHCE的学习(18)

第二章 变量和引用 深入认识变量 在程序设计语言中&#xff0c;变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌握的一个非常基础的概念。只有理解变量的使用方法&#xff0c;才能设计出良好的程序。本节将介绍Shell中变量的相关知识。 什么是变量 顾名思义…

AG32 FPGA部分简单开发

环境 Quartus 13.0&#xff08;Quartus 不能使用Lite 版本&#xff0c;需要使用Full 版本&#xff09;AGM SDKSupra&#xff08;快捷方式在SDK目录下&#xff0c;具体路径为AgRV_pio\packages\tool-agrv_logic\bin&#xff09; FPGA编程 在AG32芯片中&#xff0c;拥有异构双…

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined

VUE_PROD_HYDRATION_MISMATCH_DETAILS 未明确定义。您正在运行 Vue 的 esm-bundler 构建&#xff0c;它期望这些编译时功能标志通过捆绑器配置全局注入&#xff0c;以便在生产捆绑包中获得更好的tree-shaking优化。 Vue.js应用程序正在使用ESM&#xff08;ECMAScript模块&#…

Spring——事务

事务 JdbcTemplate 简介 Spring框架对JDBC进行封装&#xff0c;使用JdbcTemplate方便实现对数据库操作 准备工作 ①搭建子模块 搭建子模块&#xff1a;spring-jdbc-tx ②加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependenc…

集合类源码浅析のJDK1.8ConcurrentHashMap(下篇)

文章目录 前言一、分段扩容1、addCount2、transfer3、helpTransfer 二、查询二、删除总结 前言 主要记录ConcurrentHashMap&#xff08;笔记中简称CHM&#xff09;的查询&#xff0c;删除&#xff0c;以及扩容方法的关键源码分析。 一、分段扩容 1、addCount 扩容的逻辑主要在…

H5页面多个视频如何只同时播放一个?

目录 背景1. 首先介绍下 muted 属性2. 监听播放和暂停操作3. 视频播放完毕后返回桌面&#xff0c;再进入H5页面发现视频封面丢失置灰解决思路&#xff1a; 背景 页面模块同时有个四个视频模块&#xff0c;发现可以同时播放四个视频&#xff0c;但是理想的是每次只播放一个。 …

D69【 python 接口自动化学习】- python 基础之数据库

day69 Python 执行 SQL 语句 学习日期&#xff1a;20241115 学习目标&#xff1a; MySQL 数据库&#xfe63;- Python连接redis 学习笔记&#xff1a; redis数据库的用途 使用Python访问redis数据库 使用Python对redis数据库进行读写操作 总结 1. redis是一款高性能的键…

jmeter常用配置元件介绍总结之逻辑控制器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之逻辑控制器 逻辑控制器1.IF控制器2.事务控制器3.循环控制器4.While控制器5.ForEach控制器6.Include控制器7.Runtime控制器8.临界部分控制器9.交替控制器10.仅一次控制器11.简单控制器12.随机控制器13.随机顺序控制器14.吞…

21.<基于Spring图书管理系统②(图书列表+删除图书+更改图书)(非强制登录版本完结)>

PS&#xff1a; 开闭原则 定义和背景‌ ‌开闭原则&#xff08;Open-Closed Principle, OCP&#xff09;‌&#xff0c;也称为开放封闭原则&#xff0c;是面向对象设计中的一个基本原则。该原则强调软件中的模块、类或函数应该对扩展开放&#xff0c;对修改封闭。这意味着一个软…

springboot实现简单的数据查询接口(无实体类)

目录 前言&#xff1a;springboot整体架构 1、ZjGxbMapper.xml 2、ZjGxbMapper.java 3、ZjGxbService.java 4、ZjGxbController.java 5、调用接口测试数据是否正确 6、打包放到服务器即可 前言&#xff1a;springboot整体架构 文件架构&#xff0c;主要编写框选的这几类…

【已解决】 Tomcat10.1.x使用JSTL标签库

IDEA创建Java EE项目&#xff0c;使用Spring Spring MVC MyBatis框架&#xff0c;使用maven管理依赖。项目当前的环境是&#xff1a; Tomat 10.1.28Maven 3.6.3JDK 17 项目的功能&#xff1a;读取数据库的report表中的数据&#xff0c;返回一个List集合对象reportList在JSP…

权限相关知识

1.Linux权限的概念 在说Linux权限的概念之前我来问大家一个问题&#xff0c;你们觉得什么是权限&#xff1f; 权限平时的体现呢&#xff0c;就比如不是校长的亲戚就不能逛办公室&#xff0c;没充会员的爱奇艺看不了VIP影视剧&#xff0c;没成会员的的蛋糕店拿不到会员价等等等…

uniapp如何i18n国际化

1、正常情况下项目在代码生成的时候就已经有i18n的相关依赖&#xff0c;如果没有可以自行使用如下命令下载&#xff1a; npm install vue-i18n --save 2、创建相关文件 en文件下&#xff1a; zh文件下&#xff1a; index文件下&#xff1a; 3、在main.js中注册&#xff1a…

[刷题]入门3.彩票摇奖

博客主页&#xff1a;算法歌者本篇专栏&#xff1a;[刷题]您的支持&#xff0c;是我的创作动力。 文章目录 1、题目2、基础3、思路4、结果 1、题目 链接&#xff1a;洛谷-P2550-彩票摇奖 2、基础 此题目考察数组、三重循环、自增操作的能力。 3、思路 写代码时候&#xf…

JVM垃圾回收详解(重点)

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收 Java 堆是垃圾收集器管理的主要区域&#xff0c;因此也被称作 GC 堆&#xff08;Garbage Collected Heap&…

git rebase --continue解冲突操作

git rebase --continue解冲突操作 如果只是执行了 git rebase 命令&#xff0c;那么git会输出一下“错误”提示&#xff1a; There is no tracking information for the current branch. Please specify which branch you want to rebase against. See git-rebase(1) for detai…

腾讯地图GL JS点标识监听:无dragend事件的经纬度获取方案

引入腾讯地图SDK <!--腾讯地图 API--><script charset"utf-8" src"https://map.qq.com/api/gljs?librariestools&v1.exp&key***"></script>构建地图容器 <div class"layui-card"><div class"layui-car…

249: 凸包面积

解法&#xff1a; 使用Andrew算法【计算几何/凸包】安德鲁算法&#xff08;Andrews Algorithm&#xff09;详解_andrew算法求凸包-CSDN博客 排序&#xff1a; 将所有点按照x坐标进行升序排序。如果x坐标相同&#xff0c;则按照y坐标升序排序。 初始化栈&#xff1a; 使用一个栈…

基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频

文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…