Android逆向 某旅游 解密oauth_signature字段 so层 算法 HmacSHA1 enc.Base64

本文主要是介绍Android逆向 某旅游 解密oauth_signature字段 so层 算法 HmacSHA1 enc.Base64,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

记一次学习过程,需求解密"sign"字段 得到其算法

  • com.mfw.roadbook 马蜂窝旅游

  • so层 算法

    • HmacSHA1 enc.Base64

1. 需解密对象

  1. “oauth_signature” 字段

在这里插入图片描述

2. 定位到 java 关键函数

  1. 搜索关键字 “oauth_signature”
    public static final String HTTP_BASE_PARAM_OAUTH_SIGNATURE = "oauth_signature";
  1. HTTP_BASE_PARAM_OAUTH_SIGNATURE 查找用例

  2. 一步一步查找到 oauthSignTxt 这个方法

在这里插入图片描述

3. firda hook java

  1. hook 关键函数
  2. 主动调用

在这里插入图片描述

4. firda hook so

  1. Exports Java_com_mfw_tnative_AuthorizeHelper_xAuthencode 000090E8
  2. 进去 F5 一目了然 ,没有被处理过的c++代码 ,一点一点的拆分就行

在这里插入图片描述
在这里插入图片描述

5. hook.js代码

console.log("--------------------");
console.log("com.mfw.roadbook"); // 马蜂窝旅游
console.log("start...");
// hook_java();
hook_so();
console.log("end...");
console.log("--------------------");function showStacks() {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
}function hook_java() {Java.perform(function () {var AuthorizeHelper = Java.use("com.mfw.tnative.AuthorizeHelper");AuthorizeHelper.xAuthencode.implementation = function (context, source, key, packageName, isLogin) {//showStacks();console.log("xAuthencode context: ", context);console.log("xAuthencode source: ", source);console.log("xAuthencode key: ", key);console.log("xAuthencode packageName: ", packageName);console.log("xAuthencode isLogin: ", isLogin);var retval = this.xAuthencode(context, source, key, packageName, isLogin);console.log("xAuthencode retval: ", retval);return retval;}});
}function call_java() {Java.perform(function () {var currentApplication = Java.use("android.app.ActivityThread").currentApplication();var context = currentApplication.getApplicationContext();var AuthorizeHelper = Java.use("com.mfw.tnative.AuthorizeHelper");var xAuthencode = AuthorizeHelper.$new("com.mfw.roadbook").xAuthencode(context,'PUT&https%3A%2F%2Fmapi.mafengwo.cn%2Frest%2Fapp%2Fuser%2Flogin%2F&after_style%3Ddefault%26app_code%3Dcom.mfw.roadbook%26app_ver%3D8.1.6%26app_version_code%3D535%26brand%3DXiaomi%26channel_id%3DGROWTH-WAP-LC-3%26device_id%3DF4%253AF5%253ADB%253A23%253A63%253A06%26device_type%3Dandroid%26hardware_model%3DMI%25205X%26mfwsdk_ver%3D20140507%26o_lat%3D30.458106%26o_lng%3D114.876373%26oauth_consumer_key%3D5%26oauth_nonce%3Dc0847f2b-b284-4bcf-b823-8d19be79b6cb%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1621266286%26oauth_version%3D1.0%26open_udid%3DF4%253AF5%253ADB%253A23%253A63%253A06%26put_style%3Ddefault%26screen_height%3D1920%26screen_scale%3D3.0%26screen_width%3D1080%26sys_ver%3D8.1.0%26time_offset%3D480%26x_auth_mode%3Dclient_auth%26x_auth_password%3D333333%26x_auth_username%3D13333333333','','com.mfw.roadbook',true);// E7yazoGTHlhhoEUcRY9ukGK/nJ8=console.log("call_java xAuthencode: ", xAuthencode);});
}function hook_so() {// mfw::Sha1::CHmac::SetKeyvar SetKey = Module.findExportByName("libmfw.so", '_ZN3mfw4Sha15CHmac6SetKeyEPKhj');console.log("SetKey Addr : ", SetKey);Interceptor.attach(SetKey, {onEnter: function (args) {// console.log("SetKey onEnter args[0]: ", (args[0])); // 指针 上下文console.log("SetKey onEnter args[1]: ", ptr(args[1]).readCString()); // 指针 密钥console.log("SetKey onEnter args[2]: ", ptr(args[2]).toInt32());     // 指针 长度// console.log("SetKey onEnter args[0]: \n", hexdump(args[0]));// console.log("SetKey onEnter args[0]: ", ptr(args[0]).readCString());},onLeave: function (retval) {// console.log("SetKey onLeave retval: ", (retval)); // 无返回值// console.log("SetKey onEnter retval: ", ptr(retval).toInt32()); // 指针}});// mfw::Sha1::CHmac::Updatevar Update = Module.findExportByName("libmfw.so", '_ZN3mfw4Sha15CHmac6UpdateEPKhj');console.log("Update Addr : ", Update);Interceptor.attach(Update, {onEnter: function (args) {// console.log("Update onEnter args[0]: ", (args[0])); // 指针 上下文console.log("Update onEnter args[1]: ", ptr(args[1]).readCString()); // 指针 参数console.log("Update onEnter args[2]: ", ptr(args[2]).toInt32());     // 指针 长度// console.log("SetKey onEnter args[0]: \n", hexdump(args[0]));// console.log("SetKey onEnter args[0]: ", ptr(args[0]).readCString());},onLeave: function (retval) {// console.log("Update onLeave retval: ", (retval)); // 无返回值// console.log("Update onEnter retval: ", ptr(retval).toInt32()); // 指针}});// mfw::Sha1::CHmac::Finalvar Final = Module.findExportByName("libmfw.so", '_ZN3mfw4Sha15CHmac5FinalEPhj');console.log("Final Addr : ", Final);Interceptor.attach(Final, {onEnter: function (args) {// console.log("Final onEnter args[0]: ", (args[0]));                // 指针 上下文// console.log("Final onEnter args[1]: ", ptr(args[1]));             // 指针 这是个返回值console.log("Final onEnter args[2]: ", ptr(args[2]).toInt32());      // 指针 长度// console.log("SetKey onEnter args[0]: \n", hexdump(args[0]));this.args1 = args[1];},onLeave: function (retval) {// console.log("Final onLeave retval: ", (retval));                  // 无返回值// console.log("Final onEnter retval: ", ptr(retval).toInt32());     // 指针console.log("Final onLeave this.arg1: \n", hexdump(this.args1, { length: 20 }));}});
}

这篇关于Android逆向 某旅游 解密oauth_signature字段 so层 算法 HmacSHA1 enc.Base64的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/495662

相关文章

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级