【逆向-快速定位关键代码】通过hook常用函数HashMap方法


一生要走多远的路程
经过多少年 才能走到终点
梦想需要多久的时间
多少血和泪 才能慢慢实现
天地间任我展翅高飞
谁说那是天真的预言
                     🎵 Beyond《光辉岁月》


随着移动应用程序的普及,对于安全和隐私的关注也越来越高。安卓应用逆向工程是一种重要的技术手段,可以帮助安全研究人员分析应用程序的内部工作原理,发现潜在的漏洞和安全问题。在本文中,我们将介绍如何利用Frida这一强大的工具,在安卓应用程序中实现全局Hook,定位关键信息。

准备工作:

首先,我们需要在设备上安装Frida工具,并确保设备已经Root或者通过其他方式具有足够的权限。然后,我们需要了解目标应用程序的结构和功能,以便于确定我们需要Hook的关键函数。

全局Hook实现:

我们使用Frida提供的JavaScript API,在目标应用程序中Hook java.util.HashMap 的 put 方法。这个方法通常用于将键值对存储到HashMap中。我们编写以下JavaScript代码:

    var hashMap = Java.use("java.util.HashMap");hashMap.put.implementation = function (a, b) {console.log("a:", a, "b:", b);return this.put(a, b);}

上述代码首先获取了java.util.HashMap类,并重写了其put方法。在重写的方法中,我们判断如果键是"username"或"userPwd",则将其键值打印出来。这样,我们就可以实现对关键信息的全局Hook,并在运行时捕获到相关的信息。
我们可以看到打印的日志信息

a: sec_code b: 52499b02cd1dd89d6bcbe7c07c511928
a: reversegeo b: true
a: isOffset b: true
a: wifiactivescan b: 1
a: httptimeout b: 30000
a: info b: INVALID_USER_SCODE
a: infocode b: 10008
a: status b: 0
a: sec_code_debug b: 240e28e14e8ccf12e19749c96366364c
a: key b: c5e4afee43c52bb00e2df9039d4aa470
a: sec_code b: 52499b02cd1dd89d6bcbe7c07c511928
a: sound_effects_enabled b: 1
a: username b: 123354   #### 关键信息 username
a: userPwd b: gyr       #### 关键信息 userPwd
a: equtype b: ANDROID
a: loginImei b: Android359643090514526
a: timeStamp b: 1710573990834
a: sign b: 71116A6598E8697523CFFFC712714CE3
a: java.util.TreeMap b: com.google.gson.Gson$FutureTypeAdapter@d1f9c66
a: K b: com.google.gson.Gson$FutureTypeAdapter@500dba7
a: K b: com.google.gson.internal.bind.ObjectTypeAdapter@e749854
a: V b: com.google.gson.Gson$FutureTypeAdapter@306a3fd
a: V b: com.google.gson.internal.bind.ObjectTypeAdapter@27918f2
a: java.util.TreeMap b: com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter@558b43
a: java.lang.String b: com.google.gson.Gson$FutureTypeAdapter@dace5c0
a: java.lang.String b: com.google.gson.internal.bind.TypeAdapters$16@31e82f9
a: Encrypt b: NIszaqFPos1vd0pFqKlB42Np5itPxaNH//FDsRnlBfgL4lcVxjXii5B0KQ8UDLVz3xxNeFW43EbQ
ivJC0e8fa7Ww6sLomBbZtZmkT4Vr2ZLV2kIH3jBDC6nuHi5QytxmDLUC1ltP1ZPZG8MC4oYEA1KN
iskClBw8Ap/qbwu2+ONSt6hD6Duh2uVLxa4/0aNREDtWzikUJom+uztHPV+ZHR3pdxc2Nhtia: [ ] http://api.dodovip.com/api/user/login 0x38ed6746 NORMAL null b: java.lang.Object@57bd23e
a: http://api.dodovip.com/api/user/login b: null
a: Transfer-Encoding b: chunked
a:  b: :  0.0  1.0  
a: X-Android-Selected-Protocol b: http/1.1
a: android.animation.AnimatorSet$Node@7163900 b: android.animation.AnimatorSet$Node@25ed44a
a: Server b: Nginx
a: Connection b: keep-alive

经过分析得到登录的关键信息

