13.安卓逆向-frida基础-编写hook脚本1

news2024/9/28 3:14:55

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

内容参考于:图灵Python学院

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

工具下载:

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

提取码:6tw3

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

上一个内容:12.安卓逆向-frida基础-hook

上一个内容里搭建了Frida环境,并简单的使用Frida hook的脚本hook了一个app的网络,接下来就开始写,怎么才能写一个hook脚本,上一个内容里的脚本是都是什么意思

frida脚本的关键字

Java.use():它用于获取 Java类的对象,以便于在 JavaScript 中对其进行操作。例如,Java.use('java.util.ArrayList') 会返回 ArrayList 类的代理对象,然后就可以使用Frida访问ArrayList 对象

Java.perform():它用于在 Frida 的 JavaScript 环境中执行代码块。这个代码块中可以包含对 Java 类的修改、Hook 方法的实现等操作。

implementation属性:用于指定要 Hook 的方法的新实现。通过设置 implementation 属性,可以在方法执行前后添加自定义的逻辑。例如, targetMethod.implementation = function(){ ... } 可以将 targetMethod 替换为自定义的实现。

this 和参数:在自定义的方法实现中,可以使用 this 关键字表示原始方法的调用和属性访问。此外,可以使用传入的参数对方法的输入进行修改或记录

调用原始方法:在自定义的方法实现中,通过调用原始方法,可以确保原始方法的行为仍然被执行。例如, this.targetMethod.apply(this, arguments) 可以调用原始的 targetMethod 方法。

frida和java的数据类型对应

有一个app(没法给)

然后对这个app进行反编译,反编译工具jadx-gui

然后打开jadx-gui把app拖到它的界面里,如下图

然后就可以看到它的源码了

然后可以看到它里面有静态方法(static方法)和非静态方法,如下图红框

它们都属于Utils类

然后接下来就使用Frida来HOOK这个app里的函数,首先是Utils类里的函数,调用它的静态方法,如下图

说明:

代码:

function demo(){
    var utils = Java.use("com.luoge.com.Utils")
    utils.getCalc.implementation = function(i, i2){
        console.log("参数1--》"+i);// 查看参数
        console.log("参数2--》"+i2);// 查看参数
        res = this.getCalc(i, i2); // 调用原本的getCalc方法
        return res
    }
}

上方是hook getCalc方法的脚本,执行脚本要在java.perform里写

function demo(){
    var utils = Java.use("com.luoge.com.Utils")
    utils.getCalc.implementation = function(i, i2){
        console.log("参数1--》"+i)
        console.log("参数2--》"+i2)
        var res = this.getCalc(i, i2)
        console.log("返回值--》"+res)
        return res
    }
}

function main(){
    Java.perform(function (){ // 调用java代码也就是getCalc方法
        demo()
    })
}
setImmediate(main)// 调用入口函数

然后测试代码,开启f14(也就是手机上的FridaServer)开启之后测试Firda脚本,如下图,下图中使用的是frida -UF -l ./lizi1.js,-UF它找当前在前台运行的app,前台运行效果是可以看到app的界面,然后下图可以看到getCalc方法的入参和返回值

这里补充一下执行了 frida -UF -l ./lizi1.js 指令怎么退出,如下图红框输入exit然后按回车(Enter键)就退出了

然后源码中调用getCalc的位置,如下图红框,它也确实传的2000和2000

然后下图红框它是4000,接下来我们通过脚本修改getCalc方法它的返回值试试

脚本代码,返回值改成了8889999,在不退出的情况下,修改脚本代码之后不需要重新执行frida -UF -l ./lizi1.js指令,它会自动根据最新的脚本代码执行

然后再次点击普通方法按钮,可以看到下图红框内容变了,之前很火的羊了个羊那些用脚本通过的就是这样的一样原理,羊了个羊它第一关很简单第二关很难,它就是在第一关通过之后在请求完第二关的时候把返回值改成第一关的数据,这样不管第几关玩的都是第一关,然后有的东西玩多少分钟看多久短视频它会返现,可以通过修改返回值的方式强制玩1秒钟返现

