利用系统函数与堆栈快速定位app关键代码

news2024/11/26 21:46:28

string.trim

这个还是比较关键的,没准可以从这里得到加密方式,或者挖到sql注入,文件上传等漏洞。进一步利用可以打印堆栈来用

Java.perform(function(){

    function showStack(){

        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        

    }

    var str= Java.use("java.lang.String");
    str.trim.implementation = function(){


       // showStack();
        console.log("str.trim",this);
        return this.trim();

    }


});

在这里插入图片描述

hashmap.put

hook代码:

Java.perform(function(){

    function showStack(){
        var log = Java.use("android.util.Log")
        var throwable = Java.use("java.lang.Throwable")
        console.log(log.getStackTraceString(throwable.$new()))
        

    }

    var hashmap = Java.use("java.util.HashMap")
    hashmap.put.implementation = function (a,b){
        if(a.equals("username")){
        
        showStack()
        console.log("hashMap.put: ",a,b)

        }
       
        return this.put(a,b)
    }

});

结果:
在这里插入图片描述

ArrayList.add

可以先用 console.log打印每一个参数,然后全局搜索敏感参数比如username=15149029981,最后加一个if判断进行打印堆栈:

hook代码:

Java.perform(function(){

    function showStack(){

        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        

    }

    var arrayList= Java.use("java.util.ArrayList");
    arrayList.add.overload('java.lang.Object').implementation = function (a){
        if(a.equals("username=15149029981")){

            showStack();
            console.log("ArrayList.add: ",a);
            
        }
        return this.add(a);
    }
    // arrayList.add.overload('int','java.lang.Object').implementation = function (a,b){
    //     console.log("ArrayList.add: ",a,b);
    //     return this.add(a,b);
    // }

});

结果:
在这里插入图片描述

textUtils.isEmpty

同样也是可以先用 console.log打印每一个参数,然后全局搜索敏感参数比如username=15149029981,最后加一个if判断进行打印堆栈:

Java.perform(function(){

    function showStack(){

        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        

    }

    var text= Java.use("android.text.TextUtils");
    text.isEmpty.implementation = function(a){
            showStack();
            console.log("textUtils:",a);
            return this.isEmpty(a);

    }


});

在这里插入图片描述

Java.perform(function(){

    function showStack(){

        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        

    }

    var text= Java.use("android.text.TextUtils");
    text.isEmpty.implementation = function(a){
        if(a=="2v+DC2gq7RuAC8PE5GZz5wH3/y9ZVcWhFwhDY9L19g9iEd075+Q7xwewvfIN0g0ec/NaaF43/S0="){
            showStack();
            console.log("textUtils:",a);
        }
        return this.isEmpty(a);

    }


});

在这里插入图片描述

这里的返回结果,应该是我们登陆返回的结果的加密

log.w

Java.perform(function(){

    function showStack(){

        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        

    }

    var wr= Java.use("android.util.Log");
    wr.w.overload('java.lang.String','java.lang.String').implementation = function(tag,message){


        //showStack();
        console.log("log.w:",tag,message);
        return this.w(tag,message);

    }


});

在这里插入图片描述
在这里插入图片描述

EditText.getText

Java.perform(function(){

    function showStack(){

        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        

    }

    var te1= Java.use("android.widget.EditText");
    te1.getText.overload.implementation = function(){
        
        var res1 = this.getText();
        res1 = Java.cast(res1,Java.use("java.lang.CharSequence"));
        console.log("getText:",res1.toString());
        //showStack();
        return res1;

    }


});

Collections.sort

Java.perform(function(){

    function showStack(){

        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        

    }

    var col= Java.use("java.util.Collections");
    col.sort.overload('java.util.List', 'java.util.Comparator').implementation = function(a,b){
        var res=Java.cast(a,Java.use("java.util.ArrayList"))
        showStack();
        console.log("sort:",res.toString(),res.toString());
        return this.sort(a,b);

    }

    col.sort.overload('java.util.List').implementation = function(a){
        var res=Java.cast(a,Java.use("java.util.ArrayList"))
        showStack();
        console.log("sort:",res.toString());
        return this.sort(a);

    }


});

在这里插入图片描述

JSONobject.put与JSONobject.getString