局部hook,缩小范围

    var hashMap = Java.use("java.util.HashMap");hashMap.put.implementation = function (a, b) {if (a.equals("username")) {// showStacks();console.log("a:", a, "b:", b);}return this.put(a, b);}

if (a.equals("username"))这是一个条件语句,用于判断参数 a 是否等于字符串 “username”。
打印日志信息:

a: username b: 123354
a: username b: 123354
a: username b: 123354
a: username b: 123354

打印调用次hashMap时的堆栈信息

 function showStacks() {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));}var hashMap = Java.use("java.util.HashMap");hashMap.put.implementation = function (a, b) {if (a.equals("username")) {showStacks();console.log("a:", a, "b:", b);}return this.put(a, b);}

showStacks() 函数的作用是获取当前线程的调用堆栈信息并将其打印出来。在软件开发和调试过程中,调用堆栈信息通常用于追踪程序执行过程中的函数调用路径,从而定位和排查代码中的问题。
打印日志信息:

java.lang.Throwableat java.util.HashMap.put(Native Method)at com.dodonew.online.ui.LoginActivity.login(LoginActivity.java:127)at com.dodonew.online.ui.LoginActivity.onClick(LoginActivity.java:103)at android.view.View.performClick(View.java:6597)at android.view.View.performClickInternal(View.java:6574)at android.view.View.access$3100(View.java:778)at android.view.View$PerformClick.run(View.java:25885)at android.os.Handler.handleCallback(Handler.java:873)at android.os.Handler.dispatchMessage(Handler.java:99)at android.os.Looper.loop(Looper.java:193)at android.app.ActivityThread.main(ActivityThread.java:6718)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)a: username b: 123354

通过com.dodonew.online.ui.LoginActivity.login(LoginActivity.java:127)可以定位到hashMap调用的入口函数,从而得到关键信息代码
在这里插入图片描述

结语

通过利用Frida工具实现全局Hook,我们可以在运行时捕获到目标应用程序中关键信息的存储和使用过程。这种方法不仅简单高效,而且具有很高的灵活性,可以适用于各种安卓应用程序的逆向分析和安全审计工作中。然而,需要注意的是,在进行安全研究和逆向工作时,请务必遵守法律法规,并尊重用户隐私和数据保护。

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

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

相关文章

【力扣白嫖日记】1934.确认率

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 1934.确认率 表:Signups 列名类型user_idinttime_stampdatetime User_id是该表的主键。每一行都…

JUC之Java对象内存布局

Java对象 对象在堆中的存储布局 它保存了什么 对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例 对象头有多大?在64位系统中,Mark Word占了8个字节,类型指针占了8个字节,一共是16个字…

鸿蒙开发实现弹幕功能

鸿蒙开发实现弹幕功能如下: 弹幕轮播组件:BannerScroll import type { IDanMuInfoList, IDanMuInfoItem } from ../model/DanMuData //定义组件 Component export default struct BannerScroll {//Watch 用来监视状态数据的变化,包括&#…

git:码云仓库提交以及Spring项目创建

git:码云仓库提交 1 前言 码云访问稳定性优于github,首先准备好码云的账户: 官网下载GIT,打开git bash: 查看当前用户的所有GIT仓库,需要查看全局的配置信息,使用如下命令: git …

Navicat 面试题及答案整理,最新面试题

Navicat 在数据库管理中的主要用途有哪些? Navicat 是一款数据库管理工具,其主要用途包括: 1、多数据库支持: Navicat 支持多种数据库连接,包括 MySQL、Oracle、PostgreSQL、SQLite、SQL Server 等,方便用…

深度强化学习(五)(蒙特卡洛与自举)

深度强化学习(五)(蒙特卡洛与自举) 一.蒙特卡洛与自举 上一节介绍了多步 TD 目标。单步 TD 目标、回报是多步 TD 目标的两种特例。如下图所示, 如果设 m 1 m1 m1, 那么多步 TD 目标变成单步 T D \mathrm{TD} TD 目标。如果设…

compile→错误: 不支持发行版本 17

错误: 不支持发行版本 17 具体错误描述如下: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project big-event: Fatal error compiling: 错误: 不支持发行版本 17 -> [Help 1] [ERROR] …

Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem

Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem 从这一章开始讲负反馈Control系统和小信号建模. 13.2 The Feedback Theorem 首先介绍 Middlebrook’s Feedback Theorem 考虑下面负反馈系统 传输函数 Guo/ui G ( s ) u o u i G ∞ T 1 T G…

