# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

幼敏悟过人,读书辄成诵。这篇文章主要讲述# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法相关的知识,希望能为你提供帮助。
大家好,我是码农星期八!本教程只用于学习探讨,不允许任何人使用技术进行违法操作,阅读教程即表示同意!
前言上文:上一篇文章。
上文浅浅的使用了一下frida和简单的hook了一下xx牛的执行流程。
本次就接着上次继续搞,看看如何实现自动登录。
流程分析login

  1. login-> requestNetwork-> 实例化JsonRequest-> 调用JsonRequest对象的addRequestMap
    如果只看第一层的话,大概是这个流程。
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

最后调用的是addRequestMap,点进去看看addRequestMap都干了什么。
addRequestMap
addRequestMap就比较简单了,不过是RequestUtil.paraMap的返回值当作了 RequestUtil.encodeDesMap的参数。
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

甚至你还可以发现,竟然出现了??Encrypt??,不就是请求里面的关键字吗,wc。
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

RequestUtil.paraMap
查看RequestUtil.paraMap的详细内容,可以发现调用了md5,并且最后返回值都字母全部大写。
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

md5
这就是一个普通的md5。
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

RequestUtil.encodeDesMap
分析完了RequestUtil.paraMap继续来看RequestUtil.encodeDesMap,它需要三个参数。
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

这个??this.desKey??和??this.desIV??是啥呢?
经过寻找
this.desKey = 65102933
this.desIV = 32028092

# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

继续看逻辑,看一下encodeDesMap的详情,里面又实例化了??DesSecurity??类,并且调用了??encrypt64??方法。
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

DesSecurity
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

这里是一个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);


)

效果
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

综上所述,我们分析的是没问题的,当然,如果你发现没有hook到,那就废了,再次尝试即可。
关于算法复现本次通过js来完成算法复现,因为js写完之后,基本能被任何语言调用,更通用,本次使用的是CryptoJS库。
获取sign
其实经过研究发现,并不是所有参数都是随机的。
只有那一两个参数是固定的,所以只需要把那几个参数构造好就可以了。
通过观察,在第一次的时候,数据都汇聚到了md5这,所以先hook md5,看一下传入的参数和返回值。
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

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;

)

传入的参数和返回值
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

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代码
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

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??
运行结果
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

总结本次带着走了一下静态分析和hook静态分析的代码,很庆幸,是正确的。
当然,也可能不正确,所以就要多hook,多尝试。
算法复现这一块,尽量使用js,因为相对而言更通用。
人低为王,水低为海,加油!
我是码农星期八,如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。
越努力,越幸运。我是码农星期八,如果觉得还不错,记得动手点赞一下哈。感谢你的观看。
# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法

文章图片

【# yyds干货盘点 # frida辅助分析xx牛登录算法frida辅助分析xx牛登录算法】小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进python学习交流群共同探讨学习。

    推荐阅读