经过该云网络验证客服允许的情况下,我们注册并购买了测试软件位,并将一个未加壳的exe可执行文件上传到了云端加密系统,接下来我对该验证的免费加密系统进行了简单的分析。

绕过某云网络验证思路分析插图

0x00 文件分析

加密类型

从该云端系统下载加密完毕后的程序后,发现文件的体积明显增大7倍左右。从官网的介绍上来看,虚拟引擎应该借鉴了VMP3.X,因为我的调试环境中,3.X以下的可以直接过滤掉。

绕过某云网络验证思路分析插图1
代码保护比较

PE信息

通过Exeinfo PE文件可以很清楚地看到该加密后程序的PE信息:

绕过某云网络验证思路分析插图2
文件PE信息
绕过某云网络验证思路分析插图3
区段信息

经过加密后,区段基本处于不可读阶段,所以我这里还是决定选择了ollydbg动态调试,希望能够通过运行查看是否能够解密.text.data区段

0x01 猜想验证方式

由于该验证使用了VMP,并且对于VM虚拟机和debugger都有检测,这让我想起了以前分析过的一款倒闭的验证:

当时这款验证也是使用了VMP,不过验证的地址是固定的,特征保持不变,并且在一般的验证上存在逻辑问题,可以在某Call处将eax直接置1,即可跳过无条件跳过验证,并且释放源文件。

我猜测此次验证所使用的方法也是大同小异,不过特征可能不会不同。

绕过某云网络验证思路分析插图4
劣质分析图

0x02 动态调试

配置好OD后,运行该验证,成功解码基址00400000,并且得到了解码后文件的完整数据段,由此成功证实了我上面的猜想,这种一键加验证的相当于就是套了个验证壳,只要过掉登录验证后,就不会有其他心跳验证。

绕过某云网络验证思路分析插图5
00401000汇编代码

寻找验证CALL

对于这种自写验证壳的验证弹窗,通常不会调用MessageBox,而是自写一个信息框提示窗口,常用bp指令为 bp CreateWindowExWbp CreateWindowExA,通过在这两个地址下断点,在单步回到验证。

单步来到验证壳段后,尝试搜索Unicode和ASCII关键字符,结果如下:

绕过某云网络验证思路分析插图6
中文字符

从这里可以得知,该验证是由易语言(EasyLanguage)编写,并且使用VMP引擎变异虚拟加密。

CreateWindowExW断点后,我们点击登陆按钮,成功断下,并且进行单步跟踪,并且在RETN处断点跳转,最终跟踪到了验证部分:

绕过某云网络验证思路分析插图7
验证部分

为了验证猜想正确,我们在该头部断点,并且重新点击登陆,结果成功断下,我们再次进行单步跟踪,查看解码后的数据结果。

单步跟踪后,可以发现程序获取了本机的内网ip和网关:

绕过某云网络验证思路分析插图8

在一个关键偏移CALL,出现了延迟,并且返回了登录的明文状态码,可以很明确地得知该CALL为验证登录,寄存器和数据地址中也可以很明确地看到返回的json内容:

绕过某云网络验证思路分析插图9
Json的相应相应内容

所以这里又给出了一种方法:通过截取数据包,修改返回的JSON相应内容,达到登录效果

JSON内容

code状态码
msg提示信息
count计次
data附加数据
JSON参数

判断状态

通过对JSON内容的解析,程序获取到各个JSON参数所对应的值,并且做出判断,判断寄存器eax是否为0,不为0则跳,为了通过验证我们手动置零或者nop该指令:

绕过某云网络验证思路分析插图10
验证思路

这里通过判断寄存器eax是否为0可以看出,其实是code对应的值,所以可以通过修改内存中code的值达到通过验证的目的,从而证明截包修改返回数据登录的可行性。

0x03 验证成功

由于内存随机分配,所以无法定位到地址,该验证也仅为1.0版本,目前已将小建议发送给了验证的作者,希望能够对验证进行加固修复,下图为内存补丁后的情况:

绕过某云网络验证思路分析插图11