Artemis Finance引领Metis流动性质押,并启动积分空投活动

在以太坊可扩展性解决方案中, Optimism、Arbitrum等Layer2链主要面临两个问题:欺诈/有效性证明以及去中心化排序器Sequencers。在实际的发展过程中,Optimism或Arbitrum等Layer2链仍然侧重于在欺诈证明和有效性证明方面进行努力,在…

2024年AI辅助研发趋势

标题 《2024年AI辅助研发趋势》摘要 🚀引言 🌟技术进展:AI在研发中的革命性应用 💡行业应用案例:AI助力解决复杂研发难题 🏭面临的挑战与机遇:化解难题迎接未来 🛠️未来趋势预测&am…

在命令行中输入py有效,输入python无效,输入python会跳转到microsoft store

这里写自定义目录标题 如果你已经尝试过将python添加到系统变量如果你还未将python添加到系统变量没有python安装包且没有配置系统变量 如果你已经尝试过将python添加到系统变量 打开 运行,输入cmd,在命令行中输入 where python。 如果看到了这个 win…

【海贼王的数据航海】排序——概念|直接插入排序|希尔排序

目录 1 -> 排序的概念及其运用 1.1 -> 排序的概念 1.2 -> 常见的排序算法 2 -> 插入排序 2.1 -> 基本思想 2.2 -> 直接插入排序 2.2.1 -> 代码实现 2.3 -> 希尔排序(缩小增量排序) 2.3.1 -> 代码实现 1 -> 排序的概念及其运用 1.1 -&g…

C++ //练习 10.35 使用普通迭代器逆序打印一个vector。

C Primer(第5版) 练习 10.35 练习 10.35 使用普通迭代器逆序打印一个vector。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /********************************************************************…

vue学习笔记26-插槽Slots

插槽Slots 组件接收模板内容&#xff08;html结构&#xff09;&#xff0c;在某些场景中我们想要为子组件传递一些模板片段。让子组件在它们的组件中渲染这些片段 将子组件在父组件引用后&#xff0c;比以往更改一下,将<子组件名/>➡️<子组件名></子组件名&g…

调皮的String及多种玩法(下部)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;&#x1f468;&#x1f3fb;‍&#x1f393;告别&#xff0c;今天 &#x1f4d4;高质量专栏 &#xff1a;☕java趣味之旅 欢迎&#x1f64f;点赞&#x1f5e3;️评论&#x1f4e5;收藏&#x1f493;关注 &#x1f496;衷心的希…

redis 入门01

1.安装与配置 在官网下压缩包并传送给自己的虚拟机或者使用wget直接下载都可以 注意:redis是运行在linux下的基于内存的kv键值对数据库 安装与配置参考 2.经典Hello World 注意设置redis在后台运行,默认是前台进行的 我们配置完成之后首先启动服务器 redis-server 配置文件 这里…

【NTN 卫星通信】 TN和多NTN配合的应用场景

1 场景描述 此场景描述了农村环境&#xff0c;其中MNO (运营商TerrA)仅在城市附近提供本地地面覆盖&#xff0c;而MNO (SatA)提供广泛的NTN覆盖。SatA使用GSO轨道和NGSO轨道上的卫星。SatA与TerrA有漫游协议&#xff0c;允许:   所有TerrA用户的连接&#xff0c;当这些用户不…

浅易理解:卷积神经网络(CNN)

浅易理解卷积神经网络流程 本文的目录&#xff1a; 1 什么卷积神经网络 2 输入层 3 卷积层 4 池化层 5 全连接层 传统的多层神经网络只有 输入层、隐藏层、输出层 卷积神经网络&#xff08;CNN)&#xff1a; 在多层神经网络的基础上&#xff0c;加入了更加有效的特征学习部分…

【开源】SpringBoot框架开发房屋出售出租系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…

EOS 与ESD 区别

ESD: 英文&#xff1a;Electrical Static Discharge&#xff1b; 定义&#xff1a;不同静电电位的两个物体之间的电荷转移&#xff1b;中文释为静电放电。静电是一种客观的自然现象&#xff1b; EOS&#xff1a; 英文&#xff1a;Electrical Over Stress 定义&#xf…