某局jsvmp算法分析(二)

jsvmp 分析

1.什么是vmp

VMP(Virtual Machine Protection)是一种软件保护技术,用于保护应用程序或软件的代码免受逆向工程、修改和盗版等威胁。VMP通过在程序中引入虚拟机(Virtual Machine)的概念,将原始的机器码转换为虚拟指令集,并在虚拟机中执行这些指令。VMP的核心思想是将原始的可执行代码转换为一种只能在虚拟机环境中运行的形式,这样可以增加对代码的保护性。通过使用虚拟指令集,VMP使得对原始代码的静态分析和动态调试变得更加困难,因为攻击者无法直接理解和操作虚拟指令。

VMP通常会对程序进行以下操作:
1. 代码加密:VMP会对原始的机器码进行加密,以防止代码被简单地提取和分析。只有在虚拟机环境中进行解密后,才能运行加密的代码。
2. 虚拟指令集:VMP会将原始的机器码转换为虚拟指令集,这些指令集是一种与底层硬件和操作系统无关的抽象指令。虚拟指令集使得代码的执行逻辑更加复杂,难以进行逆向工程。
3. 控制流混淆:VMP会对代码中的控制流进行混淆,使得代码的执行流程变得难以理解。通过添加无用的控制流指令、条件分支和跳转,VMP增加了代码的复杂性,使得分析和修改代码变得更加困难。
4. 运行时检测:VMP会在程序运行时对代码进行检测,以防止代码被修改或篡改。如果检测到代码被修改,VMP可以采取相应的措施,如中断程序执行或清除关键数据。
VMP是一种常见的软件保护技术,被广泛应用于商业软件和游戏等领域,以保护知识产权和防止软件盗版。然而,VMP并非绝对安全,高级的逆向工程技术仍然可以绕过VMP的保护措施。因此,为了实现更高级的软件保护,通常需要采用多层次的保护策略和技术组合。(来自百度)

停了几天之后s局网站竟然更新了,虽然参数还是在jsvmp里但是参数却变了之前是los28199和Lzkqow23819,现在los28199不需要了变成了一个查询字符串后缀!!但是外层调用方法基本没变,还是之前的配方和味道,我这里还是继续jsvmp部分的分析(外层方法定位参考我之前的 '‘一.寻找调用方法’'篇)。
  1. 绕过无限debugger。如图1.1现在网站里加了反爬一打开调试工具就会被无限debugger住。这个时候不要慌,查看堆栈,看看能否找到什么线索。在这里插入图片描述

    ​ 1.1

    进到callFunction方法栈(图1.2)可以看出来是eval形式的无限debugger,这里通用方法是hook eval 如下

    eval_ = eval;
    eval = function (params) {
        if(params.includes('debugger')){
            console.log('1')
        }else{
            eval_(params);
        }
    };
    

    (https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C21785%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20240323224819632.png&pos_id=img-UBPtJY5a-1711208799717)

    ​ 1.2

    我这里没有hook eval ,我在 _0x36d0ec(…_0x26f468) 这个方法上一行加了一个判断,如果_0x1a50d1里有’eval’就直接return(1.3),我这个做法比较危险的,因为可能有其他的方法也是eval来执行的,这样就会被我过滤掉。但是我测试了这个网站这样写没问题。这样的话 无限debugger就过了,正片开始了。

    (https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C21785%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20240323225748059.png&pos_id=img-9pwf5Ewl-1711208799717)

​ 1.3

2.插桩分析

好,现在开始进入本文正题。怎么去还原算法呢?到这里我为什么不继续跟栈调试了呢?因为我吃过亏了,jsvmp如果是直接跟栈调试的话会非常的麻烦,在fetchAndExecute里有一个whlie循环,那里会根据ip op stack 进行很多次switch调用,可以在那里玩一年。为了节省时间,保护头发,这里选择了主流方式,日志分析!

插桩(Instrumentation)是一种软件技术,用于在程序执行期间向代码中插入额外的指令或代码片段,以收集信息、监视程序行为、修改程序逻辑或进行性能分析等目的。

插桩通常在应用程序的源代码或目标代码级别进行,可以通过静态插桩或动态插桩的方式实现。静态插桩是在编译时或链接时修改代码,而动态插桩是在运行时通过修改内存中的程序指令实现。

插桩技术可以用于多种用途,包括但不限于以下几个方面:

1. 监视和调试:插桩可以用于收集程序执行期间的运行时信息,如函数调用、变量值、异常处理等,以帮助调试和排除错误。
2. 性能分析:插桩可以用于收集程序的性能数据,如函数执行时间、内存使用情况等,以进行性能优化和瓶颈分析。
3. 安全检测:插桩可以用于在程序执行期间检测潜在的安全漏洞或恶意行为,如检查输入验证、访问控制等。
4. 动态修改程序行为:插桩可以用于在程序执行期间动态修改程序的行为,如替换函数调用、修改参数值等,以实现特定的功能或修复bug。

插桩技术在软件开发、测试、分析和安全等领域都有广泛的应用。它提供了一种灵活和强大的手段,可以对程序进行深入的观察和干预,帮助开发人员和研究人员更好地理解和改进软件系统。

对每一个插桩不现实,所以插桩的关键是找准位置插桩
  1. 知道什么插桩了,就需要选择合适的插桩点(尽量多获取信息的位置)。上面图1.2提到的callFunction里的_0x36d0ec(…_0x26f468)可以先打个日志看看有多少方法从那走(debugger都从那走,说明信息应该不少) 如图2.1。

    (https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C21785%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20240323230716722.png&pos_id=img-qPVCXsC7-1711208799717)

    ​ 2.1

    当我们这样插桩完以后会发现控制台什么输出也没有,不用怀疑你的代码了,其实只是因为console被网站hook了,你用console打印的东西都是看不到的。解决方法很简单,我们在它hook console之前自己先备份一个console就可以了。直接在js顶部把console导出备份一个。如图(2.2)

    在这里插入图片描述
    ​ 2.2

    ok,现在是正常打印了,但是怎么一直打印 3592428 和一个方法呢 如图(2.3)。分析一下,这里就是一个定时器函数100毫秒就会执行一次,经过测试,这个方法可以过滤掉。

    (https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C21785%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20240323231848507.png&pos_id=img-bAGNwcoM-1711208799718)

​ 2.3

按照我上面1.3 过滤 eval的方式把 定时器函数给过滤掉。如图(2.4)接下来打印的就比较干净了

在这里插入图片描述

​ 2.4

接下来的参数就能看出很多东西了,这里可以定位出调用的方法,然后追进去调用方法,在那里继续插桩,就能拿到完整的日志信息了。如图(2.5)

在这里插入图片描述

​ 2.5

把关键方法都插桩之后,拿到的日志就可以完整的还原算法了

在这里插入图片描述

​ 2.6

3.结果验证

结果验证参数可用,并发也还行(过程很曲折,为了解决dump_data和stringstable)

在这里插入图片描述

最后还是强调,这里只是为了学习算法,侵权联删。
  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值