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

2024-06-10 08:20
文章标签 经典 案例 逆向 安卓 xx

本文主要是介绍安卓逆向经典案例——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);
}

这篇关于安卓逆向经典案例——XX牛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二:

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce