时过境迁,毕业多年后掌握了一些c++技术,虽然现在从事的移动安全的工作,但是看到js对抗比以往那么激烈,突发奇想为什么不能自己封装个魔改的v8引擎让其他开发者朋友使用呢,于是bestV8应运而生。
一.以往js调试工具的局限
在很多年前js逆向应用于黑产之间,搞券、搞话费、冲q币,在著名的易语言论坛精易论坛有很多的相关需求,虽然当时作为一个刚学完c语言的新兵蛋子,看到技术竟然可以这么搞的时候也觉得不可思议,其中用的比较多的就是鬼鬼调试工具,但是只是会调用的工具侠,只知道放进去然后传入我想要调用的函数就可以得出代码揭秘的结果,那到底是底层如何做的呢,在年少时埋下兴趣的种子终于在今天生根发芽。
但是经过了几年的发展,老的技术总会迭代新的技术,但是我们更应该铭记为技术成长铺路的前辈们。
2023年的现在,各种js奇淫技巧层出不穷,有补环境的、有的是用浏览器插桩的纯逆算法的、jsrpc的,其实只要拿到想要的加密值,哪种方法都是可以的,条条大路通罗马。
本章文章讲的是bestv8,自然侧重于补环境,我们举一个例子看下鬼鬼调试工具的局限性,正常的浏览器环境应该是有全局变量window的,但是在调试工具中报了错误。
可能这时有朋友说了,var window = {};不就可以了,我以往也是那么认为的,随着对v8引擎c++代码的了解与学习,其实window全局对象绝不是仅仅定义了就可以了,因为它代表着全局变量,例如在浏览器中,你可以直接使用下方JSON.stringfy来打印
如果按照上面的我们单独var一个对象其实是不太能够拥有一些全局变量的方法的,其实这一类的点都是由于只是单独封装了v8引擎进行了调用,但是没有对其中的源码进行魔改。
从另一点,这个跑通了,只能适应在易语言上,但是现在市面上的代码调用包含python、go、java、c语言,这已经挺单一了,另一点,只能在windows上进行使用,比较有局限性。
二.node补环境
我们先讨论nodev8为什么可以跑起来补环境的代码,归根结底是底层封装了v8引擎,相当于在底层的范围之上又扩展了一些内容例如module的导入和导出,增加了一些node的特色功能,但是本身是有v8的参与的,所以能够运行一些js代码,更扩充了一些加密库,更方便于用到特定算法之后去使用。
现在大部分js逆向分析采用的是node来补环境,在上文我们提到,原始的鬼鬼调试工具存在其局限性,但是部分的局限性在node进行了解决。
例如:
①node实现的具有全局对象global,根据此全局对象,可以调用v8引擎的cotext,举个例子一般需要定义 var window =global;解决了纯正v8环境下无法解决的全局变量引入的问题,但是global 在chrome浏览器环境中是个不存在的东西,如果贸然这么操作,在一些复杂的代码中会检测到你是node环境,从而走不同的流程导致错误的加密结果,然后请教了一些朋友后,node存在一个略微干净的v8的环境,但是前提是引入vm2库再进行补环境,这样也解决了,但是在需求高并发要求下效率不是那么的高。
②node是可以在多平台进行开发的,补完一套环境的代码,可以同时在window、mac、linux下进行使用。
三、bestV8的诞生
既然node已经那么厉害了,为什么还要魔改一个v8呢?
从个人感受有这几点,第一个点node的v8是固定死的,就是只能在js层改,如果我们能动c++层那么可以得到更大的扩展,这个在下文中可以看到我所实现的。
第二个点:node在跑js的时候有些监测点会被检测到,会破坏影响代码的流程执行,还需要花费巨量时间去看,不太通用,如果我们单独编译一份纯净的v8,然后在其代码封装上尽量像chrome环境靠拢,那么自然是不同的。
第三个点:纯净的v8,封装的代码量少,专门为了跑js而跑js的,由于本身就是c++写的速度极快。
第四个点:灵活方便定制,v8引擎的代码想怎么改就怎么改。
为什么叫bestV8,源于本身开发者想把他做成心中最好的v8环境调试工具,让他更多的能跑在使用者的机器上。
四、bestV8目前可以干什么
目前可以在dy signature,x-bogus;ks sig3;vdata;xhs x-s x-t;mt mtsig上进行补环境调用(小小白、coderL两位大佬进行bestV8的测试)
目前可以做到某音sinature环境的调用(当然也得补)
征求了下漁滒的同意,把bestV8跑某音下图放上来了
在瑞shu的测试是由k哥爬虫完成的
bestV8初版环境让五月大佬测试了下
逆向和爬虫的故事公众号作者TheWeiJun进行的某安网测试
爬虫黑科技公众号作者提供的dy,xb算法测验
看到这里其实读者还不知道BestV8有什么特性,目前BestV8就像一个四岁的小孩,虽然能跑,具有了一些思维,但是还需要后面逐渐成长。
第一点bestv8内置print函数进行函数的打印(让你脱离console.log())
第二点 window对象直接包含v8的context上下文对象 可以直接用window.JSON.stringfy,window.parseInt等函数,但是像atob,btoa这些浏览器特有的函数并没有,因为现在bestV8除了window对象些许魔改外,就像一张白纸一样
第三点 bestV8在架构上引入函数bestv8import
假如你补了一个非常复杂的某里一个环境、或者是某卡迈的一个环境,包含AudioContext接口、Document、Navigator、Screen,如果代码在一个js里面写,随着补环境的多会引起难以维护。
举个例子
目前的情况是
main.js
bestv8import("AudioContext.js");
bestv8import("Document.js")
bestv8import("Navigator.js")
bestv8import("Screen.js")
result
AudioContext.js
var audioContext = "helloword";
print("audioContext")
Document.js
var document = 888;
console.log(window);
print("Document");
Navigator.js
var navigator = "我是c";
print(navigator)
print("Navigator")
Screen.js
var screen = "我是d";
print(window);
print("Screen");
var result ="bestv8 666~"
result
我们可以看到输出的结果
相当于main.js是我们的主逻辑,我们可以从其他js文件中直接能引进其js代码,相当于填充到main.js一样,这样我们可以让补的代码更加的优美。
上文中我们是main.js去获得其他js的内容,现在有一个疑问能不能main.js引入AudioContext.js ,然后AudioContext.js引入Document.js ......无限套娃呢?
答案是支持的 有兴趣的可以尝试。
第四点 异常机制的引入
还是第三点的代码 如果我们在某个js里面出现了错误
这个时候会显示出错误在那个文件并定位行数及其打印堆栈信息,方便我们排查错误
感谢国哥在mac M1系统下运行一千万次js得出的对于内存变动的图
作者本人进行了在scrapy和多线程、协程方面的测试,均可高速运行。
五、总结与下载使用
bestV8目前对于补环境来说已经够用了,但是纯净是它的优点,但是过于纯净也是它的缺点,目前这款工具的维护由BestToYou牵头、duoduo、crawl19联合开发,我们希望您熟练使用c++,懂得v8引擎的工作原理,可以加入共同开发它,当然这肯定没有报酬的,但是你能学到很多有意思的相关知识,如果你愿意学习知识,愿意为爱发光、愿意为了bestV8跑成功某个高难度js代码而激动,扫码下方二维码加入bestV8共同开发,如果在使用过程中遇到bug请扫下方二维码向我反馈。
todo:
完善bestV8环境补充,抗检测能力【长期】。
优化bestV8c++调用部分代码,拆分api让其他语言调用,让其更快。
增加devtool调试协议,让自己的js代码可以对接bestV8在chrome调试【未来】。
下载使用:
目前bestV8进行了跨平台编译,目前支持
window x64;linux x64 ;mac intel;mac m;linux x64
有更新了就会编译发到下面的git上:
https://github.com/BestToYou/bestV8_release
原文始发于微信公众号(二进制科学):逆向神器bestV8发布,让瑞shu、mt、ks、xhs、dy无处遁形
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论