然后再写一个修改它入参的例子,修改下图红框setFlag方法的参数的值,它也是一个静态方法

脚本代码

function demo1(){
    var utils = Java.use("com.luoge.com.Utils")
    utils.setFlag.implementation = function(str){
        console.log("参数1--》"+str)
        var res = this.setFlag("52am")
        console.log("返回值--》"+res)
        return res
    }
}


function main(){
    Java.perform(function (){ // 调用java代码也就是getCalc方法
        demo1()
    })
}
setImmediate(main)// 调用入口函数

效果图:强制改入参

它源码中调用的setFlag函数的入参

调用非静态方法,getFlag方法

脚本代码

function demo1(){
    var utils = Java.use("com.luoge.com.Utils")
    utils.setFlag.implementation = function(str){
        console.log("setFlag参数1--》"+str)
        var res = this.setFlag("52am")
        console.log("setFlag返回值--》"+res)
        return res
    }

    utils.getFlag.implementation = function(){
        var res = this.getFlag()
        console.log("getFlag返回值--》"+res)
        return "52"
    }

}


function main(){
    Java.perform(function (){ // 调用java代码也就是getCalc方法
        demo1()
    })
}
setImmediate(main)// 调用入口函数

效果图:

hook重载方法

重载方法是方法名一样但是参数不一样,如下图getOver就是重载方法

脚本如下

运行它会报错说getOver是一个重载函数需要指定,记住下图白框里的东西

代码

function demo2(){// hook重载方法
    var utils = Java.use("com.luoge.com.Utils")
    utils.getOver.overload().implementation = function(){
        var res = this.getOver()
        console.log("demo2返回值-》"+res+"\n")
        return res
    }
    utils.getOver.overload('int').implementation = function(i){
        console.log("overload('int')入参-》"+i+"\n")
        var res = this.getOver(i)
        console.log("overload('int')返回值-》"+res+"\n")
        return res
    }
    utils.getOver.overload('com.luoge.com.Money').implementation = function(a){
        console.log("overload('com.luoge.com.Money')入参-》"+a+"\n")
        var res = this.getOver(a)
        console.log("overload('com.luoge.com.Money')返回值-》"+res+"\n")
        return res
    }
}

function main(){
    Java.perform(function (){ // 调用java代码也就是getCalc方法
        demo2()
    })
}
setImmediate(main)// 调用入口函数

修改之后的脚本和hook源码中的方法对应关系,如下图

效果图:

一次性hook全部重置方法

function demo2(){// hook重载方法
    var utils = Java.use("com.luoge.com.Utils")
    var o = utils.getOver.overloads// 获取全部的重载方法,给到o
    // o.length这里的意思是获取 getOver方法有多少个重载方法
    // for是一个运行会多次执行{}之间的代码,执行多少次取决于 i < o.length 这个条件
    for(var i = 0; i < o.length;i++){
        // utils.getOver.overloads[i],i是一个数字,所以
        // utils.getOver.overloads[i]可以写成utils.getOver.overloads[0]
        // utils.getOver.overloads[1]、utils.getOver.overloads[2]。。。。
        // 下方的意思就会把所有重载方法全部拦截
        utils.getOver.overloads[i].implementation = function (){
            // arguments 里面是入参,arguments.length是获取当前getOver函数的入参个数
            for(var j = 0; j < arguments.length; j++){
                // arguments[j]里的j是一个数字,arguments[j]可以写成
                // arguments[0],arguments[1],arguments[2]。。。
                // arguments[0]这意思是取出第一个入参的值
                console.log("参数序号:"+j+" 参数的值:"+arguments[j])
            }
            // 调用原本的方法,原本的方法会根据 arguments不同从而调用不同的getOver方法
            return this.getOver.apply(this, arguments);
        }
    }
}

function main(){
    Java.perform(function (){ // 调用java代码也就是getCalc方法
        demo2()
    })
}
setImmediate(main)// 调用入口函数

效果图:

第二种hook全部重载方法的写法forEach

function demo2(){// hook重载方法
    var utils = Java.use("com.luoge.com.Utils")
	var methods = utils['getOver'].overloads;
    console.log(methods);
    console.log(methods.length);
    methods.forEach(function(method){
        method.implementation = function(){
            for(var j = 0; j < arguments.length; j++){
                // arguments[j]里的j是一个数字,arguments[j]可以写成
                // arguments[0],arguments[1],arguments[2]。。。
                // arguments[0]这意思是取出第一个入参的值
                console.log("参数序号:"+j+" 参数的值:"+arguments[j]+"\n")
            }
            return this.getOver.apply(this, arguments);
        }
    })
}

function main(){
    Java.perform(function (){ // 调用java代码也就是getCalc方法
        demo2()
    })
}
setImmediate(main)// 调用入口函数

源码中调用的getOver方法

手动给它们传参,脚本代码如下图红框

function demo3(){
    var utils = Java.use("com.luoge.com.Utils")

    utils.getOver.overload('com.luoge.com.Money').implementation = function(a){

        var m = Java.use("com.luoge.com.Money")
        var money = m.$new()
        var res = utils.getOver.overload('com.luoge.com.Money').call(this, money)
        console.log("demo3返回值1"+res+"\n")

        res = utils.getOver(113331)
        console.log("demo3返回值2"+res+"\n")

        res = utils.getOver()
        console.log("demo3返回值3"+res+"\n")
        return res
    }
}

function main(){
    Java.perform(function (){ // 调用java代码也就是getCalc方法
//        demo()
//        demo1()
//        demo2()
        demo3()
    })
}
setImmediate(main)// 调用入口函数

效果图:


img

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

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

相关文章

外国电影演员识别系统源码分享

外国电影演员识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

AI产品经理必知:核心人工智能技术概览

第一章&#xff1a;AI产品经理是否需要懂技术及其程度 在当今AI行业快速发展的背景下&#xff0c;作为一位AI产品经理&#xff0c;理解并掌握一定的AI技术知识不仅是锦上添花&#xff0c;更是不可或缺的素质。那么&#xff0c;AI产品经理究竟需要懂到何种程度的技术呢&#xf…

国内车市销量激增,理想成功超越BBA

文/王俣祺 导语&#xff1a;随着“金九银十”的到来&#xff0c;国内汽车市场迎来了一个充满活力的开局。乘用车市场的销量已经迎来新的突破&#xff0c;彰显出中国汽车市场的韧性和潜力。尤为引人注目的是&#xff0c;新能源汽车销量同样激增&#xff0c;成为推动市场增长的重…

C++--IO流

目录 1. C语言的输入与输出 2. 流是什么 3. CIO流 4 stringstream的简单介绍 1. C语言的输入与输出 C 语言中我们用到的最频繁的输入输出方式就是 scanf () 与 printf() 。 scanf(): 从标准输入设备 ( 键 盘 ) 读取数据&#xff0c;并将值存放在变量中 。 printf(): 将…

C++ : 多态

1. 多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。 举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学…

通过队列实现栈

请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int to…

