安卓逆向经典案例——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

相关文章

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 中的 equals 和 hashCode 方法关系与正确重写实践案例

《Java中的equals和hashCode方法关系与正确重写实践案例》在Java中,equals和hashCode方法是Object类的核心方法,广泛用于对象比较和哈希集合(如HashMa... 目录一、背景与需求分析1.1 equals 和 hashCode 的背景1.2 需求分析1.3 技术挑战1.4

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时