[ldvmp-js分析] 天天学习 但是也需要活动身体哦

[ldvmp-js分析] 天天学习 但是也需要活动身体哦

一、为什么要使用AST

最近在学习 AST 做点案例 嘻嘻 主要是补环境没过Akamai 不能并发 每次过段时间就是-1 老火 
最后还是通过了AST还原 做成了纯算 才过去 哎

二、纯算法vs补环境

纯算过的话调用起来速度快 但是需要调js耗时太久了 对一些严重的混淆脑壳疼 最重要就是可以无视环境检测 
补环境过的话 要过检测就相当于写一个浏览器了 而且需要通杀的 那么你就要考虑了(环境代码4——8w 案例代码 7k-2w) 可想而知代码会多么的膨胀 
但是过一些小中的案例 用补环境那真就是上帝视角

三、本次的主题

这次记录下一个案例 主要是学习噢噢噢噢噢噢噢噢 
零点大佬vmp 喵喵vmp 检测版 我在这里只给方案 不提供还原代码 自己分析才有提升哦 网站

四、方向

这里面找算法不怎么难 但是你想要了解里面的原理还是很困难的 
直接找算法原文 有个技巧 在所有的new的地方法下断点 会发现surprise 嘻嘻嘻

五、直接冲锋

使用AST工具

第一步 还原形参、函数名、变量名 还原后好分析 from: 

 to: 

第二步 还原三元运算符、字符串乱码还原 其实还可以还原更多的我就没处理了 还原是为了后面的转化 from: 

 to: 

第三步 还原所有if流程 用AST做成switch 这一步是最难的 (其实来说简单也简单 看你怎么写了)需要注意点因为里面有 --f f-- ++f f++ f 这个也需要把他记录 例如进入是5 到了关键点后变成了6 那么就是用到了
还原后是这样子的 我是之间按顺序从0到1119记录了

 第四步 调试案例源码找出流程 浏览器使用firefox 是因为发现chrome和edge格式化是真的一塌糊涂
注意点:在浏览器调试时格式化是不会被检查的

chrome浏览器 

edge浏览器 

firefox浏览器 

这里最好把源码保存到下来调试 保存方法右键网页后 选择点击查看网页源代码 
1来不要给作者的服务器增加负担 
2来自己可以观察 
3最重要点 保存的后 不要格式哦不要动主js里面内容 应该会有检测

过下debugger 这里没做什么检测开启开发者选项 直接设置成false 有两处 这个debugger就只是经过了下 

直接在while(1)下一行 下断点就可以了记录关键的变量名里面的存参 设置一个条件断点或者日志断点都可以 保存记录流程 挺多的流程 

第五步 用的第三步的记录 对应流程取出来就可以了 我在这里面也写了注释 开始 => 终点 然后到这里就AST还原成功啦

第六步 可以看到作者已经告诉了是sha1算法 sha1算法 不就是填充 初始化缓冲区 80轮....

首先需要了解vmp逻辑 基本都是在 push pop unshift 都是在这上面做了处理

那么我们可以先定位下 unshift 可以看到有160次 这可能是因为vmp混淆后的缘故 

 然后可以看到 我们需要知道sha1 80轮运算 都会使用初始化缓冲区,并对它们进行更新 那么这个图里面的FuncD1_22这个就是关键点了 FuncD1_22_["unshift"]; 
搜索 FuncD1_22_ = 可以发现了一处 首先是声明了FuncD1_51_空数组
然后把里面都赋值了然后后面FuncD1_22_又做了一层处理 这可能是因为vmp混淆后的缘故 

看我的图来 第一个 FuncD1_51_[0] = (FuncD1_0_ = 61) + 1732584132; 
这个FuncD1_0_的意思就是 case 729: 
FuncD1_0_=729 1732584193 = 61 + 1732584132 这就是初始化缓冲区第一个数 这是10进制的 换成16进制就是0x67452301 
最后成了 [1732584193, -271733879, -1732584194, 271733878, -1009589776] 初始化缓冲区

初始化缓冲区前 一般都是 512 位(即 64 字节)的消息块进行处理 而每个块又被分为 16 个 32 位字。
getUint32 恰好可以用于将消息块中的字节转换为 32 位整数 我寻找后发现了 

// 解码方法 mybuffer 这个赋值换成源代码上面的变量就可以了
mybuffer = ءࢭ;  
myview = new DataView(mybuffer);
asciiString = '';
for (let i = 0; i < mybuffer.byteLength; i++) {
    let byteValue = myview.getUint8(i);
	if (byteValue !== 0) {
		asciiString += String.fromCharCode(byteValue);
	}else{
		asciiString += 0
	}
}
console.log(asciiString);

最终得出了这些 专业版按照检测版一样还原也可以的实现 
surprise 是原文 后面都是盐(不是在菜上面加的盐

检测版 surprise@Mozilla5+FCPO1zDQ 
专业版 surprise@Mozilla5*D;Y\'lHO

检测版 

 专业版 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值