基于微信小程序爱心领养小程序设计与实现(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

基于Hive和Hadoop的电信流量分析系统

本项目是一个基于大数据技术的电信流量分析系统&#xff0c;旨在为用户提供全面的通信数据和深入的流量使用分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

无人船在海洋勘探领域的应用!

一、具体应用 海底地形测绘&#xff1a; 无人船可以搭载多波束测深仪等先进设备&#xff0c;进行高精度的海底地形测绘。这些设备能够生成详细的海底地形图&#xff0c;为海洋工程设计和施工提供详尽的水下地形资料。 海底资源勘探&#xff1a; 通过搭载磁力仪、重力仪等地…

安卓手机视频被误删怎么恢复,这3个方法满足你

视频作为一种直观、生动的记录方式&#xff0c;受到了广大用户的喜爱&#xff0c;许多朋友们都喜欢用视频来记录生活或工作中的重要时刻。但有时候会遇到突发情况&#xff0c;导致这些重要视频丢失。别担心&#xff0c;下面小编将同您一起探索这视频恢复的方法&#xff0c;轻松…

springboot健康管理平台-计算机毕业设计源码38430

摘要 本研究旨在设计和实现一个基于大数据的健康管理平台&#xff0c;该平台整合了健康测评、健康知识、体检信息、健康日志、健康数据、我的账户、体检预约、体检报告、健康预测和测评报告等功能模块。随着大数据技术的快速发展&#xff0c;健康管理领域也迎来了新的机遇。随着…

初识Vue3(详细版)

目录 前言 Vue3简介 spring 和Vue3 区别 创建Vue3工程 1 使用vite 构建 0 前提;安装好node.js(node.js作为JavaScript的运行环境&#xff09; 1 打开终端&#xff0c;切换到桌面&#xff08;或自己专门创建一个文件夹单独放置&#xff09; 2 输入命令&#xff1a;npm ge…

32 C 语言指针的长度与运算(指针加减整数、指针自增自减、同类型指针相减、指针的比较运算)

目录 1 指针的长度 2 指针与整数的加减运算 3 指针自增与自减 4 同类型指针相减 5 指针的比较运算 6 测试题 1 指针的长度 在 C 语言中&#xff0c;sizeof 运算符可以用来计算指针的长度。指针的长度实际上与指针所指向的数据类型无关&#xff0c;而是与系统的位数&…

人工智能开发实时语音识别系统应用

内容提要 项目分析预备知识项目实战 一、项目分析 1、问题提出 数字0-9是我们生活中常见的10个基数&#xff0c;在医院、银行、饭店等场所&#xff0c;由于资源和人手的受限&#xff0c;人们必须排队等候服务&#xff0c;叫号系统应运而生。 任何一个数字&#xff0c;都是…

掌握AI提示词的艺术:应用、防护与成为提示词专家的策略

掌握好提示词的编写&#xff0c;可以用来做的事情&#xff1a; 写简历、输出面试题、输出ppt、思维导图、提取摘要、翻译、总结会议纪要、总结审计报告、数据分析、写广告/营销/请假等跟文字相关的文案、爆款文章、小说、写周报/月报。 如何写提示词 4大原则 1、 指令要精简…

干部画像——精准辅助干部选拔的核心利器

干部画像&#xff0c;作为现代干部管理体系中的一项重要创新&#xff0c;已逐步成为精准辅助干部选拔的核心利器。通过综合运用多维度信息收集、系统化整理与科学化分析的方法&#xff0c;全面、客观、真实地勾勒出每位干部的综合素质与能力画像&#xff0c;为干部选拔工作提供…

Chromium webui如何与c++接口通信

参考谷歌浏览器设置页面下载为例&#xff1a;1、前端js lazy_load.js 需要在chrome\browser\resources\settings\BUILD.gn里面加进来if (optimize_webui) {build_manifest "build_manifest.json"optimize_webui("build") {host "settings"in…

开关电源要做哪些测试?

开关电源在设计和生产过程中&#xff0c;需要进行一系列的测试以确保其质量性能、可靠性和安全性。以下是一些主要的测试项目&#xff1a; 一、常规功能测试 输出电压测试&#xff1a;测量开关电源在不同负载条件下的输出电压&#xff0c;确保其稳定在预设值范围内。输出电流…

神仙级AI产品经理入门手册,从入门到入魂非常详细,收藏这一篇,少走三年弯路!!!

作为一个产品经理&#xff0c;你可能已经熟悉了一些常见的AI技术和应用&#xff0c;比如机器学习、深度学习、自然语言处理、计算机视觉等。 但是&#xff0c;你是否了解什么是大模型&#xff1f;大模型又有什么特点和优势&#xff1f;为什么大模型会成为AI领域的一个重要趋势…

DERT目标检测源码流程图main.py的执行

DERT目标检测源码流程图main.py的执行 官网预测脚本 补充官网提供的预测部分的代码信息。 from PIL import Image import requests import matplotlib.pyplot as pltimport torch from torch import nn from torchvision.models import resnet50 import torchvision.transform…