经过该云网络验证客服允许的情况下,我们注册并购买了测试软件位,并将一个未加壳的exe可执行文件上传到了云端加密系统,接下来我对该验证的免费加密系统进行了简单的分析。
从该云端系统下载加密完毕后的程序后,发现文件的体积明显增大7倍左右。从官网的介绍上来看,虚拟引擎应该借鉴了VMP3.X,因为我的调试环境中,3.X以下的可以直接过滤掉。
代码保护比较
通过Exeinfo PE文件可以很清楚地看到该加密后程序的PE信息:
文件PE信息
区段信息
经过加密后,区段基本处于不可读阶段,所以我这里还是决定选择了ollydbg
动态调试,希望能够通过运行查看是否能够解密.text
和.data
区段
由于该验证使用了VMP
,并且对于VM虚拟机和debugger
都有检测,这让我想起了以前分析过的一款倒闭的验证:
如果视频无法播放,点击这里试试
当时这款验证也是使用了VMP,不过验证的地址是固定的,特征保持不变,并且在一般的验证上存在逻辑问题,可以在某Call
处将eax
直接置1,即可跳过无条件跳过验证,并且释放源文件。
我猜测此次验证所使用的方法也是大同小异,不过特征可能不会不同。
劣质分析图
配置好OD后,运行该验证,成功解码基址00400000
,并且得到了解码后文件的完整数据段,由此成功证实了我上面的猜想,这种一键加验证的相当于就是套了个验证壳,只要过掉登录验证后,就不会有其他心跳验证。
00401000汇编代码
对于这种自写验证壳的验证弹窗,通常不会调用MessageBox
,而是自写一个信息框提示窗口,常用bp指令为 bp CreateWindowExW
或 bp CreateWindowExA
,通过在这两个地址下断点,在单步回到验证。
单步来到验证壳段后,尝试搜索Unicode和ASCII关键字符,结果如下:
中文字符
从这里可以得知,该验证是由易语言(EasyLanguage)编写,并且使用VMP引擎变异虚拟加密。
在CreateWindowExW
断点后,我们点击登陆按钮,成功断下,并且进行单步跟踪,并且在RETN
处断点跳转,最终跟踪到了验证部分:
验证部分
为了验证猜想正确,我们在该头部断点,并且重新点击登陆,结果成功断下,我们再次进行单步跟踪,查看解码后的数据结果。
单步跟踪后,可以发现程序获取了本机的内网ip和网关:
在一个关键偏移CALL,出现了延迟,并且返回了登录的明文状态码,可以很明确地得知该CALL为验证登录,寄存器和数据地址中也可以很明确地看到返回的json
内容:
Json的相应相应内容
所以这里又给出了一种方法:通过截取数据包,修改返回的JSON相应内容,达到登录效果
code | 状态码 |
---|---|
msg | 提示信息 |
count | 计次 |
data | 附加数据 |
通过对JSON
内容的解析,程序获取到各个JSON
参数所对应的值,并且做出判断,判断寄存器eax
是否为0,不为0则跳,为了通过验证我们手动置零或者nop
该指令:
验证思路
这里通过判断寄存器eax
是否为0可以看出,其实是code
对应的值,所以可以通过修改内存中code的值达到通过验证的目的,从而证明截包修改返回数据登录的可行性。
由于内存随机分配,所以无法定位到地址,该验证也仅为1.0版本,目前已将小建议发送给了验证的作者,希望能够对验证进行加固修复,下图为内存补丁后的情况: