Table of Contents:
  1. 纯算逆向:rs-reverse版本更新v1.6.0
    1. 1. 增加多版本控制
      1. 2. 增加其它瑞数网站适配
        1. 3. 动态执行逻辑重构

        纯算逆向:rs-reverse版本更新v1.6.0

        Reading Time:The full text has 1387 words, estimated reading time: 7 minutes
        Creation Date:2024-03-29
        Article Tags:
         
        BEGIN

        rs-reverse介绍: 瑞数vmp网站完全算法逆向,提供npm包及命令方式调用,功能包括动态代码还原、加密cookie生成等

        同时推荐使用作者新开源补环境框架:sdenv

        https://github.com/pysunday/rs-reverse 🔗

        此次作者对rs-reverse项目进行部分代码逻辑重构,修复网站更新的-u参数命令执行报错,主要功能修改及新增如下:

        1. 增加多版本控制;
        2. 增加其它瑞数网站适配;
        3. 动态执行逻辑重构。

        1. 增加多版本控制

          随着3月22日商标网更新,带来的是cp值文本、r2mka文本等关键文本的改变,直接导致旧版本rs-reverse运行失败并报错,因此作者找到版本差异化部分,并通过版本控制实现多版本管理与运行,这也是本次更新的最主要部分,希望此次版本架构能在下次瑞数更新后能快速实现适配!

          新增目录./src/config/用于存放更新差异化内容,如keynameNum、offsetConst、immucfg等。

        • keynameNum:用于控制变量生成数量,即$_ts.cp[1]的数组长度,在固定版本周期下值是固定的也是写死的,提取方式:找到主js文件搜索\n\n\n\n后在该文本不远处即可以找到,可以看实例截图中的数字806和829
        • offsetConst:在获取解密用偏移值数组时,有三个常量数字3、51、153,会在偏移值生成过程中使用,由于偏移值数组的值的产生过程不涉及复杂交互,同时对外部环境依赖较小(即该任务及子任务调用对外部仅用到cp2数组和前面提的3位数字常量),因此在rs-reverse项目中使用动态运行任务的方式直接生成。我们虽然知道常量值是不变的,但是获取该常量的对象键却是动态生成的且不好逆向过程,因此通过写死在版本中实现,之后可以在运行makecookie命令时将日志等级调整为trace后查看日志及报错获取下标,对应写到offsetConst配置中即可
        • immucfg:顾名思义即为不可变量配置,里面包含从网站中提取的cp0、cp2等值,该配置来源分两种情况,其一是-u命令从网站动态提取,其二是本地运行时从config目录下同名json文件中提取,同时这个json文件也是可以通过makecode -u远程方式执行命令后自动生成的,即./output/makecode_input_immucfg.json文件

        2. 增加其它瑞数网站适配

          其他网站适配是rs-reverse项目设计之初就考虑进去的,在开发过程中发现,生成并运行动态代码的那个主js文件代码逻辑不会变,而生成的动态代码是会变的,如执行任务的循环判断条件数量,而控制动态代码生成变量就仅仅是4个字符串,我们只要提取到每个网站的这4个字符串,再模拟主js文件解析这4个字符串就可以获得所有我们需要的,如任务树、cp2数组等。

          因此适配新网站只需在./src/adapt/目录下新建适配目录,同时该目录下的每一个子目录代表一个网站,只要找到该网站的主js文件内的可以定位这4个字符串的字符子串,如商标网和瑞数官网的适配(其中瑞数官网配置中还存在version字段,表示指定版本,即上一代版本适用于瑞数官网):

          配置好后程序就可以自动识别并运行了,如瑞数官网运行生成cookie代码:

        3. 动态执行逻辑重构

          本来逆向就是为了还原代码执行的运算过程,有些算法是比较好逆向的,如斐波那契、阶乘等可以深广递调用的,但是某些纯粹计算的,且功能逻辑又很独立的,逆向过程就会让人很难受,因此考虑到通过动态代码执行的方式返回执行结果,在上一版本中rs-reverse是直接将循环代码扣下来放在文件中控制运行,但是新版本发现循环代码的判断条件不是固定的,因此做了一些调整,大家可以研究研究是否可以发散一下思维,我们知道瑞数的循环是在任务下执行的,而任务树中每个任务都有他自己的代码逻辑,比如任务0>one>21-23就是将数字取绝对值再模8返回,理解任务树的调用逻辑那么循环就会变得不那么复杂。具体可以看动态代码执行文件./src/handler/parser/common/dynamicExec.js中的改动。

          除了以上3点改动外还有将gv.cp2的取值替换为固定值(因为作者发现,不同版本下gv.cp2的动态取值返回的都是相同值)、生成cookie增加屏幕参数删除网络状态参数(应该是为了保持返回的cookie长度为236位吧)等,具体可以看git日志,至于命令使用和原先没有区别,需要注意-u非商标局网站需要加上-a参数(适配的网站可以看项目readme尾部表格)。

          使用过程中有任何问题欢迎提issues!

        FINISH

        Random Articles
        Life Countdown
        default