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

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D