如何使用AST还原某音的jsvmp

查看 169|回复 10
作者:sergiojune   
1. 什么是JSVMP
vmp简单来说就是将一些高级语言的代码通过自己实现的编译器进行编译得到字节码,这样就可以更有效的保护原有代码,而jsvmp自然就是对JS代码的编译保护,具体的可以看看H5应用加固防破解-JS虚拟机保护方案。
如何区分是不是jsvmp?看代码里面有没有很长的一串字符串或者是数组,并且代码里面没有具体的逻辑,还有就是有一个循环不断地在跑,里面的就是一些指令,比如x乎,x音,x讯滑块等等都是jsvmp,也都是基于堆栈的栈式虚拟机实现的。
这是某乎的:

这是某音的,还原了一些算术混淆、三目运算和if else控制流混淆的:


这是某讯滑块的:

2. 如何去还原JSVMP
[ol]

  • 调试vmp代码,分析循环代码里面每个操作数对应的代码的意义

  • 修改源代码中的vmp解释器,添加AST的对应代码

  • 运行代码,生成最终代码。
    [/ol]

    3. 分析具体网站
    样品网站:aHR0cHM6Ly90cmVuZGluc2lnaHQub2NlYW5lbmdpbmUuY29tL2FyaXRobWV0aWMtaW5kZXgvYW5hbHlzaXM/a2V5d29yZD0lRTklODAlODYlRTUlOTAlOTEmc291cmNlPW9jZWFuZW5naW5lJmFwcE5hbWU9YXdlbWU=
    这个网站要找的是X-Bogus_signature这两个参数的生成,怎么定位的这里不说了,
    很容易就可以看到这个函数就是在通过操作码去运行逻辑

    所以我们要分析下这个函数,看到有算术混淆和一些逗号混淆,不方便调试,可以使用AST写个逻辑去掉 这个很简单,还原效果如下:

    可以看到,逻辑清晰了很多,但是因为是if else混淆,里面还有一些中间变量,如果调试的话会需要点击多几次才能到目标语句,所以我们可以考虑将这个if else转换为switch语句,这样调试的时候直接一步到位。

    上图可以看到每次都从操作码中读取两个字符,并且是十六进制的,所以_0x1383c7这个变量的范围就是0-255,这样switch的条件就有了,可以编写代码从0迭代到255,就可以得到每个指令对应的代码了。最后还原结果如下:

    可以看到逻辑很清晰了,但是有个问题是0-255的case里面有些是重复的,需要删除,可以继续使用AST,在每个case的第一行插入june.push(case_num),如这样:

    然后映射文件到网站上,运行一次,获取june数组里面的值,保存到代码里,继续编写AST代码,读取case条件值,将不在数组中存在的case值全部删除掉,最后就可以愉快地分析了!
    通过调试分析出,该函数的每个参数意义如下:
    [table]
    [tr]
    参数[/td]
    [td]意义[/td]
    [/tr]
    [tr]
    [td]_0x307ee4

    代码, 这是

  • blue2022   

    之前插桩分析dy的x-bogus过程,实在太耗精力了。就想着能不能通过AST还原jsvmp,没想到大佬就出了
    ranlele   

    学到了,大佬牛逼。
    ningmng   

    感谢大佬分享学习
    pjy612   

    厉害了,感谢分享... 门槛感觉越来越高了...
    flflag   

    感谢分享...
    StriveMario   

    6的啊...
    YanyeCocomi   

    好强 学习了
    坂本版本   

    牛批啊 虽然我现在都是rpc
    jjghaa1234   

    大佬,感谢分享,真是费心了
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部