Java.perform(function(){

    function showStack(){

        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        

    }
    // .overload('java.lang.String', 'double')
	// .overload('java.lang.String', 'int')
	// .overload('java.lang.String', 'long')
	// .overload('java.lang.String', 'java.lang.Object')
	// .overload('java.lang.String', 'boolean')

    var json1= Java.use("org.json.JSONObject");
    json1.put.overload('java.lang.String', 'java.lang.Object').implementation = function(a,b){
        showStack();
        console.log("jsonput:",a,b);
        return this.put(a,b);

    }

    json1.getString.implementation = function(a){
        showStack();
        console.log("jsongetstring:");
        var res = this.getString(a);
        console.log(res);

        return res;

    }

});

在这里插入图片描述

toast.show

Java.perform(function(){

    function showStack(){

        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        

    }


    var toa= Java.use("android.widget.Toast");
    toa.show.implementation = function(){
        showStack();
        console.log("toastshow:");
        return this.show();

    }



});

在这里插入图片描述

Base64.encodeToString

Java.perform(function(){

    function showStack(){

        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        

    }


    var bas= Java.use("android.util.Base64");
    bas.encodeToString.overload('[B', 'int').implementation = function(a,b){
        showStack();
        console.log("base64end:",JSON.stringify(a));
        var res = this.encodeToString(a,b)
        console.log("base64res:",res)

        return res

    }



});

在这里插入图片描述

String.getBytes

Java.perform(function(){

    function showStack(){

        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
        

    }


    var str = Java.use("java.lang.String");
    str.getBytes.overload().implementation = function () {
        //showStack();
        var result = this.getBytes();
        var newStr = str.$new(result);
        console.log("str.getBytes result: ", newStr);
        return result;
    }
    str.getBytes.overload('java.lang.String').implementation = function (a) {
       // showStack();
        var result = this.getBytes(a);
        var newStr = str.$new(result, a);
        console.log("str.getBytes result: ", newStr);
        return result;
    }



});

在这里插入图片描述

打印堆栈:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP/IP网络编程——基于 TCP 的服务端/客户端(下)

完整版文章请参考: TCP/IP网络编程完整版文章 文章目录第 5 章 基于 TCP 的服务端/客户端(2)5.1 回声客户端的完美实现5.1.1 回声服务器没有问题,只有回声客户端有问题?5.1.2 回声客户端问题的解决办法5.1.3 如果问题不…

chrome插件开发时使用import

问题描述 在进行chrome插件开发时,我们有时会希望把一些公共的方法包装成一个模块,例如发送网络请求的方法,然后在其他js文件中import然后调用,但是在实际操作时,遇到了这样的问题: 控制台报错cannot use …

Vistual Studio Code 安装与配置C/C++环境

1. 下载VScode 2. 安装cpptools工具 3. 下载MinGW 4. 配置环境变量 5. 使用简单的.cpp文件配置C环境 6. 运行 注:本文所有的地址配置要根据读者的实际情况来,不要照文章复制!!! 下载VScode 下载链接:https…

浏览器调用本地DLL的方法

要在浏览器中调用本地DLL,常见的方法是使用插件。但是为了安全,现在有的浏览器对插件开发做了限制,不让插件调用外部DLL。比如说Chrome,为了调用外部的DLL,我们只能使用早期的chrome版本。 还有一种方法就是在电脑上安…

linux编辑器的使用(gcc,g++)

前言 gcc/g是一个编译器。 我们程序的翻译有四个步骤1.预处理(头文件展开,条件编译,宏替换,去注释)2.编译(c语言汇编语言)3.汇编(汇编->可重定位目标二进制文件,不可以被执行的,bin.obj)----只是把我们自己的代码进…

下载Windows ISO镜像的方法 (超详细 适合新手入门)

前言 📜“作者 久绊A” 专注记录自己所整理的Java、web、sql等,IT技术干货、学习经验、面试资料、刷题记录,以及遇到的问题和解决方案,记录自己成长的点滴 目录 前言 一、镜像介绍 1、大概介绍 2、详细介绍 二、下载Window…

Solon 1.12.4 发布

一个更现代感的 Java "生态型"应用开发框架:更快、更小、更自由。不是 Spring,没有 Servlet,也无关 JavaEE;新兴独立的开放生态 (已有150来个生态插件) 。主框架仅 0.1 MB。 相对于 Spring Boot…

JVM学习总结,全面介绍运行时数据区域、各类垃圾收集器的原理使用、内存分配回收策略

