JSRPC 技巧:如何自动将动态函数暴露到全局
大家好,今天分享一个将动态 JS 加密函数自动化暴露的全局的方法,因为有小伙伴在评论区问了,所以才有了这篇文章。
动态 JS
在不用油猴拓展也能自动注入JSRPC脚本?这篇文章中,有小伙伴在问:“如果js文件名是动态变化的,而且调用 rpc 的代码位置需要提权到全局,这种情况脚本注入应该怎么处理呢?”,我的回答是:找到对应的函数,将其赋值给全局对象,即可在全局调用了。
后面有小伙伴提到上面的操作无法自动化,其实还是可以自动化的,本篇文章我来演示一下动态赋值的方案。
这里借用猿人学内部的练习平台第三题,它使用了一个动态的 OB 混淆的 JS,不带 cookie
请求的话,可以看到两次的请求返回的结果是不一样的,代码结构大同小异,但是变量和混淆的字符串发生了很大的变化,找了好久,只有这题还算符合动态 JS 的需求,暂且先使用它吧,题目不是重点,重点是思路。
JSRPC注入
要动态的找到加密函数并且注入 JSRPC 代码,其实和把大象放到冰箱里一样,只需要三步:
- 找到动态 JS,判断动态 JS 变化的范围。
- 定位加密函数所在位置。
- 注入 JS 代码,将加密函数暴露到全局,并且注入 JSRPC 代码,完成远程调用。
首先是找到动态 JS,通过上面的图已经看出来了,它是一个动态的 JS,不过整体的代码结构还是一个 OB 混淆,没有太大的变化。
而且它的加密函数没有暴露在全局,在网站加载完成后,V 函数就不可用了。
下一步就是定位加密函数所在位置,测试了几次,这个动态 JS 的加密函数是不会变的,名字都是 V,相对还简单一些,如果它会变的话其实也一样,无非就是定义规则来找到它就好。
为了能定义规则找到加密函数,需要查看原始未经过反混淆的代码中加密函数在哪个位置。
加密函数在这里,刷新几次发现它一直是不变的,其他的代码和字符串一直在变,但是加密函数的函数签名是不变的,我们可以利用这一点作为定位规则来动态的将其注入到全局。
注:如果加密函数的函数签名和函数位置会动态的发生变化,则加密的 JS 可能有几种模版,可以针对每个模版定义不同的规则来定位加密函数的位置,也可以根据多个模版定义相同的规则定位加密函数的位置。
关于加密函数的定位规则,对于简单一些的,可以使用正则表达式,也可以直接使用字符串替换,对于复杂的加密函数,可以考虑使用 AST 对语法树进行分析后找到加密函数再动态的注入暴露到全局的代码。
总而言之一句话,就是要先找到加密函数的所在位置的规律,然后针对性的进行注入。
找到加密函数所在位置后,下面进行代码动态注入,如何注入代码使其暴露到全局大家应该都知道了吧,没错就是将其赋值给 window
对象。
使用前面文章中间人的妙用:自动反混淆 JS 代码并移除反调试代码中学到的脚本技巧,可以在返回的时候自动添加全局注入代码,例如在这里添加一行赋值语句,将 V 函数赋值给 window 对象,即可在全局调用 V 函数实现加密。
可以看到,V 函数现在已经可以找到了,并且也可以正常调用。至于后面的 JSRPC 自动注入,大家可以参考前面的文章:不用油猴拓展也能自动注入JSRPC脚本?
总结
以上就是自动化将加密函数暴露到全局的方法,使用哪些工具并不重要,重要的是思路,其次是实现思路的方案。对于暴露加密函数到全局,其实主要需要解决的问题就是如何实现:手动找到加密函数并暴露到全局 -> 自动找到加密函数并暴露到全局这个需求,需求有了只需要借用工具来实现就好了。
本文章首发于个人博客 LLLibra146’s blog
本文作者:LLLibra146
更多文章请关注公众号 (LLLibra146):
版权声明:本博客所有文章除特别声明外,均采用 © BY-NC-ND 许可协议。非商用转载请注明出处!严禁商业转载!