服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

日期: 来源:Python爬虫与数据挖掘收集编辑:Python进阶者
点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

春风十里扬州路,卷上珠帘总不如。

大家好,我是码农星期八!本教程只用于学习探讨,不允许任何人使用技术进行违法操作,阅读教程即表示同意!

前言

上文:上一篇文章。

上文浅浅的使用了一下frida和简单的hook了一下xx牛的执行流程。

本次就接着上次继续搞,看看如何实现自动登录。

流程分析

login

  1. login->requestNetwork->实例化JsonRequest->调用JsonRequest对象的addRequestMap

    如果只看第一层的话,大概是这个流程。

最后调用的是addRequestMap,点进去看看addRequestMap都干了什么。

addRequestMap

addRequestMap就比较简单了,不过是RequestUtil.paraMap的返回值当作了 RequestUtil.encodeDesMap的参数。

甚至你还可以发现,竟然出现了Encrypt,不就是请求里面的关键字吗,wc。

RequestUtil.paraMap

查看RequestUtil.paraMap的详细内容,可以发现调用了md5,并且最后返回值都字母全部大写。

md5

这就是一个普通的md5。

RequestUtil.encodeDesMap

分析完了RequestUtil.paraMap继续来看RequestUtil.encodeDesMap,它需要三个参数。

这个this.desKeythis.desIV是啥呢?

经过寻找

this.desKey = 65102933
this.desIV = 32028092

继续看逻辑,看一下encodeDesMap的详情,里面又实例化了DesSecurity类,并且调用了encrypt64方法。

DesSecurity

这里是一个DES/CBC算法。

他的逻辑大概是把传入的desKey通过md5哈希一下,然后当作DES的key。

传进来的desIV当作iv向量,最后加密的结果进行base64处理一下。

frida验证流程

经过静态分析,理论上大概是上面的流程,但是。,到底对不对呢?来hook一下不就知道了!!!

代码

Java.perform(function () {
    let jsonRequest = Java.use("com.dodonew.online.http.JsonRequest");
    jsonRequest.addRequestMap.overload('java.util.Map', 'int').implementation = function (addMap, a) {
        console.log("==== jsonRequest.addRequestMap 被调用了");
        console.log("addMap:", addMap);
        console.log("a:", a);
        return this.addRequestMap(addMap, a);
    }

    let requestUtil = Java.use("com.dodonew.online.http.RequestUtil");
    requestUtil.paraMap.overload('java.util.Map', 'java.lang.String', 'java.lang.String').implementation = function (addMap, append, sign) {
        console.log("==== requestUtil.paraMap 被调用了");
        console.log("addMap:", addMap);
        console.log("append:", append);
        console.log("sign:", sign);
        return this.paraMap(addMap, append, sign);
    }

    let utils = Java.use("com.dodonew.online.util.Utils");
    utils.md5.implementation = function (string) {
        console.log("==== utils.md5 被调用了");
        console.log("string:", string);
        return this.md5(string);
    }

    requestUtil.encodeDesMap.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (data, desKey, desIV) {
        console.log("==== requestUtil.encodeDesMap 被调用了");
        console.log("data:", data);
        console.log("desKey:", desKey);
        console.log("desIV:", desIV);
        return this.encodeDesMap(data, desKey, desIV);
    }

})

效果

综上所述,我们分析的是没问题的,当然,如果你发现没有hook到,那就废了,再次尝试即可。

关于算法复现

本次通过js来完成算法复现,因为js写完之后,基本能被任何语言调用,更通用,本次使用的是CryptoJS库。

获取sign

其实经过研究发现,并不是所有参数都是随机的。

只有那一两个参数是固定的,所以只需要把那几个参数构造好就可以了。

通过观察,在第一次的时候,数据都汇聚到了md5这,所以先hook md5,看一下传入的参数和返回值。

hook md5代码

Java.perform(function () {
 let utils = Java.use("com.dodonew.online.util.Utils");
    utils.md5.implementation = function (string) {
        console.log("==== utils.md5 被调用了");
        console.log("string:", string);
        let ret = this.md5(string);
        console.log("return:",ret);
        return ret;
    }
})

传入的参数和返回值

js代码

