老铁们,大家好,相信还有很多朋友对于md5解密加密网站源码分享和md5加密解密工具类的相关问题不太懂,没关系,今天就由我来为大家分享分享md5解密加密网站源码分享以及md5加密解密工具类的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
很多同学由于学习任务需要用爬虫获取数据,学习了python爬虫的基础知识。但是在开始写爬虫程序的时候就出现了问题。我现将一些同学的爬虫获取数据的解决方式记录下来,供大家参考。
希望本文对你有所帮助~~如果对软件测试、接口测试、自动化测试、面试经验交流感兴趣可以私聊我。免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。
网站分析
既然选定了目标,那就开始抓包,分析网页。
这是抓包后的情况,通过对多个包进行比较发现,实际变化的参数只有lastId、nonce、timestamp、pageNum。具体分析了一下,lastId:前一页最后一个发言用户的tid;pageNum:当前页码;timestamp:13位时间戳;nonce:不知道是什么,但是看他长了一副加密的脸。至此,目标就很清晰了,重点针对nonce。
js逆向分析
通过全局搜索,断点定位,最终将目标锁定在这一行代码上。
e.params.nonce=Object(u[&34;])(t+&34;+parseInt(1e7*Math.random(),10)+1,32)
通过观察发现,这一行代码的最终输出结果正是我们今天的目标。
分析一下代码:
“t”:13位的时间戳
“+&34;+”:为将时间戳转为字符串
“1e7”:10000000,固定值
“Math.random()”:随机数
“parseInt”:取整
“t+&34;+parseInt(1e7*Math.random(),10)+1”,这里的意思就很明显了,时间戳+取整的随机数+1,最终的结果是一个21位数。
继续分析Object(u[&34;])和32发现,这里是调用了u的[md5]方法,将前面的21位字符串和32作为参数,传给了MD5,网页源代码如下:
e.md5=function(e,t){\nfunctionn(e,t){\nreturne<<t|e>>>32-t\n}\nfunctioni(e,t){\nvarn,i,a,r,o;\nreturna=2147483648&e,\nr=2147483648&t,\nn=1073741824&e,\ni=1073741824&t,\no=(1073741823&e)+(1073741823&t),\nn&i?2147483648^o^a^r:n|i?1073741824&o?3221225472^o^a^r:1073741824^o^a^r:o^a^r\n}\n…………//此处省略
目前为止,思路已经很清晰了,这里我们可以通过Python实现MD5加密,也可以抠源代码改写。为了保证百分百不出错,这里我选择了抠代码。
js代码改写
首先是源代码:
e.md5=function(e,t){\nfunctionn(e,t){\nreturne<<t|e>>>32-t\n}\nfunctioni(e,t){\nvarn,i,a,r,o;\nreturna=2147483648&e,\nr=2147483648&t,\nn=1073741824&e,\ni=1073741824&t,\no=(1073741823&e)+(1073741823&t),\nn&i?2147483648^o^a^r:n|i?1073741824&o?3221225472^o^a^r:1073741824^o^a^r:o^a^r\n}\nfunctiona(e,t,a,r,o,s,l){\nreturne=i(e,i(i(function(e,t,n){\nreturne&t|~e&n\n}(t,a,r),o),l)),\ni(n(e,s),t)\n}\nfunctionr(e,t,a,r,o,s,l){\nreturne=i(e,i(i(function(e,t,n){\nreturne&n|t&~n\n}(t,a,r),o),l)),\ni(n(e,s),t)\n}\nfunctiono(e,t,a,r,o,s,l){\nreturne=i(e,i(i(function(e,t,n){\nreturne^t^n\n}(t,a,r),o),l)),\ni(n(e,s),t)\n}\nfunctions(e,t,a,r,o,s,l){\nreturne=i(e,i(i(function(e,t,n){\nreturnt^(e|~n)\n}(t,a,r),o),l)),\ni(n(e,s),t)\n}\nfunctionl(e){\nvart,n=&34;,i=&34;;\nfor(t=0;t<=3;t++)\nn+=(i=&34;+(e>>>8*t&255).toString(16)).substr(i.length-2,2);\nreturnn\n}\nvarc,u,p,m,d,h,f,v,y,g=e,b=Array();\nfor(b=function(e){\nfor(vart,n=e.length,i=n+8,a=16*((i-i%64)/64+1),r=Array(a-1),o=0,s=0;s<n;)\no=s%4*8,\nr[t=(s-s%4)/4]=r[t]|e.charCodeAt(s)<<o,\ns++;\nreturnt=(s-s%4)/4,\no=s%4*8,\nr[t]=r[t]|128<<o,\nr[a-2]=n<<3,\nr[a-1]=n>>>29,\nr\n}(g),\nh=1732584193,\nf=4023233417,\nv=2562383102,\ny=271733878,\nc=0;c<b.length;c+=16)\nu=h,\np=f,\nm=v,\nd=y,\nf=s(f=s(f=s(f=s(f=o(f=o(f=o(f=o(f=r(f=r(f=r(f=r(f=a(f=a(f=a(f=a(f,v=a(v,y=a(y,h=a(h,f,v,y,b[c+0],7,3614090360),f,v,b[c+1],12,3905402710),h,f,b[c+2],17,606105819),y,h,b[c+3],22,3250441966),v=a(v,y=a(y,h=a(h,f,v,y,b[c+4],7,4118548399),f,v,b[c+5],12,1200080426),h,f,b[c+6],17,2821735955),y,h,b[c+7],22,4249261313),v=a(v,y=a(y,h=a(h,f,v,y,b[c+8],7,1770035416),f,v,b[c+9],12,2336552879),h,f,b[c+10],17,4294925233),y,h,b[c+11],22,2304563134),v=a(v,y=a(y,h=a(h,f,v,y,b[c+12],7,1804603682),f,v,b[c+13],12,4254626195),h,f,b[c+14],17,2792965006),y,h,b[c+15],22,1236535329),v=r(v,y=r(y,h=r(h,f,v,y,b[c+1],5,4129170786),f,v,b[c+6],9,3225465664),h,f,b[c+11],14,643717713),y,h,b[c+0],20,3921069994),v=r(v,y=r(y,h=r(h,f,v,y,b[c+5],5,3593408605),f,v,b[c+10],9,38016083),h,f,b[c+15],14,3634488961),y,h,b[c+4],20,3889429448),v=r(v,y=r(y,h=r(h,f,v,y,b[c+9],5,568446438),f,v,b[c+14],9,3275163606),h,f,b[c+3],14,4107603335),y,h,b[c+8],20,1163531501),v=r(v,y=r(y,h=r(h,f,v,y,b[c+13],5,2850285829),f,v,b[c+2],9,4243563512),h,f,b[c+7],14,1735328473),y,h,b[c+12],20,2368359562),v=o(v,y=o(y,h=o(h,f,v,y,b[c+5],4,4294588738),f,v,b[c+8],11,2272392833),h,f,b[c+11],16,1839030562),y,h,b[c+14],23,4259657740),v=o(v,y=o(y,h=o(h,f,v,y,b[c+1],4,2763975236),f,v,b[c+4],11,1272893353),h,f,b[c+7],16,4139469664),y,h,b[c+10],23,3200236656),v=o(v,y=o(y,h=o(h,f,v,y,b[c+13],4,681279174),f,v,b[c+0],11,3936430074),h,f,b[c+3],16,3572445317),y,h,b[c+6],23,76029189),v=o(v,y=o(y,h=o(h,f,v,y,b[c+9],4,3654602809),f,v,b[c+12],11,3873151461),h,f,b[c+15],16,530742520),y,h,b[c+2],23,3299628645),v=s(v,y=s(y,h=s(h,f,v,y,b[c+0],6,4096336452),f,v,b[c+7],10,1126891415),h,f,b[c+14],15,2878612391),y,h,b[c+5],21,4237533241),v=s(v,y=s(y,h=s(h,f,v,y,b[c+12],6,1700485571),f,v,b[c+3],10,2399980690),h,f,b[c+10],15,4293915773),y,h,b[c+1],21,2240044497),v=s(v,y=s(y,h=s(h,f,v,y,b[c+8],6,1873313359),f,v,b[c+15],10,4264355552),h,f,b[c+6],15,2734768916),y,h,b[c+13],21,1309151649),v=s(v,y=s(y,h=s(h,f,v,y,b[c+4],6,4149444226),f,v,b[c+11],10,3174756917),h,f,b[c+2],15,718787259),y,h,b[c+9],21,3951481745),\nh=i(h,u),\nf=i(f,p),\nv=i(v,m),\ny=i(y,d);\nreturn32==t?l(h)+l(f)+l(v)+l(y):l(f)+l(v)\n}
其次是改写后的代码,这里遵循的是改得越少越好的原则:
functionMD5(e,t){\nfunctionn(e,t){\nreturne<<t|e>>>32-t\n}\n\nfunctioni(e,t){\nvarn,i,a,r,o;\nreturna=2147483648&e,\nr=2147483648&t,\nn=1073741824&e,\ni=1073741824&t,\no=(1073741823&e)+(1073741823&t),\nn&i?2147483648^o^a^r:n|i?1073741824&o?3221225472^o^a^r:1073741824^o^a^r:o^a^r\n}\n\nfunctiona(e,t,a,r,o,s,l){\nreturne=i(e,i(i(function(e,t,n){\nreturne&t|~e&n\n}(t,a,r),o),l)),\ni(n(e,s),t)\n}\n\nfunctionr(e,t,a,r,o,s,l){\nreturne=i(e,i(i(function(e,t,n){\nreturne&n|t&~n\n}(t,a,r),o),l)),\ni(n(e,s),t)\n}\n\nfunctiono(e,t,a,r,o,s,l){\nreturne=i(e,i(i(function(e,t,n){\nreturne^t^n\n}(t,a,r),o),l)),\ni(n(e,s),t)\n}\n\nfunctions(e,t,a,r,o,s,l){\nreturne=i(e,i(i(function(e,t,n){\nreturnt^(e|~n)\n}(t,a,r),o),l)),\ni(n(e,s),t)\n}\n\nfunctionl(e){\nvart,n=&34;,\ni=&34;;\nfor(t=0;t<=3;t++)\nn+=(i=&34;+(e>>>8*t&255).toString(16)).substr(i.length-2,2);\nreturnn\n}\nvarc,u,p,m,d,h,f,v,y,g=e,\nb=Array();\nfor(b=function(e){\nfor(vart,n=e.length,i=n+8,a=16*((i-i%64)/64+1),r=Array(a-1),o=0,s=0;s<n;)\no=s%4*8,\nr[t=(s-s%4)/4]=r[t]|e.charCodeAt(s)<<o,\ns++;\nreturnt=(s-s%4)/4,\no=s%4*8,\nr[t]=r[t]|128<<o,\nr[a-2]=n<<3,\nr[a-1]=n>>>29,\nr\n}(g),\nh=1732584193,\nf=4023233417,\nv=2562383102,\ny=271733878,\nc=0;c<b.length;c+=16)\nu=h,\np=f,\nm=v,\nd=y,\nf=s(f=s(f=s(f=s(f=o(f=o(f=o(f=o(f=r(f=r(f=r(f=r(f=a(f=a(f=a(f=a(f,v=a(v,y=a(y,h=a(h,f,v,y,b[c+0],7,3614090360),f,v,b[c+1],12,3905402710),h,f,b[c+2],17,606105819),y,h,b[c+3],22,3250441966),v=a(v,y=a(y,h=a(h,f,v,y,b[c+4],7,4118548399),f,v,b[c+5],12,1200080426),h,f,b[c+6],17,2821735955),y,h,b[c+7],22,4249261313),v=a(v,y=a(y,h=a(h,f,v,y,b[c+8],7,1770035416),f,v,b[c+9],12,2336552879),h,f,b[c+10],17,4294925233),y,h,b[c+11],22,2304563134),v=a(v,y=a(y,h=a(h,f,v,y,b[c+12],7,1804603682),f,v,b[c+13],12,4254626195),h,f,b[c+14],17,2792965006),y,h,b[c+15],22,1236535329),v=r(v,y=r(y,h=r(h,f,v,y,b[c+1],5,4129170786),f,v,b[c+6],9,3225465664),h,f,b[c+11],14,643717713),y,h,b[c+0],20,3921069994),v=r(v,y=r(y,h=r(h,f,v,y,b[c+5],5,3593408605),f,v,b[c+10],9,38016083),h,f,b[c+15],14,3634488961),y,h,b[c+4],20,3889429448),v=r(v,y=r(y,h=r(h,f,v,y,b[c+9],5,568446438),f,v,b[c+14],9,3275163606),h,f,b[c+3],14,4107603335),y,h,b[c+8],20,1163531501),v=r(v,y=r(y,h=r(h,f,v,y,b[c+13],5,2850285829),f,v,b[c+2],9,4243563512),h,f,b[c+7],14,1735328473),y,h,b[c+12],20,2368359562),v=o(v,y=o(y,h=o(h,f,v,y,b[c+5],4,4294588738),f,v,b[c+8],11,2272392833),h,f,b[c+11],16,1839030562),y,h,b[c+14],23,4259657740),v=o(v,y=o(y,h=o(h,f,v,y,b[c+1],4,2763975236),f,v,b[c+4],11,1272893353),h,f,b[c+7],16,4139469664),y,h,b[c+10],23,3200236656),v=o(v,y=o(y,h=o(h,f,v,y,b[c+13],4,681279174),f,v,b[c+0],11,3936430074),h,f,b[c+3],16,3572445317),y,h,b[c+6],23,76029189),v=o(v,y=o(y,h=o(h,f,v,y,b[c+9],4,3654602809),f,v,b[c+12],11,3873151461),h,f,b[c+15],16,530742520),y,h,b[c+2],23,3299628645),v=s(v,y=s(y,h=s(h,f,v,y,b[c+0],6,4096336452),f,v,b[c+7],10,1126891415),h,f,b[c+14],15,2878612391),y,h,b[c+5],21,4237533241),v=s(v,y=s(y,h=s(h,f,v,y,b[c+12],6,1700485571),f,v,b[c+3],10,2399980690),h,f,b[c+10],15,4293915773),y,h,b[c+1],21,2240044497),v=s(v,y=s(y,h=s(h,f,v,y,b[c+8],6,1873313359),f,v,b[c+15],10,4264355552),h,f,b[c+6],15,2734768916),y,h,b[c+13],21,1309151649),v=s(v,y=s(y,h=s(h,f,v,y,b[c+4],6,4149444226),f,v,b[c+11],10,3174756917),h,f,b[c+2],15,718787259),y,h,b[c+9],21,3951481745),\nh=i(h,u),\nf=i(f,p),\nv=i(v,m),\ny=i(y,d);\nreturn32==t?l(h)+l(f)+l(v)+l(y):l(f)+l(v)\n}
经过测试,代码能完美实现我想要的功能,
然后将代码保存为.js文件。
Python代码编写
常规操作
importrequests\nimportrandom\nimportexecjs\nimportjson\nimportpandasaspd\nimporttime\n\nurl=&39;\nheaders={\n&39;:&39;,\n&39;:&39;,\n&39;:&39;,\n&39;:&34;Chromium&34;21&34;Not;ABrand&34;99&39;,\n&39;:&39;,\n&39;:&34;Windows&39;,\n&39;:&39;,\n&39;:&39;,\n&39;:&39;\n}
这里虽然导入了好多包,但其实都是根据使用需要一个个导入的。
Python生成js需要的参数
defget_timestamp():\ntimestamp=int(time.time()*1000)获取随机数\nstr_=str(get_timestamp())+str(num)+&39;34;1.js&打开js文件\ncxt=execjs.compile(file.read())39;md5&39;32&调用js文件md5函数加密,获取nonce\nreturnnonce
获取data万事具备,下一步生成data,这里我选择了第一页作为测试。
defget_data():39;forumId&34;9&39;imgSpecs&34;t577x324&34;t577x4096&39;lastId&34;&39;nonce&39;order&39;1&39;pageNum&39;1&39;pageSize&39;10&39;timestamp&39;topicId&34;&请求第一页数据\ndatss=json.loads(res)[&39;][&39;]\ndata_list=[]\nfordataindatss:\nbbsname=data[&39;][&39;]\nname=data[&39;][&39;]\nsummary=data[&39;]\ntid=data[&39;]\ndata_list.append({\n&39;:bbsname,\n&39;:name,\n&39;:summary,\n&39;:tid\n})\nreturndata_list\n\n\nif__name__==&39;:\ndf=pd.DataFrame(main())\n39;手机圈子0.xlsx&39;https://bbs.vivo.com.cn/api/community/forum/threads&39;accept&39;application/json,text/plain,*/*&39;content-type&39;application/json;charset=UTF-8&39;user-agent&39;Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/95.0.4621.0Safari/537.36&39;sec-ch-ua&39;&34;;v=&34;,&34;;v=&34;&39;sec-ch-ua-mobile&39;?0&39;sec-ch-ua-platform&39;&34;&39;origin&39;https://bbs.vivo.com.cn&39;referer&39;https://bbs.vivo.com.cn/newbbs/forum/9&39;cookie&39;cookieId=e1c6727a-9b29-1c13-a417-1b74440b9d521639290997482;KL9d_2132_saltkey=pU2Rr4AV;KL9d_2132_lastvisit=1639287439;Hm_lvt_9ef7debb81babe8b94af7f2c274869fd=1639291140,1639713347;Hm_lvt_a7471116b9007c038d41873ab9121a9e=1639291040,1639713440;sessionId=b6c66b37-b88e-f74d-fa6b-b7e526d5e5f7&获取13位时间戳\nreturntimestamp\n\n\ndefget_str_():\nnum=int(float(str(random.random()*10000000)[:10]))39;1&获取21位随机数\nreturnstr_\n\n\ndefget_cxt():\nwithopen(&34;)asfile:导入js文件\nreturncxt\n\n\ndefget_nonce():\nnonce=get_cxt().call(&39;,get_str_(),&39;)获取第一页data\ndata={\n&39;:&34;,\n&39;:[&34;,&34;],\n&39;:&34;,\n&39;:get_nonce(),\n&39;:&39;,\n&39;:&39;,\n&39;:&39;,\n&39;:get_timestamp(),\n&39;:&34;\n}\nreturndata\n\n\ndefmain():\nres=requests.post(url,headers=headers,data=json.dumps(get_data())).text39;data&39;list&39;author&39;bbsName&39;forum&39;name&39;summary&39;tid&39;bbsname&39;name&39;summary&39;tid&39;__main__&df.index=df.index+1\nprint(df)\ndf.to_excel(&39;)
成果展示
本文参考整理自博客:爬遍天下无敌手,如有侵权,请联系删除。
希望本文对你有所帮助~~如果对软件测试、接口测试、自动化测试、面试经验交流感兴趣可以私聊我。免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。
关于md5解密加密网站源码分享和md5加密解密工具类的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
