安卓逆向经典案例——XX牛

安卓逆向经典案例——XX牛

按钮绑定方式
1.抓包
2.查看界面元素,找到控件id

通过抓包,发现点击登录后,才会出现Encrpt加密信息,所以我们通过控件找到对应id:btn_login

在这里插入图片描述

在这里插入图片描述

按钮绑定方法——第四种

在这里插入图片描述

 public class LoginActivity extends BasicActivity implements View.OnClickListener {private Type DEFAULT_TYPE;private EditText etMobile;private EditText etPwd;private long firstime = 0;private Map<String, String> para;private JsonRequest request;
case C0828R.C0830id.btn_login /* 2131558593 */:String mobile = ((Object) this.etMobile.getText()) + "".trim();String pwd = ((Object) this.etPwd.getText()) + "".trim();Utils.hideSoftInput(this, this.etPwd);if (checkInput(mobile, pwd)) {login(mobile, pwd);return;}return;

如果获取的id是btn_login,会执行获取账号和密码。

这里@override是注解,当编译时,用于检查父类中有没有对应方法

比如这里的View.onClickListener接口中有名为onClick的方法。如果没有编译器会报错

法2:手动搜索字符串定位关键代码

在这里插入图片描述

POST /api/user/login HTTP/1.1
Content-Type: application/json; charset=utf-8
User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Mi 10 Build/TKQ1.221114.001)
Host: api.dodovip.com
Connection: Keep-Alive
Accept-Encoding: gzip
Content-Length: 228{"Encrypt":"NIszaqFPos1vd0pFqKlB42Np5itPxaNH\/\/FDsRnlBfgL4lcVxjXii\/UNcdXYMk0EHdbdwRDGADMQ\nFdnMX5Qq4ZVksebFB9u5C7wf1Tg0iB6TtO6yIRklzyaNV1Emb4ZfamTp8A17jqtT53LRz7g8cWbm\ntmuSM4kXcPN8tgfiwijQvx+XNn\/8BMVPVolqQvWQlI7hPd2OtWw=\n"}
搜索链接——/api/user/login

使用搜索的方法有很大的局限性。

因为关键函数(加密方法)可以被替换分散在多个类文件中,所以必须要在系统函数层面进行逆向,比如在这里MessageDigest.getInstance是系统函数。

  • 使用系统函数,函数名不会改变
MessageDigest md5 = MessageDigest.getInstance("MD5")
//Class<?> a = Class.forName(dd("..."))这样很难找到
//

在这里插入图片描述

搜索技巧,把链接拆分,因为链接可能是被拼接在一起的,所以拆分才能检索到关键代码

在这里插入图片描述

优先找到和包名相关的代码。

在这里插入图片描述

在这里插入图片描述

发现两个可能的方法,通过动态调试和hook的方法,分析
// 使用Frida的Java.perform函数来确保我们的代码在Java虚拟机的上下文中执行。
Java.perform(function (){// 使用Java.use来获取Java类的引用。这里我们获取的是com.dodonew.online.http.JsonRequest类的引用。var jsonRequest = Java.use("com.dodonew.online.http.JsonRequest");// 打印获取到的类引用到控制台,用于调试。console.log("jsonRequest:", jsonRequest);// 修改JsonRequest类的paraMap方法的实现。这里我们使用了Frida的implementation属性来实现方法的挂钩。jsonRequest.paraMap.implementation = function(a){// 当paraMap方法被调用时,打印传递给它的参数a。console.log("params1", a);// 调用原始的paraMap方法。这里的this指的是JsonRequest类的当前实例。this.paraMap(a);}
})

在这里插入图片描述

使用paraMap方法无法hook到账号和密码,尝试另一个方法

