某小说参数加密&会员分析

admin 2024年11月22日15:46:04评论9 views字数 2417阅读8分3秒阅读模式

分析工具

雷电模拟器9.0.77

JADX

Reqable

frida

分析思路

参数加密分析

某小说参数加密&会员分析

某小说参数加密&会员分析

使用Reqable对登陆抓包看请求参数发现有sign值,如何使用Reqable抓包,可以看这篇文章安卓渗透第四弹-Reqable抓包神器安装使用&自动化脚本解密

那么想要对app登陆进行渗透测试肯定是需要sign值的,分析一下sign值是怎么得来的。

jadx反编译app进行代码审计:

快速定位到登陆接口发包函数技巧:直接在jadx搜索该请求的后缀

某小说参数加密&会员分析

类似于这样的,这样就能快速定位到关键函数了

某小说参数加密&会员分析

搜到了有这样一个函数getRequestMethod返回了这个接口,跟进去分析一下

某小说参数加密&会员分析

直接查看一下这个函数的交叉引用,

某小说参数加密&会员分析

就4个地方调用了该函数,挨个看函数

某小说参数加密&会员分析

太棒了,一下子就看到了sign=这么明显的特征,那么d2就是sign了,分析一下d2怎么来的

某小说参数加密&会员分析

调用了d函数,传递的参数也是通过其他函数得来的,但是不重要,直接分析d函数看看传进来的参数是什么就好了。

某小说参数加密&会员分析

第一个参数使用了map,应该是请求参数列表了,第二个参数是key,看到最后的key=和一个sb的数据类型,猜测这个函数是对请求参数最后加一个元素key=????后再调用e函数对请求参数进行加密,这里的操作可以称为对原始字符串加一个盐值,盐值是特殊的,这样别人想直接对请求参数进行加密爆破的话就永远拿不到一样的值。

使用frida去hook这个函数输出一下参数拿到key

 let b = Java.use("com...b");        b["d"].implementation = function (params, appkey) {            console.log("*********************com...b************************");            console.log(`b.d is called: params=${params}, appkey=${appkey}`);            let result = this["d"](params, appkey);            console.log(`b.d result=${result}`);            return result;        };

某小说参数加密&会员分析

太棒了,直接拿到key和加密的对象。

再分析e函数看看是怎么对参数就行加密的

某小说参数加密&会员分析

某小说参数加密&会员分析其实就是md5加密,对请求参数列表的字节形式md5加密,加密完成之后在进行字符的替换,相等于是有了两层加密。

使用frida去hook e这个函数获取到返回值,

let b1 = Java.use("com...b");        b1["e"].implementation = function (buffer) {            console.log(`b.e is called: buffer=${buffer}`);            let result = this["e"](buffer);            console.log(`b.e result=${result}`);            return result;        };

某小说参数加密&会员分析

拿到加密的结果,与抓包结果对比发现是一致的。

使用Java模拟的话就把这两个函数给扣下来就行了

  public static String d(TreeMap<String, String> params, String appkey) {        StringBuilder sb = new StringBuilder();        for (Map.Entry<String, String> entry : params.entrySet()) {            sb.append(entry.getKey());            sb.append("=");            sb.append(entry.getValue());            sb.append("&");        }        sb.append("key=");        sb.append(appkey);        return e(sb.toString().getBytes()).toUpperCase();    }    public static String e(byte[] buffer) {        char[] cArr = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};        try {            MessageDigest messageDigest = MessageDigest.getInstance("MD5");            messageDigest.update(buffer);            byte[] digest = messageDigest.digest();            char[] cArr2 = new char[digest.length * 2];            int i2 = 0;            for (byte b2 : digest) {                int i3 = i2 + 1;                cArr2[i2] = cArr[(b2 >>> 4) & 15];                i2 = i3 + 1;                cArr2[i3] = cArr[b2 & 15];            }            return new String(cArr2);        } catch (Exception unused) {            return "unknown";        }    }

创建一个TreeMap 和key:mibook_123456 传递给d函数就好了。

会员分析

尝试搜索关键代码:isVip

某小说参数加密&会员分析

当我搜索完毕之后,鼠标不听使唤使劲往这个函数上方,无奈我只能选这个函数了进行分析了(狗运)

某小说参数加密&会员分析

直接使用frida使得这个函数返回1

let MartianRPAccount = Java.use("com....MartianRPAccount");        MartianRPAccount["getIsVip"].implementation = function () {            console.log(`MartianRPAccount.getIsVip is called`);            let result = this["getIsVip"]();            result = 1;            console.log(`MartianRPAccount.getIsVip result=${result}`);            return result;        };

某小说参数加密&会员分析

拿到会员了,嘻嘻

 

原文始发于微信公众号(rainy的安全小屋):某小说参数加密&会员分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月22日15:46:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某小说参数加密&会员分析https://cn-sec.com/archives/3424367.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息