某电商App 返回数据加密解密分析(四)

一、目标

最近在抓包某电商App的时候发现一个加密数据,它在做通讯地址请求的时候,请求数据做了加密。返回数据中的地址信息也是密文。

main.png

今天我们的目标就是这个数据的加密解密。

App版本: v10.3.0

二、步骤

分析一下

1、数据的结尾是"==",说明是Base64编码,那么我们可以尝试去Hook Base64相关函数,然后打印堆栈。

2、返回数据格式是 json,那么我们可以尝试去Hook json相关的解析函数。

3、还一个方法就是尝试去搜索 CityNameCountryNameWhere 这几个关键字符串了。

先搜字符串吧

搜这个最长的 "Where"

find.png

发现了加密的函数 encrypt3DESECB ,没有搜到解密的函数。不过加密和解密大概率是在同一个类文件里面。

utils.png

顺着线索,我们找到了这里。

啥也别说了,Hook之。

上Frida

1var utilsCls = Java.use('com.xx.lib.productdetail.core.utils.PDUtils'); 2utilsCls.encrypt.overload('java.lang.String', 'boolean', 'java.lang.String').implementation = function(a,b,c){ 3 var result = this.encrypt(a,b,c); 4 console.log(">>> encrypt a=" + a + ",b=" + b + ",c=" + c); 5 console.log("rc=" + result); 6 return result; 7} 8 9utilsCls.decrypt.overload('java.lang.String', 'boolean', 'java.lang.String').implementation = function(a,b,c){ 10 var result = this.decrypt(a,b,c); 11 console.log(">>> decrypt a=" + a + ",b=" + b + ",c=" + c); 12 console.log("rc=" + result); 13 return result; 14 15}

跑一下,这次用的是Attach模式,有可能会提示包名找不到,我试了下使用App的中文名,居然可以Attach上,很神奇。

TIP: 记得参考之前的文章 http://91fans.com.cn/post/ldqsignone/ 把frida端口号改改

我们点一下"地址管理", 遗憾的是,木有输出。 看来找到不对呀。

再来一次

这下扩大点范围,搜索 where

findex.png

结果不是很多 200来项,细细看来, 这个大兄弟最为可疑。

1、类名AddressSelectView,看上去像是给地址页赋值。

2、函数setWhere,看上去像是给地址变量赋值。

点进去看看吧

optString = optBoolean ? DesCbcCrypto.decrypt(optString, generateKey, (byte[]) null) : DesCommonUtils.decryptThreeDESECB(optString, generateKey);

又找到了两个解密函数,先把他俩都Hook一下。

1 2var StrCls = Java.use('java.lang.String'); 3 4var desCbcCls = Java.use('com.xx.xxsdk.security.DesCbcCrypto'); 5desCbcCls.encrypt.overload('java.lang.String','java.lang.String','[B','java.lang.String').implementation = function(a,b,c,d){ 6 var result = this.encrypt(a,b,c); 7 8 console.log("### encrypt 原文=" + a + ",密钥=" + b + ",d=" + d); 9 console.log("rc=" + bytesToBase64(result)); 10 return result; 11} 12 13desCbcCls.decrypt.overload('java.lang.String','java.lang.String','[B').implementation = function(a,b,c){ 14 var result = this.decrypt(a,b,c); 15 console.log("### decrypt 密文=" + a + ",密钥=" + b); 16 console.log("rc=" + StrCls.$new(result)); 17 return result; 18} 19 20 21var desCommonCls = Java.use('com.xxngxxng.common.entity.DesCommonUtils'); 22desCommonCls.encryptThreeDESECB.implementation = function(a,b){ 23 var result = this.encryptThreeDESECB(a,b); 24 25 console.log("### encryptThreeDESECB a=" + a + ",b=" + b ) ; 26 console.log("rc=" + result); 27 return result; 28} 29 30desCommonCls.decryptThreeDESECB.implementation = function(a,b){ 31 var result = this.decryptThreeDESECB(a,b); 32 33 console.log("### decryptThreeDESECB a=" + a + ",b=" + b ) ; 34 console.log("rc=" + result); 35 return result; 36} 37

好了,这次双手合十,再跑一下。

rc.png

没毛病,收工。

三、总结

字符串搜索可以适当的扩大范围。

Base64算法太容易实现了,所以Hook标准的Base64算法可能不好使。这时候可以尝试在代码里面搜一下 Base64 这个字符串,运气好的话可以把App里面自己实现的Base64算法找出来。

通常App经过好几轮的版本迭代,加解密算法说不定也升级了好几轮,所以不要钻牛角尖,你第一眼看到的算法也许是老算法,不要气馁,还可以继续寻觅。

ffshow.jpeg 黑夜从来不会亏待晚睡的人,它会赐予你黑眼圈,和即将猝死的身体。

TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。

关注微信公众号: 奋飞安全,最新技术干货实时推送

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang