好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 shanjzhu 于 2025-11-17 21:07 编辑
注:本文章仅学习交流,侵权请联系删除
JSVMP是个啥就不介绍了。今天我们讲的是比较笼统的JSVMP,即包含控制流
在JSVMP中有几个核心概念
1:栈,或者寄存器?通常在代码中的表示形式为数组或者其他什么临时变量
2:指令。在代码中表示形式为数字
控制流,也就是switch
JSVMP是个啥就不介绍了。今天我们讲的是比较笼统的JSVMP,即包含控制流
在JSVMP中有几个核心概念
1:栈,或者寄存器?保存变量的地方,通常在代码中的表示形式为数组或者其他什么临时变量
2:指令。代码怎么运行就是靠他,单个指令在代码中表示形式为数字
控制流,也就是switch/case。他是通过指定值跳转到不同分支
注意,重点来了!!!
JSVMP在我们所见到的代码形式中目前主要是两种。一种就是控制流、另一种就是if/else if,当然还有三目运算或者嵌套三目。而从这里就能得到switch和if的控制条件就是指令,所以一种方法就是直接打印所有指令,通过指令反查结果
而另一种就是他的栈或者寄存器了,前面已经说了栈是一个数组或者其他的临时变量
临时变量先不管,我们先来分析数组,在JS中直接打印数组是不可行的,所以我们需要使用JSON.stringify对他进行格式化输出,但是!!!对于一些环境值以及一些特殊对象使用格式化是会报错的,导致无法正常打印出数据,所以你可以找AI要一份JSON避免报错的代码
通常是两种方法搭配使用,以及加上hook
我们先来讲一下最简单的JSVMP怎么纯算
最简单的JSVMP
1
像这种只有call或者 apply的vmp是最简单的,我们只需要在他的call或者apply出打上日志断点就能知道他的加密在哪个地方
2
接下来就是第二种情况,再进入加密流程前打上输出指令代码
我们在开头打上输出判断条件的值
3
然后再在出口打上断点,这里的出口不一定是函数出口,也可以是其他地方
4
接下来等他打印就好了。。。。。
5
这里我直接找t等于30会在哪个分支,当然你要不想分析也可以直接丢给AI。这里AI给出的结果在这里,我直接打上一个断点刷新
6
忘记说了,因为我们不清楚这个t=30会出现多少次,所以我们先将日志保存到本地,或者也可以打其他的判断条件减少日志的输出
7
这里我们可以看到t=30出现了九千多次,就在他第9520次打下断点,这里建议再添加一个新的断点或者打阶段性的断点,以保证开发者工具不会崩溃
8
到最后我们就可以看到他的结果已经出来了,(其实还并没有完全出来)
9
通过以上流程我们就可以看到最终的值是存在与v中,所以这个v就是前面的栈。所以你也可以分阶段的打印这个v,然后分析。当有莫名奇妙出现的数组或者其他值时可以先多打印几次日志看是否固定,如果不是就需要打特定的条件断点去看。
好了,目前的JSVMP都可以通过以上的方式解出来。但是这并不是最难的,最难的反而是找到加密位置,作者本人对于异步并没有什么好的解决方法,所以只能单步跟栈。以及分析所需要的时间是很长的,不过逆向嘛,就是要有耐心
国内另一个嵌套多层switch就需要多打印几个指令
OK,今天的分享就到这里了,如果各位佬还有什么不明白的或者指导意见可以在评论区留言
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|
|