当前位置: 首页 > 后端技术 > Python

【JS逆向工程100例】Netlozer反爬虫实践平台第二题:JJEncode加密

时间:2023-03-25 22:50:08 Python

关注微信公众号:K爬虫大哥,继续分享高级爬虫、JS/Android逆向等技术干货!声明本文所有内容仅供学习交流。抓拍内容、敏感网址、数据接口均已脱敏处理,严禁用于商业或非法用途。否则,由此产生的一切后果与作者无关。侵权请联系我立即删除!逆向目标目标:网路者反爬虫实践平台第二题:JJEncode加密链接:http://spider.wangluozhe.com/...简介:本题与第一题类似,要求收集全部100个页码,并计算所有数据的总和。第二题使用的算法是SHA1的修改版,还有JJEncode加密JJEncode简介JJEncode最初是日本作者YosukeHASEGAWA在2009年开发的一个网页程序,它可以将任何JavaScript编码转换为混淆形式仅使用18个符号[]()!+,\"$.:;_{}~=,在线体验地址:https://utf-8.jp/public/jjenc...,如果想深入它的原理,可以在K哥里面爬取公众号回复【JJEncode】获取其详细原理介绍PDF。作者有提示:JJEncode很容易解码,不是实用的混淆,只是一个编码器,JJEncode太有特点了,很容易被检测到,而且还依赖浏览器,代码不能在a上运行某些浏览器。它的缺点是堆栈很严重。如果JS很大,加密的时候可能会内存溢出,所以只适合核心函数加密。事实上,JJEncode仍然很少在商业上使用,但了解它也无妨。一段普通的JS代码:JJEncode混淆后的alert("Hello,JavaScript")(自定义变量名为$):$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.__)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$。__+"\\\"\\"+$.$__+$.___+")"+"\"")())();JJEncode反混淆方法很简单,下面介绍几种常用的方法:使用在线工具直接解密,如:http://www.hiencode.com/jjenc...JJEncode的代码通常是一个自执行的方法(IIFE)。把代码中的最后一个()去掉后,放在浏览器中直接执行就可以看到在线调试源码,在JJEncode代码的第一行打断点,然后一步步执行,和终于在虚拟机(VM)中看到了源码的反向参数。反向目标主要是翻页接口_signature参数,调用的加密方式依然是window.get_sign(),与第一题相同,本文不再赘述。不知道的可以看看K哥上一期的文章。跟进2.js后,会发现是一个JJEncode混淆:我们把混淆的final()去掉,放在浏览器控制台运行(建议单独开无痕窗口,有时可能有影响),可以看到源码,点击源码来到虚拟机(VM),整个源码展现在我们面前:除了直接去掉()运行,我们还可以同样在混淆代码的第一行打断点,然后单步跟进,最后也会得到源码,如下图:看源码很简单,是一个神奇修改过的SHA1匿名函数,直接把它的代码复制重写,用Python代码携带_signature计算每一页数据,最后提交成功:完整代码GitHub关注K的爬虫,继续分享爬虫-相关代码!欢迎加星!https://github.com/kgepachong/下面只是演示了部分关键代码,不能直接运行!完整代码仓库地址:https://github.com/kgepachong...JavaScript加密代码/*=====================================#@时间:2021-12-10#@作者:微信:K哥笨虫#@FileName:challenge_2.js#@Software:PyCharm#==================================*/varhexcase=0;varchrsz=8;functionhex_sha1(s){returnbinb2hex(core_sha1(AlignSHA1(s)));}functionsha1_vm_test(){returnhex_sha1("abc")=="a9993e364706816aba3e25717850c26c9cd0d89d";}functioncore_sha1(blockArray){varx=blockArray;varw=数组(80);变量a=1732584173;变量b=-271733877;变量c=-1752584194;变量d=271733878;vare=-1009589776;for(vari=0;i>16)+(y>>16)+(lsw>>16);返回(MSW<<16)|(lsw&0xFFFF);}functionrol(num,cnt){返回(num<>>(32-cnt));}函数AlignSHA1(str){varnblk=((str.length+8)>>6)+1;varblks=newArray(nblk*16);对于(vari=0;i>2]|=str.charCodeAt(i)<<(24-(i&3)*8);}blks[i>>2]|=0x80<<(24-(i&3)*8);blks[nblk*16-1]=str.length*8;returnblks;}functionbinb2hex(binarray){varhex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";变量str="";对于(vari=0;i>2]>>((3-i%4)*8+4))&0xF)+hex_tab.charAt((binarray[i>>2]>>((3-i%4)*8))&0xF);}returnstr;}functiongetSign(){returnhex_sha1(Date.parse(newDate).toString());}//测试输出//console.log(getSign())Python计算关键字代码#==================================#--*--编码:utf-8--*--#@Time:2021-12-10#@作者:微信:K哥笨虫#@FileName:challenge_2.py#@Software:PyCharm#==================================importexecjsimportrequestschallenge_api="http://spider.wangluozhe.com/challenge/api/2"headers={"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8","Cookie":"将cookie值得为你自己的!","Host":"spider.wangluozhe.com","Origin":"http://spider.wangluozhe.com","Referer":"http://spider.wangluozhe.com/challenge/2","User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/96.0.4664.45Safari/537.36","X-Requested-With":"XMLHttpRequest"}defget_signature():withopen('challenge_2.js','r',encoding='utf-8')asf:ppdai_js=execjs.compile(f.read())signature=ppdai_js.call("getSign")print("signature:",signature)returnsignaturedefmain():result=0forpageinrange(1,101):数据={"page":page,"计数":10,"_signature":get_signature()}response=requests.post(url=challenge_api,headers=headers,data=data).json()fordinresponse["data"]:result+=d["value"]print("结果为:",result)if__name__=='__main__':main()