当前位置: 首页 > news >正文

14.安卓逆向-frida基础-编写hook脚本2

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

内容参考于:图灵Python学院

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

工具下载:

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

提取码:6tw3

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

上一个内容:13.安卓逆向-frida基础-编写hook脚本1

接着上一个内容继续,接下来是HOOK构造方法

如下图红框,它有两个构造方法

app中调用构造方法的位置

脚本代码

function demo4(){// HOOK构造方法var money = Java.use("com.luoge.com.Money")money.$init.overload("java.lang.String","int").implementation = function(str, ii){// 重写构造方法console.log(str, ii) // 查看原本参数的值str = "飞机"// 修改参数ii = 22222// 修改参数this.$init(str,ii) // 调用原本的构造方法}}

效果图:

主动调用

效果图:

function demo5(){var res = Java.use("com.luoge.com.Money").$new("xxx",23313).getInfo()console.log("主动调用", res)
}

第二种主动调用

function demo5(){var res = Java.use("com.luoge.com.Money").$new("xxx",23313).getInfo()console.log("主动调用", res)Java.choose("com.luoge.com.Money", {onMatch:function(obj){ // 这里每找到一个Money对象就会调用一次console.log('Java.choose', obj.getInfo())},onComplete:function(){console.log('Money对象搜索完执行的代码')}})
}

HOOK字段

字段就是下图红框里的东西

HOOK静态的字段

function demo6(){var money = Java.use("com.luoge.com.Money")console.log("flag类型", JSON.stringify(money.flag));console.log("flag的值", money.flag.value);money.flag.value = "mmmm"console.log("flag修改之后的值", money.flag.value);
}

HOOK非静态的字段

function demo6(){var money = Java.use("com.luoge.com.Money")
// console.log("flag类型", JSON.stringify(money.flag));
// console.log("flag的值", money.flag.value);
// money.flag.value = "mmmm"
//  console.log("flag修改之后的值", money.flag.value);Java.choose("com.luoge.com.Money", {onMatch:function(obj){ // 这里每找到一个Money对象就会调用一次console.log('Java.choose非静态变量(字段)', obj._name.value)obj._name.value = '张飞'console.log('Java.choose修改之后非静态变量(字段)', obj._name.value)},onComplete:function(){console.log('Money对象搜索完执行的代码')}})}

HOOK内部类

下图红框的就是内部类

效果图:

function demo7(){var innerClass = Java.use("com.luoge.com.Money$innerClass")// 内部类的对象使用$符号加类名获取innerClass.$init.overload("java.lang.String","int").implementation = function(s,i){console.log('demo7s', s);console.log('demo7i', i);this.$init(s,i);console.log(this.outPrint())}
}

获取全部类和方法

function demo8(){console.log(Java.enumerateLoadedClassesSync().join('\n'))
}

获取指定类的普通方法

function demo8(){
//    console.log(Java.enumerateLoadedClassesSync().join('\n'))var utils = Java.use("com.luoge.com.Utils")var methods = utils.class.getDeclaredMethods()for(var i = 0; i < methods.length; i++){console.log(methods[i].getName());}
}

获取指定类的构造方法

function demo8(){
//    console.log(Java.enumerateLoadedClassesSync().join('\n'))console.log('普通方法')var utils = Java.use("com.luoge.com.Utils")var methods = utils.class.getDeclaredMethods()for(var i = 0; i < methods.length; i++){console.log(methods[i].getName());}console.log('构造方法')var money = Java.use("com.luoge.com.Money")methods = money.class.getDeclaredConstructors()for(var i = 0; i < methods.length; i++){console.log(methods[i].toString());console.log(methods[i].getName());}}

获取指定类的字段

获取指定类的内部类

function demo8(){
//    console.log(Java.enumerateLoadedClassesSync().join('\n'))console.log('普通方法\n')var utils = Java.use("com.luoge.com.Utils")var methods = utils.class.getDeclaredMethods()for(var i = 0; i < methods.length; i++){console.log(methods[i].getName());}console.log('构造方法\n')var money = Java.use("com.luoge.com.Money")methods = money.class.getDeclaredConstructors()for(var i = 0; i < methods.length; i++){console.log(methods[i].toString());console.log(methods[i].getName());}console.log('字段\n')var field = money.class.getDeclaredFields()for(var i = 0; i < field.length; i++){console.log(field[i].toString())console.log(field[i].getName())}console.log('内部类\n')var c = money.class.getDeclaredClasses()for(var i = 0; i < c.length; i++){console.log(c[i].toString())console.log(c[i].getName())}}

安装 @types/frida-gum 插件,可以自动补齐Frida代码


img

相关文章:

  • 【Python】数据可视化之分布图
  • 在C#中实现WebSocket的单聊和分频道聊天
  • 域 缺省参数 函数重载 引用
  • 【Golang】Go语言中如何面向对象?
  • 【研赛A题成品论文】24华为杯数学建模研赛A题成品论文+可运行代码丨免费分享
  • GO Serial 学习与使用
  • 大模型微调4:Alpaca模型微调、Adalora、Qlora
  • mysql学习教程,从入门到精通,SQL LIKE 运算符(28)
  • C++教程(三):c++常用的配置文件类型
  • 基于nodejs+vue的宠物医院管理系统
  • jupyter报错IProgress not found. Please update jupyter and ipywidgets
  • 基于Spring框架的分层解耦详解
  • 状态模式原理剖析
  • HTML基础用法介绍二
  • 计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-23
  • 【RocksDB】TransactionDB源码分析
  • const let
  • HashMap ConcurrentHashMap
  • jQuery(一)
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • React系列之 Redux 架构模式
  • Sass 快速入门教程
  • 初识 beanstalkd
  • 少走弯路,给Java 1~5 年程序员的建议
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 为什么要用IPython/Jupyter?
  • raise 与 raise ... from 的区别
  • 第二十章:异步和文件I/O.(二十三)
  • 如何用纯 CSS 创作一个货车 loader
  • #pragma once
  • #Ubuntu(修改root信息)
  • (¥1011)-(一千零一拾一元整)输出
  • (70min)字节暑假实习二面(已挂)
  • (二)测试工具
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (四)Linux Shell编程——输入输出重定向
  • (转载)(官方)UE4--图像编程----着色器开发
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ./和../以及/和~之间的区别
  • .NET 8.0 中有哪些新的变化?
  • .NET CLR Hosting 简介
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET 药厂业务系统 CPU爆高分析
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET连接数据库方式
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET序列化 serializable,反序列化
  • @NotNull、@NotEmpty 和 @NotBlank 区别
  • [ SNOI 2013 ] Quare
  • [Android]常见的数据传递方式
  • [BZOJ1060][ZJOI2007]时态同步 树形dp