function getSign(user, pass, time) {
    var signStr = "equtype=ANDROID&loginImei=Androidnull&timeStamp=" + time + "&userPwd=" + pass + "&username=" + user + "&key=sdlkjsdljf0j2fsjk";
    return CryptoJS.MD5(signStr).toString().toUpperCase();
}

获取encrypt

第一层的RequestUtil.paraMap执行完了,当作第二层RequestUtil.encodeDesMap的第一个参数

所以现在hook一下RequestUtil.encodeDesMap看一下参数和返回值

hook代码

js代码

ok,知道了动态变量,那就写一下代码吧。

function getSign(user, pass, time) {
    var signStr = "equtype=ANDROID&loginImei=Androidnull&timeStamp=" + time + "&userPwd=" + pass + "&username=" + user + "&key=sdlkjsdljf0j2fsjk";
    return CryptoJS.MD5(signStr).toString().toUpperCase();
}

function encrypt(user, pass) {
    var time = '1624379089014';
    var sign = getSign(user, pass, time);
    var plainText = '{"equtype":"ANDROID","loginImei":"Androidnull","sign":"' + sign
        + '","timeStamp":"' + time + '","userPwd":"' + pass + '","username":"' + user + '"}';
    var key = CryptoJS.enc.Hex.parse(CryptoJS.MD5("65102933").toString());
    var iv = CryptoJS.enc.Utf8.parse("32028092");
    var result = CryptoJS.DES.encrypt(plainText, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    }).toString();
    return result;
}

完整代码

xxn.js

运行结果

总结

本次带着走了一下静态分析和hook静态分析的代码,很庆幸,是正确的。

当然,也可能不正确,所以就要多hook,多尝试。

算法复现这一块,尽量使用js,因为相对而言更通用。

人低为王,水低为海,加油!

我是码农星期八,如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

越努力,越幸运。我是码农星期八,如果觉得还不错,记得动手点赞一下哈。感谢你的观看。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

------------------- End -------------------

往期精彩文章推荐:

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~

相关阅读

  • 盘点一个Python处理的基础题目

  • 大家好,我是皮皮。一、前言前几天在Python最强王者交流群【Chloe】问了一道Python处理的问题,如下图所示。原始数据如下:origin_lst = [0, 0, 1, 2, 3, 4, 4, 5, 6, 6, 6, 7, 8
  • 盘点一个Python网络爬虫过程中Xpath提取器的问题

  • 点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤问客何为来,采山因买斧。大家好,我是皮皮。一、前言前几天在Python钻
  • 连代码调试都一窍不通,还谈啥会VBA?

  • HI,大家好,我是星光。有句俗话说的好,一段优秀的代码,三分靠编写七分靠调试。今天我就给大家聊一下VBA代码调试的问题:一段代码写完了,运算结果却不对,到底应该如何发现并改正错误?
  • 太爽了!什么都能搜到!10000TB资源!

  • 这里是一路软件,一个简洁 · 高效的公众号 前言: 昨天给大家分享电脑端的WPS无限制ZG邮政版,大家反响不错。肯定也有很多错过阅读的朋友们,大家可以点击黄色字体进行跳
  • 2023中国AIGC市场潜力研究报告

  • “未来几年内,AIGC技术将在多个领域落地,预计到2030年,AIGC的产业规模将突破千亿元。”01研究方向及背景AIGC是AI Generated Content的缩写,指利用人工智能技术生成的内容。它也
  • 守护乡村的“60天” 这个冬天有点“暖”

  • “在这里,我看到公益这颗种子,种进了与我同去的女儿心里。“人心是暖的,捂着捂着就更热了。”“赠人玫瑰,手留余香,公益让人上瘾,身体力行比口头说要去做,更有感染力。”“保安、司

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 盘点一个Python处理的基础题目

  • 大家好,我是皮皮。一、前言前几天在Python最强王者交流群【Chloe】问了一道Python处理的问题,如下图所示。原始数据如下:origin_lst = [0, 0, 1, 2, 3, 4, 4, 5, 6, 6, 6, 7, 8
  • 盘点一个Python网络爬虫过程中Xpath提取器的问题

  • 点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤问客何为来,采山因买斧。大家好,我是皮皮。一、前言前几天在Python钻