参考资料:《深入理解Java虚拟机》第三版 文章目录一,运行时数据区域(基础重中之重)二,垃圾收集器与内存分配策略1)对象已死2)再谈引用3)对象回收4)内存分代收集理论&…

【HBase入门】10. HBase高可用、HBase架构、常见问题汇总

HBase高可用 考虑关于HBase集群的一个问题,在当前的HBase集群中,只有一个Master,一旦Master出现故障,将会导致HBase不再可用。所以,在实际的生产环境中,是非常有必要搭建一个高可用的HBase集群的。 HBase…

【Maven】聚合与继承

目录 1. 聚合工程 2. 聚合工程开发 3. 继承关系 4. 继承关系开发 5. 聚合与继承的区别 1. 聚合工程 什么叫聚合? 聚合:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合 聚合工程:通常是一个不具有业务功能的”空…

如何使用Excel列提取合并器提取多个表格中的一列数据然后合并到一个文件

在我们日常工作中,你可能经常遇到有几十个或更多的Excel文件,每个文件中都包含了相同类型的信息例如姓名、邮箱、地址等等,但它们却在不同文件中不同的列。当你想进行数据汇总或合并的时候,把不同表中同样类型的数据合并在一起&am…

一款用于PE文件绑定免杀的工具: Shellter

简介 Shellter是一种动态二进制程序壳程序,它可以在现有的可执行文件中隐藏恶意软件。它使用动态链接库技术来实现恶意代码的注入,并且可以在不修改现有的可执行文件的情况下进行注入。这使得它非常难以检测,因为它不会改变文件的哈希值或数…

[数据结构基础]排序算法第二弹 -- 选择排序、堆排序和冒泡排序

目录 一. 选择排序 1.1 选择排序的实现思路 1.2 选择排序函数代码 1.3 选择排序的时间复杂度分析 二. 堆排序 2.1 堆排序的实现思路 2.2 堆排序函数代码 2.3 堆排序的时间复杂度分析 三. 冒泡排序 3.1 冒泡排序的基本思想 3.2 冒泡排序函数代码 3.3 冒泡排序的时间…

【微服务】Gateway统一网关

更多内容点击查看微服务学习专栏 一.引入 我们为什么需要网关? 当我们所有的服务摆在那里允许任何人发送请求访问是不是不太安全? 不是所有的业务都是对外公开的! Gateway网关是我们服务的守门神,是所有微服务的统一入口&…

机器自动翻译古文拼音 - 十大宋词 - 桂枝香 金陵怀古 王安石

桂枝香金陵怀古 北宋王安石 登临送目,正故国晚秋,天气初肃。 千里澄江似练,翠峰如簇。 归帆去棹斜阳里,背西风,酒旗斜矗。 彩舟云淡,星河鹭起,画图难足。 念往昔、繁华竞逐,叹门外…

【Node.js实战】一文带你开发博客项目之初识Express(安装Express,处理路由,中间件机制)

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

JAVA SE复习(第2章 Java基础语法)

本文笔记来自硅谷柴林燕老师的笔记 只为自己看笔记方便使用 不做他用第2章 Java基础语法2.1 注释(annotation)(掌握)注释:就是对代码的解释和说明。其目的是让人们能够更加轻松地了解代码。为代码添加注释,…

2023年web类第一期总结

🍀本人简介: 吉师大一最爱逃课的网安混子、 华为云享专家、阿里云专家博主、腾讯云自媒体分享计划博主、 华为MindSpore优秀开发者、迷雾安全团队核心成员,CSDN2022年运维与安全领域第15名 🍁本人制作小程序以及资源分享地址&am…

计算机相关专业混体制的解决方案(国企之银行与券商)

文章目录1、各大银行1.1 银行的分类1.2 信息科技部(工作内容,招聘条件,待遇)2、各大券商2.1 证券公司待遇2.1 证券公司要求3、其他金融3.1 保险公司3.2 其他金融国企之银行与券商的适用对象: 如果你技术好,…

队列--专题讲解

文章目录模拟队列queue头文件定义基本操作循环队列queue优先队列priority_queue银行大厅排队训练挑战模拟队列 先进先出 队列大概模样 代码截屏&#xff1a; queue 头文件 #include <queue>定义 //队列 queue<int> q;基本操作 //向队尾插入一个元素q.push()…