Java.perform(function (){var jsonRequest =Java.use("com.dodonew.online.http.JsonRequest");//对特定类名发起hookconsole.log("jsonRequest:",jsonRequest);//打印类的信息jsonRequest.paraMap.implementation = function(a){console.log("params1",a);//将类中到的params用a替换this.paraMap(a);//}jsonRequest.addRequestMap.implementation = function(a,b){console.log("params1",a,b);//将类中到的params用a替换this.addRequestMap(a,b);//}})
//frida -UF -l test.js
Error: addRequestMap(): has more than one overload, use .overload(<signature>) to choose from:.overload('java.util.Map').overload('java.util.Map', 'int').overload('java.util.Map', 'boolean')

有多个重载函数选择.overload('java.util.Map', 'int')

    jsonRequest.addRequestMap.overload('java.util.Map', 'int').implementation = function(a,b){console.log("params1",a,b);//将类中到的params用a替换this.addRequestMap(a,b);//}

在这里插入图片描述

这样成功hook到函数。可以使用java对象Hashmap的toString方法(以键值对的形式被hashmap重载输出)

import java.util.HashMap;public class Main {public static void main(String[] args){HashMap<Object,Object> objectObjectHashMap = new HashMap<>();objectObjectHashMap.put("username","arii");objectObjectHashMap.put("password","123456");System.out.println(objectObjectHashMap.toString());}
}
 jsonRequest.addRequestMap.overload('java.util.Map', 'int').implementation = function(a,b){console.log("addRequestMap params",a,b);//将类中到的params用a替换var bb = Java.cast(a,Java.use("java.util.HashMap"));//类型转换console.log("addRequestMap params",bb.toString());// console.log("addRequestMap params",a.get("username"));//这里hook的是java的类型,所以可以调用java中的toString方法this.addRequestMap(a,b);//}

在这里插入图片描述

配置webstorm代码提示

npm i @types/frida-gum
hook addRequestMap方法

通过hookRequestUtil.paraMap方法去分析返回的值。这里虽然能看到IV和KEY的值,但是防止热加载,热修复(在程序编译运行时,会修改参数),要用hook

在这里插入图片描述

结果
[Mi 10::XX在线 ]-> RequestUtilparams1 {"equtype":"ANDROID","loginImei":"Androidnull","sign":"45D0209BE26E599E4E6FF49A2B3E84A9","timeStamp":"1717570679351","userPw
d":"ffg","username":"225"} 65102933 32028092

hook前后对比:
在这里插入图片描述

DES 算法是分组密码算法,这意味着它将明文数据分割成固定长度的块(通常为 64 位,对应 8 个字节),并对每个块进行独立的加密操作。

关键代码快速定位

var btn_login_id = Java.use("com.dodonew.online.R$id").btn_login.value;
console.log("btn_login_id", btn_login_id);
var appCompatActivity = Java.use("android.support.v7.app.AppCompatActivity");
appCompatActivity.findViewById.implementation = function (a) {if(a == btn_login_id){showStacks();console.log("appCompatActivity.findViewById: ", a);}return this.findViewById(a);
}

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

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

相关文章

c++【基础】求花坛的面积

限制 时间限制 : 1 秒 内存限制 : 128 MB 题目 A校区有一个圆形花坛&#xff0c;量得花坛周围的篱笆长是x米&#xff0c;请问该花坛的面积是多少平方米&#xff1f;&#xff08;假设π3.14&#xff09; 输入 一个小数x 输出 花坛的面积&#xff08;结果保留2位小数&…

开机自启动脚本配置

#!/bin/bash# 定义要检查的IP地址 IP_ADDRESSES("127.0.0.1")# 检查是否存在任意一个IP地址 check_ips() {HOST_IPS$(hostname -I)for IP in "${IP_ADDRESSES[]}"; doif [[ $HOST_IPS ~ $IP ]]; thenreturn 0fidonereturn 1 }# 检查IP地址并在必要时重新启…

python tushare股票量化数据处理:学习中

1、安装python和tushare及相关库 matplotlib pyplot pandas pandas_datareader >>> import matplotlib.pyplot as plt >>> import pandas as pd >>> import datetime as dt >>> import pandas_datareader.data as web 失败的尝试yf…

什么是Socket?

什么是Socket&#xff1f; Socket&#xff08;套接字&#xff09;是网络通信的基本单位&#xff0c;它允许在不同计算机之间进行数据交换。Socket在网络编程中起着至关重要的作用&#xff0c;它为应用程序提供了一个机制&#xff0c;通过网络发送和接收数据。简单地说&#xf…

使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端

要使用NetAssist网络调试助手在同一台计算机上配置一个实例作为服务器&#xff08;server&#xff09;和另一个实例作为客户端&#xff08;client&#xff09;&#xff0c;可以按照以下步骤进行操作&#xff1a; 前提条件 确保已经安装NetAssist网络调试助手&#xff0c;并了…

mysql 小例子

mysql 小例子 show databases ; create database company; use company;DROP TABLE IF EXISTS employee;create table employee ( id INT AUTO_INCREMENT, name VARCHAR(50) NOT NULL, PRIMARY KEY(id)) ENGINEInnoDB; DESCRIBE employee ;111 CREATE TABLE example (id INT …

如何制定工程战略

本文介绍了领导者如何有效制定工程战略&#xff0c;包括理解战略核心、如何收集信息并制定可行的策略&#xff0c;以及如何利用行业最佳实践和技术债务管理来提升团队效能和产品质量。原文: How to Build Engineering Strategy 如果你了解过目标框架&#xff08;如 OKR&#xf…

数仓建模中的一些问题

​​​在数仓建设的过程中&#xff0c;由于未能完全按照规范操作&#xff0c; 从而导致数据仓库建设比较混乱&#xff0c;常见有以下问题&#xff1a; 数仓常见问题 ● 数仓分层不清晰&#xff1a;数仓的分层没有明确的逻辑&#xff0c;难以管理和维护。 ● 数据域划分不明确…

yield 和 生成器(generator)

Python3 迭代器 https://www.runoob.com/python3/python3-iterator-generator.html #!coding:utf8#author:yqq #date:2020/1/14 0014 15:21 #description:class MyNumber:def __init__(self, init_number 1 , bound_number 99999):self.n init_numberself.bound bound_nu…

Duck Bro的第512天创作纪念日

Tips&#xff1a;发布的文章将会展示至 里程碑专区 &#xff0c;也可以在 专区 内查看其他创作者的纪念日文章 我的创作纪念日第512天 文章目录 我的创作纪念日第512天一、与CSDN平台的相遇1. 为什么在CSDN这个平台进行创作&#xff1f;2. 创作这些文章是为了赚钱吗&#xff1f…

详细说说机器学习在安防领域的应用

机器学习在安防领域的应用日益广泛&#xff0c;其强大的数据分析和模式识别能力为安全监控、预警和防范带来了革命性的变化。以下是机器学习在安防领域的几个主要应用&#xff1a; 异常检测&#xff1a; 通过学习监控画面中的正常运行状态&#xff0c;智能安防系统可以在遇到异…

算法金 | AI 基石,无处不在的朴素贝叶斯算法

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 历史上&#xff0c;许多杰出人才在他们有生之年默默无闻&#xff0c; 却在逝世后被人们广泛追忆和崇拜。 18世纪的数学家托马斯贝叶斯…

用函数指针求a和b中的大者

指针变量也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数入口地址就称为函数的指针。可以用一个指针变量指向函数&#xff0c;然后通过该指针变量调用此函数。 先按一般方法编写程序&#xff1a; 可以用一个指针变量指向max函数&#xff0c;然后通过该指…

【python/pytorch】已解决ModuleNotFoundError: No module named ‘torch‘

【PyTorch】成功解决ModuleNotFoundError: No module named torch 一、引言 在深度学习领域&#xff0c;PyTorch作为一款强大的开源机器学习库&#xff0c;受到了众多研究者和开发者的青睐。然而&#xff0c;在安装和使用PyTorch的过程中&#xff0c;有时会遇到一些问题和挑战…

NLP--词袋模型

词袋模型如同所有单词打散放到一个袋子中&#xff0c;因此这种模型无法估计语义和语序问题&#xff0c;每个单词都是独立的。 1.文本分词&#xff1a;调用jieba库&#xff0c;使用精确模式对每个句子进行分词&#xff0c;并存入列表。 2.去除停用词&#xff1a;遍历停用词文件…

地图元素。

常见的地图元素&#xff1a; 道路&#xff08;Road&#xff09;&#xff1a; 主要道路&#xff08;如高速公路、主干道&#xff09;次要道路&#xff08;如街道、小巷&#xff09;辅助道路&#xff08;如人行道、自行车道&#xff09;车道&#xff08;Lane&#xff09;&#x…

爬山算法介绍(极简)

一、引言 爬山算法&#xff0c;作为一种启发式搜索算法&#xff0c;是人工智能和运筹学领域中的经典算法之一。它通过模拟人类爬山的直观过程&#xff0c;逐步向评价函数值更优的方向“攀爬”&#xff0c;以期找到局部最优解。尽管这种算法有其局限性&#xff0c;特别是容易陷入…

排序-快排算法对数组进行排序

目录 一、问题描述 二、解题思路 1.初始化 2.将右侧小于基准元素移到左边 3.将左侧大于基准元素移到右边 4.重复执行上面的操作 5.对分好的左、右分区再次执行分区操作 6.最终排序结果 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 快排算法实现数组排序&am…

内存EDAC的内核支持情况

Linux内核对EDAC&#xff08;Error Detection and Correction&#xff09;支持的发展体现了对硬件错误管理和系统可靠性的持续重视。 EDAC作为Linux内核的一部分&#xff0c;其早期集成主要集中在基本的内存错误检测和纠正功能上&#xff0c;为ECC内存提供了基础支持。随着内核…

算法 | 拯救小a之如何获取多行数据

小a生活在一个只有26个小写字母的文本里&#xff0c;我们知道在26个小写字母里&#xff0c;a是字典序最小的&#xff0c;所以小a十分的自卑&#xff0c;今天小a实在是受不了了&#xff0c;他想和伙伴们一起逃出这个文本&#xff0c;在逃出之前&#xff0c;他想问问你&#xff0…