腾讯这次还是挺狠的,直接把栈式虚拟机更新成寄存器式虚拟机了,并且将原先的60多条指令膨胀到80多条。栈式虚拟机的指令集通常较为简单,指令操作主要围绕栈进行,由于栈式虚拟机的广泛使用,现有的资料对栈式虚拟机的支持较为成熟。而相比于栈式虚拟机,寄存器式虚拟机的指令集复杂,我们需要处理更多的指令类型和寄存器操作,不过对于web虚拟机来说,其功能本质仍旧是对js内存空间的访问。两个月前才刚刚完成了旧vmp逆向,这下直接在风中凌乱……好吧,那只能我们继续重新分析了我们的目标实现反编译器,通过传入原始jsvmp程序,生成汇编最后生成js代码并保证运行逻辑一致//将 类似"JgQCFhoEBBZEHgASPkQEZp/4A4PzAg=="的jsvmp程序 还原成下方的js代码 locals[11] = "__lastWatirConfirm"虚拟机入口vmp部分共计800行,腾讯的vmp样例还是比较清晰的,整段代码没有太多无用的混淆,而仅仅用了一个朴实无华的vm我们将短的函数进行一下折叠,查看一下代码结构,可以看到整个vm由一个大的控制流和一些函数组成,向下寻
提示:右下角可以点击查看目录流程分析我们之前在 cloudflare逆向(3)js请求 中分析了他的请求流程,在js加密流程中,主要分为这四步:预处理:在第一个页面的script标签中进行初始化,主要围绕window._cf_chl_opt进行,并加载初始的反爬脚本第二步:向 /cdn-cgi/jsch/v1?ray=::rayId:: 发送初始GET请求,获取经动态混淆的加密脚本第三步:获取另一个post请求的加密内容,并加载进当前页面进行环境检测通过生成的md、r、sh等参数,获取获取5s盾的cookie,最后可携带cookie请求真实网页第一个预处理js,可从script标签中提取出来,(function(){...})();表示立即执行该匿名函数,仅做一些初始化工作,因此不需要过多解读(function() { window._cf_chl_opt = { cvId: '3', cZone: "paoluz.link", cType: 'non-interactive
拟合法一般我们在生成轨迹时,都是通过曲线函数,因此可以通过分析轨迹的特征来实现。生成的轨迹通常具有以下特征:平滑性:轨迹通常非常平滑,没有明显的抖动或不规则性。速度一致性:轨迹速度变化较为平滑,没有突然的加速或减速。曲率变化:轨迹曲率变化较为平滑,没有突然的转折。因此我们可以利用数学思想,如果验证程序在区间极值点里面拟合求导,发现二阶或者三阶导为0的话,贝塞尔曲线也会失灵,验证程序还可以不断提高贝塞尔的阶数import numpy as np from scipy.signal import savgol_filter import matplotlib.pyplot as plt def detect_fake_mouse_trajectory(x, y): # 计算速度 dx = np.diff(x) dy = np.diff(y) speed = np.sqrt(dx**2 + dy**2) # 使用Savitzky-Golay滤波器平滑速度 smoothed_speed = savgol_filter(speed, w
目标站点:aHR0cHM6Ly93d3cubXBzLmdvdi5jbi9pbmRleC5odG1s混淆样本可以通过扣代码或补环境的方式执行,本文不采用上述方案,只分享ast反混淆思路,供安全行业分析学习还原效果本次混淆样例为经典的ob变种混淆,在请求网站时,会随机返回三种加密算法,通过babel的ast分析功能,我们可以动态的获取到反混淆后的js,原本样本1500行代码在反混淆后还原为76行,代码量减少了95%,还原了纯算算法初步分析打开某目标网站,发现加密参数寻找一下具体的加密参数位置,将混淆代码dump下来,放入ide进行分析,可以看到,代码大致由5部分组成大数组:用于字符串加密混淆自执行函数:用于将加密数组进行解密hash函数:用途非常明显,用于获取hash值其他函数:用于具体加密逻辑主函数入口go:用于执行传入的内容,并和浏览器api进行交互这种字符串大数组+混淆的思路,基本上可以确定是ob混淆变种,我们反混淆的思路也很明确:获取解密后的字符串,回填常量,解除花指令混淆,删除死代码,最后还原整个流程字符串解密分析代码结构从他的主函数go进入,可以发现首先声明了一个 _0x41e
ast预反混淆以抖音为例,首先获取webmsdk.js,可以看到大约一共9600行,这为我们的逆向分析工作增添了不少难度,因此我们的首要工作是将代码反混淆后再进行分析通过ast解混淆处理后,代码量削去了一半,并且大部分字符串也被还原,这一步为基础内容,不进行详细讲解补上缺失的环境处理一下canvas指纹,注意,canvas指纹是和硬件关联的,通过海量的收集真实设备从而达到判断哪些设备是伪造的。一般情况下随机生成一个也是能生产参数的,但是不一定能够通过服务器校验。而抖音这里在服务端没有做校验,我们可以放心使用进一步处理,在解决掉环境参数和canvas后,导出我们需要的目标函数,实际上已经能够获取到我们所需的加密参数了为什么我们一定要先ast进行还原,然后补环境拿到参数呢,直接分析不好吗?因为这样生成的代码可以保证我们能够在各种环境中正常地生成参数,只有这样我们才能更好地利用ide的调试工具,如果使用浏览器的调试工具,那么会大大降低逆向效率。当然,如果你不想学习vmp反编译的话,到这里也可以结束了。借助ide对函数结构分析仔细观察一下,按照我们上文的理解,vmp在执行时一定会有大段的字节码
什么是jsvmp目前,主流的JavaScript代码保护措施主要包括精简、加密和混淆。这些方法的核心思想主要借鉴了传统的软件代码保护技术。然而,由于JavaScript是一种脚本语言,其在传输过程中以带有语法属性的文本源码形式存在,逆向分析比传统的编译后的二进制应用程序更加容易。再加上浏览器性能的提升和调试器功能的日益完善,这些保护方法难以提供有效的保护。jsvmp(JavaScript Virtual Machine Protection)是一种用于保护JavaScript代码的技术,类似于我们平常看到的代码混淆。但不同的是,它通过将JavaScript代码转换为一种虚拟机指令集来实现代码混淆和保护,具体的执行逻辑由vmp虚拟机来执行,这样可以防止代码被轻易地反编译和理解,从而提高代码的安全性。对于普通的javascript代码来说,执行逻辑是这样的:JavaScript代码 -> 词法分析/语法分析 -> 生成AST语法树 -> 生成js指令-> js引擎执行代码而对于经过vmp混淆后的代码,执行逻辑是这样的,中间多了这么一段:…… -> 生成AST
介绍CHIP-8 是一种解释型语言,设计之初就是为了编写简单的小游戏。我猜是作者嫌老机器的汇编语言太复杂繁琐,从而自己设计了一门汇编语言,并且摆脱硬件的束缚,在模拟器上运行。其实这个思想和 Java 等基于虚拟机的高级语言也是类似的,提供方便程序员编写的指令集,在硬件之上空架一层虚拟机,实现 “Write Once, Run Everywhere”。我们的目的是在python中实现一个chip8虚拟机CHIP8 虚拟机的结构和现代的计算机一样,虚拟起也有内存,CPU,寄存器等计算机的“基础零件”:Memory:CHIP-8 最多有 4096 字节的内存CHIP-8 解释器本身占用这些机器上的前 512 字节内存空间。因此,为原始系统编写的大多数程序都从内存位置 512 (0x200) 开始,并且不会访问位置 512 (0x200) 以下的任何内存。最上面的 256 个字节 (0xF00-0xFFF) 保留用于显示刷新,下面的 96 个字节 (0xEA0-0xEFF) 保留用于调用堆栈、内部使用和其他变量。Program Counter:16 位的 PC,记录当前程序指令运行的内存位置,
发现发件人在黑名单中,立即重置TCP链接from scapy.all import * send(IP(dst='1.2.3.4', ttl=9) / TCP(dport=25, flags='S', seq=0)) send(IP(dst='1.2.3.4', ttl=9) / TCP(dport=25, flags='A', seq=1)) send(IP(dst='1.2.3.4', ttl=9) / TCP(dport=25, flags='A', seq=1) / 'MAIL FROM: xiazai@upup.info\r\n') 看似普通的三个包其实暗藏玄机。首先,目标地址是1.2.3.4,这显然是我胡写的一个地址,而且ttl设置为9。所以这个包发出去就没有打算让最终的目标机器接到,而只是发给GFW看的。这个ttl值要大于你的机器到GFW的跳数,一般11是一个保险的值。然后要触发GFW的响应,有以下几个缺一不可的条件目标端口是25,我
poetry第一步:添加poetry插件poetry-plugin-pypi-mirror如果你使用的是poetry官方推荐的pipx方案安装的poetry:pipx inject poetry poetry-plugin-pypi-mirror 如果你使用的是pip安装的poetry,或直接使用官方提供的shell脚本(powershell/bash/zsh/fish)在系统中安装的poetrypoetry self add poetry-plugin-pypi-mirror 这样就将poetry全局源插件安装上了第二步:修改插件的默认源方法一:添加配置文件(⭐推荐)新建或修改配置文件config.tomlWindows系统: %APPDATA%\pypoetry\config.tomlLinux系统: ~/.config/pypoetry/config.tomlMac系统: ~/Library/Preferences/pypoetry/config.toml[plugins] [plugins.pypi_mirror] url = "https://mirrors.clo
要点解析访问 https://geetest.com/demo,可以看到很多的demo,这些模式混淆方式大多大差不差,因此这里我们选择最简单的滑块slide-bind模式来进行测试,这也是b站采用的方式(*现已更换为点选)验证码逆向和加速乐这类的waf参数逆向过程不一样,需要事先注意一下提交的参数是否为本地生成,不要一上来就直接到源码里搜参数,然后分析半天,最后发现参数在xhr的请求结果里。验证码一般在起始阶段,会获取一个被称为challenge的东西,这个一般就是网络请求返回的验证码题目标识,我们需要直接发送请求,先得到对应的数据,再去定位剩余加密参数。如图,这里的challenge和gt就是由之前的/register-slide得到的数据,因此我们在这里只需要重点关注w参数常用的查找加密参数的方式有搜索、跟栈、hook,我们该如何开始入手呢?这就不得不提到验证码有个特性了,目前遇到的大多数验证码都会利用jsonp来实现跨域请求,jsonp会携带请求参数请求接口,与普通的http请求不同的是,浏览器会自动拿返回的数据,执行指定的回调函数,因此我们可以通过直接hook jsonp的回调
dream
爬虫工程师,热衷于框架开发与逆向工程