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

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

C#中的Drawing 类案例详解

《C#中的Drawing类案例详解》文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特... 目录一、Drawing 是什么?二、典型用法三、案例:画一个“带阴影的圆角矩形按钮”四、WinForm

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更