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开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加