物流信息批量查询之JS混淆逆向跟栈分析
前情概要
近几天有客户联系到我接单,客户要求:做一个批量查询物流信息的软件,要求一天能够查询上十万单的物流信息,并且从这十几万单的物流信息中提取出有效物流,并且能够导出物流揽收时间、寄出地(并且要求提取出省、市)。
奈何现在的反爬技术愈来愈强,各大快递公司对于物流信息查询的接口鉴权已做的越来越全面。通过提取物流公司提供的快递单号查询接口已不太现实。但通过物流公司提供的开放平台“物流轨迹识别API”实现需要对API按次收费,也不是最优的方案。
我的想法
经过几天的查找,发现有个别网站正在做“批量查询物流信息”的平台,虽然是收费平台,但是看到优惠信息“每个账号每天能免费查询100单物流信息”,于是一个非常大胆的想法油然而生,制作一个自动化程序,首先注册一万个账号写入“账号库”,在之后查询时调用“账号库”中的账号进行查询,理论上可以实现。
开始分析
PS:平台网址:
aHR0cHM6Ly95dW4uemh1emh1ZmFubGkuY29tLw==
想要实现自动化注册流程,那么必须抓到网站在注册时候发送的包,首先进入网站的注册网页,再进入Web dev,后面发现跳“debugger”。
那么,首先要解决这个问题,这个问题在JS逆向中最常见,一般出现这个问题我们是要通过“替换JS”文件的方法来解决,即把调用这个“debugger”的方法通过JS替换文件的方式给注释掉,就不会弹“debugger”了。
JS逆向第一步:注释debugger方法
那么,我们通过跟栈分析,在调用"debugger"方法中,有两个匿名函数,那么我们跳过,点击第一个堆栈函数。发现
(_0x4a3118['LlPtj'])('de'));
这一个函数调用了“debugger”方法,那么对函数参数置空,即
(_0x4a3118[''])('de'));
即可注释掉“debugger”方法。
这是最基础的一个步骤,因为JS做了逆向和混淆,同时也可见JS代码中,所有的参数、函数名称,都已经混淆,完全代码不可读。
JS逆向第二步:通过网络模块,找出注册账号的接口
通过分析,发现注册的脚本内,除了我们填写的值“username”、“password”、“qq”等,还有一个“zs”的值,那很明显接口被加密了,首先遇到这个情况怎么办呢?如何知道这个加密的值是怎么计算的呢?
发现加密参数
首先,我们观察一下这个值的构成,他是由xxxx + “|” + 时间戳 构成,那么这个加密的值是不是动态的?(即用户名和密码和qq都填写的一样,这个加密的值会变化吗)?
我们多尝试几次,发现加密出的这个参数的值每次都会发生变化,因此我们考虑是否和时间戳有关。
其实这个参数的构成中带有时间戳,已经暗示的很明显了,生成这个参数的值和时间戳是有关的,因为时间戳每时每刻都在发生变化,所以无论我们注册的值是否发生变化,时间戳发生变化后,这个加密的值都会发生变化。
找到计算加密参数的JS代码
我们全局搜索这个参数的key,即“zs”。
现在,我们找到和有关“zs”的JS代码。
submit: function (formfilter, reload, addsign, sgname) {
//监听提交
form.on('submit(' + formfilter + ')', function (data) {
var ld = layer.load();
//算sign
if (addsign === true) {
var s = md5.Do(data.field[sgname]);
data.field["zs"] = s.toString();
}
$.post('', data.field, function (result) {
layer.close(ld); //关闭load
lyresult.show(result, reload);
}, 'json').error(function () {
layer.close(ld); //关闭load
lyresult.syserr();
});
return false;
});
},
现在,可见,有“md5”字样,可能是“MD5加密”,我们打断点,分析他调用的函数的内容。
跟栈分析,发现在一串函数中,有一个返回值:
return _0x4542ec['Abmuj'](_0x4cb122['MD5'](_0x5ca529 + _0x4542ec + [_0x4481('129'
很明显,他是字符串拼接,然后进行MD5加密的,可以打断点,分析每个参数里面的值是什么?
经过断点分析,“_0x5ca529”是用户名,“_0x4542ec”是一个常量,用于字符串的加密拼接所需要的,至此,加密逻辑都完成了。
我们知道了他的加密逻辑,放在python等语言中,计算加密内容调用即可!
登录之后,推送物流查询信息
这儿也和之前一样,通过dev获取相关接口,虽然也有加密,但是加密的方法也是一样的,一样的分析即可。这里不再赘述。
本篇完。
本文系作者 @chboy 原创发布在轩哥代码库站点。未经许可,禁止转载。
暂无评论数据