项目地址:aHR0cHM6Ly93d3cuemhpcGluLmNvbS9qb2JfZGV0YWlsLz9xdWVyeT0lRTklODAlODYlRTUlOTAlOTEmY2l0eT0xMDAwMTAwMDAmaW5kdXN0cnk9JnBvc2l0aW9uPQ==
观前提示:
本文章仅供学习交流,切勿用于非法通途,如有侵犯贵司请及时联系删除
定位加密点
这次我们需要的一个参数是cookie中的 __zp_stoken__
同样的 我们在全局搜索搜 __zp_stoken__
点进去看看逻辑
发现 我们还需要再找一下 GATEWAY_TOKEN_NAME 的出处
页面搜索看看
这里做了一个cookie的set操作 set的值为s s就是8025行的代码
到此 加密点就定位到了
逻辑分析与堆环境
8025行打上断点刷新页面 成功断下
发现t对应ABC
传入e和i e为cookie中的seed i为cookie中的ts
接着点进ABC函数可以看到这个js为ob混淆
那我们用ast解一下看看用了哪些环境 解完后六千多行 还是挺好分析的
开局就看到
那我们就要想 他会不会是混淆了然后解密在Function里面做了一些浏览器检测操作呢 先不管 往后继续看
这里检测了window下面是否有document和获取了document.cookie
下面获取了navigator下面的cookieEnabled和language
同时也获取了_phantom和callphantom 由于这俩个都是undefined 所以可以不定义
这个cookie好像是没检测啥东西 写死就行
window={}; window._phantom = window.callphantom = undefined; document=window.document={ cookie:"sid=sem_pz_bdpc_dasou_title; __g=sem_pz_bdpc_dasou_title; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1596368815,1596368826,1597646720,1597646727; lastCity=100010000; __c=1597646720; __l=l=%2Fwww.zhipin.com%2Fjob_detail%2F%3Fquery%3D%26city%3D100010000%26industry%3D%26position%3D&r=https%3A%2F%2Fwww.baidu.com%2Fother.php%3Fsc.af0000afYf7jC0pXF4oS1iJj8V8v9tvluUwo5fBffPttzpNapbA7PKeD-W1kcVeA779tXhnoWS-eeuw39PZFzghQzrSfhjJTCveyDrQYXE5REN9Nk5VOVtOjuaS-vB__WNgXP9JJpVVkgjvXXVF7TCfIUZJFvkaOz5ZHqTnpMn9yCK7SnX6U6zwVGI1qjzNzjp87wGsKeJWvUCia5IicBV5F3DSZ.7D_NR2Ar5Od663rj6t8AGSPticrtXFBPrM-kt5QxIW94UhmLmry6S9wiGyAp7BEIu80.TLFWgv-b5HDkrfK1ThPGujYknHb0THY0IAYqmhq1Tqpkko60IgP-T-qYXgK-5H00mywxIZ-suHY10ZIEThfqmhq1Tqpkko60ThPv5HD0IgF_gv-b5HDdnHbYnjnYnHn0UgNxpyfqnHcLPWTLnj00UNqGujYknjm3P10vPfKVIZK_gv-b5HDkPHnY0ZKvgv-b5H00pywW5R9rf6KWThnqP1bkn0%26ck%3D3759.5.111.351.162.195.162.106%26dt%3D1597646717%26wd%3Dboss%25E7%259B%25B4%25E8%2581%2598%26tpl%3Dtpl_11534_22836_18980%26l%3D1519403413%26us%3DlinkName%253D%2525E6%2525A0%252587%2525E5%252587%252586%2525E5%2525A4%2525B4%2525E9%252583%2525A8-%2525E4%2525B8%2525BB%2525E6%2525A0%252587%2525E9%2525A2%252598%2526linkText%253DBOSS%2525E7%25259B%2525B4%2525E8%252581%252598%2525E2%252580%252594%2525E2%252580%252594%2525E6%252589%2525BE%2525E5%2525B7%2525A5%2525E4%2525BD%25259C%2525EF%2525BC%25258C%2525E6%252588%252591%2525E8%2525A6%252581%2525E8%2525B7%25259F%2525E8%252580%252581%2525E6%25259D%2525BF%2525E8%2525B0%252588%2525EF%2525BC%252581%2526linkType%253D&g=%2Fwww.zhipin.com%2F%3Fsid%3Dsem_pz_bdpc_dasou_title&friend_source=0&friend_source=0; __a=76203896.1596368628.1596368632.1597646720.16.3.9.8; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1597648407; __zp_stoken__=fce8afD16XzU3XWoFMU0rCVd6aHYYcG8%2FPlIvCmcRNRpxOz8pHQg3fB97QGJ0KGRHHjt%2BZF1lNyBvXC9VKzJuLE44OX4TWG5mfS1yIQw8QAY9XE0VUTNGJV88RxlIcwMMXAI7G0dsSFgtbDQ%3D" }; navigator=window.navigator={ cookieEnabled:true, language:"zh-CN" };
继续下看
是一个canvas的常规操作
按照这个逻辑缺啥补啥给他
有人问这个toDataURL返回的值是怎么来的呢?我们只需要在浏览器按照这个逻辑执行一遍返回的值便是我们需要的canvas了 或者去js中相应的位置断点输出也是可以的
document.createElement = createElement; function createElement(a){ return { getContext:function(aa){ return { textBaseline:"", font:"", textBaseline:"", fillStyle:"", fillRect:function(aa,bb,cc,dd){}, fillStyle:"", fillText:function(aaa,bbb,ccc){} } }, toDataURL:function(){ return "自己填" } } }
继续看看还有啥操作
这里出现了好几处eval和Function里面的操作 要多注意
这里的又出现了一次常规的navigator操作
很简单补的 反正四个字 缺啥补啥
navigator=window.navigator={ userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36", appVersion:"5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36" }
接着讲讲俩种hook方法
我们知道js里面用了eval 那我们能不能hook eval呢?
当然可以 改写一下就行了
首先进到ABC函数方法
然后控制台输入我们的hook代码
(function() { _eval=eval; eval=function(a){ console.log("hook eval:",a); return _eval(a); } })();
接着再输入
(new ABC).z("EJ+WpvF3xQsfjrE7SjvS0H/gopK+G7mN0mXrYC4ITZo=", parseInt("1597680891953") + 60 * (480 + (new Date).getTimezoneOffset()) * 1e3)
回车看效果
几处eval的代码就被我们hook出来了 是不是很方便
另外一种hook方法为插桩 我们就那Functin来实验
先把js放到本地 搜索Function 记得区分大小写 不然function也是一起匹配的
一共19处不是很多
全插上console 或者你懒的话直接打上debugger也是可以的 达到目的就行
插好后放控制台运行一下
最后根据返回的内容补上缺的东西就行啦
怎么确定我补的值是不是和网页返回的值一样?
你可以把这段代码再浏览器执行一遍和在node执行一遍 确保俩个返回的值对上了就可以啦
运行效果
[完]