长亭百川云 - 文章详情

WEB前端逆向随笔

青衣十三楼飞花堂

69

2024-07-13

WEB前端逆向初学者的若干备忘。

不管用啥办法,得尽早设法F12调试,否则进展困难。

正常js不太可能用eval这类狗屎函数,Ctrl-Shift-F,全局搜索eval,命中的js都需要手工检视。

有两类常见执行debugger的方案:

eval("debugger;")Function("debugger")

Hook相应函数,若其参数中有debugger,做针对性处理。这只是简单示例,见招拆招。

Q:F12 Network面板过滤Fetch/XHR,Type列有fetch、xhr两种,啥区别?A:XHR是老技术,Fetch是基于Promise的新技术,使用起来比XHR更简洁。

F12  Network    Fetch/XHR      Initiator        调用栈回溯

据此可定位

h.send(c)

F12  Sources    XHR/fetch Breakpoints

即XHR断点,据此可断在

h.send(c)

断下来时,可查看h,h是XMLHttpRequest对象,有不同的"event handler",比如

onerroronloadonloadendonloadstartonreadystatechangeontimeout

不一定都设置有值,有值时对应"event handler",展开后有FunctionLocation,据此可定位"event handler"。一般onload、onreadystatechange用于处理响应。

Event Listener Breakpoints  XHR    error    load    loadend    loadstart    readystatechange    timeout

即XHR事件断点,重点关注load、readystatechange,据此可断在

h.onreadystatechange

即使js混淆过,前述众方法仍适用,不受混淆干扰。

Event Listener Breakpoints  Script    Script First Statement

每个

Event Listener Breakpoints  Load    beforeunload

有些js检测到DevTools会关闭当前页面,上述断点会命中。

有些反DevTools的js,Network面板"Block request domain"、"Block request URL"可对付。

js混淆是标配,国内"jsjiami.com.v6/v7"比较常见,这种较易反混淆,用Babel自实现反混淆,多写几次就能通用化。过去看别人反混淆,觉得不太好理解,被迫实战几次后,发现光看觉着难,实际动手就不难了。

https://babeljs.io/https://astexplorer.net/

Babel,我是看两本书入门的:

《Python 3网络爬虫开发实战(第二版)_崔庆才》
《反爬虫AST原理与还原混淆实战_李岳阳》

eval(function(...) {...}('...'))

有些js被多种混淆层层包裹,包括但不限于多层eval(),在Network面板调用栈回溯中只看到VM,找不到原始js所在。Ctrl-Shift-F,全局搜索特征字符串,无有效命中。此时可尝试Hook eval,用includes检查参数中是否含有特征字符串,匹配时执行debugger,调用栈回溯中有原始js。若不用Hook,可用"Script First Statement"断点挨个找,还可结合二分法之类的思路。

js反混淆后可本地Overrides,不便本地Overrides时挂代理在线替换js。

可能多个js中都有反调试,挨个Overrides。有些看似功能性js暗藏混淆js片段,不要凭名字忽略某个js,都过一遍,我吃过亏。

https://beautifier.io/

js会检查自身是否美化过,反调试手段之一,RegExp是其特征。发现自身美化过,一般不会显式结束流程,而是设法吃内存,比如无限递归,直至触发OOM。若js中某行代码未美化前会被执行,美化后设断无命中,其前面必有美化检测代码,找出来改掉。这种美化检测在nodejs中表现得更明显,比如require完不成。

有些js会重定义function关键字,比如替换成var,导致无法定义函数,具体情况具体处理。

有些js会检测窗口大小,可将DevTools Undock to separate window,即浮动起来。

混淆过的js随时间变化,比如每5分钟一变,这种若不反混淆后辅以静态分析,会很痛苦。

F12调试,Network面板Name列有时会看到类似这种:

blob:https://...

blob的名字每次都不一样,是个uuid,其Type列是"text/javascript",这种是从内存动态加载的js,不走网络。假设Network看到这种blob,想找出其创建位置,可拦截"URL.createObjectURL",查看调用栈回溯。

blob名是uuid,每次不一样,无法对之使用Overrides技术。可直接对blob源做修改,内嵌debugger语句。

Application面板中可以清Cookies等数据。

善用CyberChef,常用的有:

AES DecryptFrom Base64From HTML EntityMD5To HexdumpUnescape string

"Unescape string"通用,对\x、\u都处理,不必用"Unescape Unicode Characters"。有些人还在找在线工具集,这是完全没听过CyberChef吧。

https://github.com/gchq/CyberChef

总的来说,只是禁F12、DevTools,意义不大。私有js混淆及时间戳敏感能增加逆向难度,比wasm抗性大。目前这些wasm也就吓唬一下没搞过二进制逆向的,有些弱智wasm居然未strip,符号信息赤裸裸地留在那儿,凭白便宜逆向人员。将来wasm自身抗逆向工程是一定的,便如PE、ELF走过的路。wasm缺乏成熟调试工具也是个问题。

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2