案例网址:Token
加密参数+参数定位
数据包显而易见:
经py测试可得,就一个加密参数code:
下面xhr定位加密位置,这次跟栈有点儿难,因为很多栈入参或者函数内部都没有密文或者关键字啥的,但是我们可以看出来其实就是switch case+异步 而已,那些站基本都没啥用,直到我跟到这里:
上一个栈是有加密参数入参的,这里就没有了,我们在最后返回值处打上断点看看:
a这里已经有密文了,我们看a怎么来的,其实a就是上面一行然后那一行入参有一个t,他也已经包含密文了:
再看t怎么来的:
这里套了一层又一层函数,我们从内向外看:
最内层函数执行完就已经有了密文,但是入参却是undefined,算了,我们进函数一探究竟:
找到了,藏得很深啊,运行过来看看怎么加密的:
看密文长度像是md5,试试函数是不是吧:
标准md5,ok直接手搓
复现逻辑+py调用
简单,直接写了
//code var CryptoJS=require("crypto-js")function codeEnc(){var n=Date.now().toString()r=CryptoJS.MD5(n+"9527"+n.substr(0,6)).toString()return{code:r,timeStamp:n}}console.log(codeEnc());记得时间戳也传出来,然后py调用如下:
importrequestsimportexecjsimportosclassJSExecutor:def__init__(self,js_file_path):ifnotos.path.exists(js_file_path):raiseFileNotFoundError(f'{js_file_path}does not exist')withopen(js_file_path,'r',encoding='utf-8')asf:self.js_code=f.read()self.js_code=execjs.compile(self.js_code)defcall(self,func_name,*args):returnself.js_code.call(func_name,*args)defget_data(code,time_stamp):headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0',}params={'pages':'2,1','sizes':'100,100','subject':'market_cap','language':'en_US','legal_currency':'USD','code':code,'timestamp':time_stamp,'platform':'web_pc','v':'0.1.0','mytoken':'',}response=requests.get('https://api.mytoken.info/ticker/currencyranklist',params=params,headers=headers)returnresponse.json()if__name__=='__main__':js_executor=JSExecutor('20.js')params=js_executor.call('codeEnc')print(get_data(params['code'],params['timeStamp']))小结
加密很简单,就是加密位置不太好找,仔细一点即可,然后找不到就在加密最后出现的栈的前一个栈打断点,说不定就藏在某个函数中,文章如有其他问题请及时提出,加油加油