本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!若有侵权,请联系公众号【逆不逆】删除。本来想水一期ks的__NS_hxfalcon,然后看到某书的xs更新到了4.3.1,那就先水一期xs吧。根据惯例,依旧是在window.mnsv2对应的vmp的for循环的第一个else进行断点
依旧是从后往前看日志,可以看到现在的数组变成了144位,之前4.2.6是124位,4.2.9是135位
144位数组由124位 + 20位组成,而20位的数组由4位 + 16位组成,这个4位数组其实就是 len('a3') + 'a3' + 后面那段数组的长度16。
跟之前一样,这个16位数组是由另一个数组异或124位数组中用到的随机数的第一个字节得到的
然后就是继续往山找这个215开头的16位数组生成的位置。
可以看到一个24位数组,然后是一个_0xfca8c3方法,然后就出现了16位数组,那么大概率这个16位数组就是有_0xfca8c3方法生成的,入参很可能就是这个24位数组
24位数组的来源,跟之前4.2.9一样,时间戳 + md5(api)
那么我们进入_0xfca8c3方法,没错,又是一个vmp,继续根据惯例在这个巨大的for循环里打上断点(ps: 当你的断点没生效时,可能是此时的vmp已经变了,根据日志重新进入新的vmp中)。
我们继续看日志,跟过之前md5的方案的同学应该不陌生,将一个无符号整数变成4个字节,同理可以找到另外3个无符号整数。
继续往上看日志我们可以发现,跟之前的md5方案有很大区别,没看到之前的SV那些64位的数组,而且运算步骤也不是很明确,不过"IV"还是能看到的。
另外build_block也能看到,我们将24字节的输入传入md5的build_block,得到一个6位或者8位数组
回复或点赞可查看完整内容
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-289940.htm
[原创]【JS逆向】某书x-s 4.3.1 mns0301 分析
455 浏览
7 回复
up
大佬威武!
膜拜大佬
大佬威武!
大佬好,其实没有必要ast,xhs的ob混淆有相同的形式,找到stack和栈顶指针,然后拼接并搜索对这个变量进行赋值的位置,观察是否包含运算符,如果包含就进行插桩,不包含就跳过。这样就可以跳过ast还原,直接开始分析日志了,而且有了日志之后也不用和vmp进行纠缠。
不过这个方法的难点在于如何识别apply,我在这一步只能依靠AI,2333
不过如果非得想个办法的话,其实也能解
因为我们观察apply存在于开头的一个很长的字符串数组
然后下面存在一个自执行函数
我们可以剥离出这两个单独执行获取apply所在的真实index
然后转16进制之后到vmp里面进行搜索,搜索格式为解密函数(index),这样就能找到apply的位置了
再往下深究,一般vmp apply处会进行判定,究竟是js自带的函数还是vmp的虚拟函数,这也是一个识别的点位(但是我感觉很难,我识别不出来)
PS:感谢大佬,我一开始分析的时候AST还原了外层ob,然后跟到这儿发现又有一个ob,瞬间不想分析了,得亏看了您的文章,发现不用解混淆也能直接分析,才又有了信心哈哈哈哈,不过归根结底还是我对vmp和ob不熟练
最后于 2026-3-19 16:18
被利叶增辉编辑
,原因:
不过这个方法的难点在于如何识别apply,我在这一步只能依靠AI,2333
不过如果非得想个办法的话,其实也能解
因为我们观察apply存在于开头的一个很长的字符串数组
然后下面存在一个自执行函数
我们可以剥离出这两个单独执行获取apply所在的真实index
然后转16进制之后到vmp里面进行搜索,搜索格式为解密函数(index),这样就能找到apply的位置了
再往下深究,一般vmp apply处会进行判定,究竟是js自带的函数还是vmp的虚拟函数,这也是一个识别的点位(但是我感觉很难,我识别不出来)
PS:感谢大佬,我一开始分析的时候AST还原了外层ob,然后跟到这儿发现又有一个ob,瞬间不想分析了,得亏看了您的文章,发现不用解混淆也能直接分析,才又有了信心哈哈哈哈,不过归根结底还是我对vmp和ob不熟练
最后于 2026-3-19 16:18
被利叶增辉编辑
,原因:
感谢分享,认真学习。
学习!!!