写OD脚本解密WVS脚本

写OD脚本解密WVS脚本

安装好WVS后,WVS的脚本储存在C:\ProgramData\Acunetix WVS 9\Data\Scripts目录下,但是所有的脚本都被加密了,要解密脚本就必须从程序入手。

 

  • 脱壳

首先找到主程序文件wvs.exe拖入exeinfo PE查壳工具显示的是Themida & WinLicense 2.0 – 2.1的壳:

WVS scripts decode174

这个壳在现阶段也算是很出名的加密壳,最新版的Themida有很强的软件保护功能,并且和VMProtect一样它也有自己的虚拟机保护SDK。这里先不管代码保护,首要的任务是把壳脱掉,只有脱掉壳才能更好的进行分析。

脱这壳其实很简单,为什么这样说呢?如果自己手动的去脱,这壳确实会像徒手掰贝壳一样十分艰难,但是这里有来自大牛的脚本,脱这壳只需一步,那就是运行脚本。

下载德国大牛LCF-AT最新的Themida & WinLicense脱壳脚本,然后将主程序载入OD,运行该脚本,过程中只要点几个选项,ok壳就脱掉了。当然这之前你至少需要一个可以让程序在OD中运行而不被检测的环境,我这里选的是Win7 32位系统,并且将StrongOD插件的选项都选了。

 

  • 寻找关键解密部分

载入脱壳后的主程序文件,下断CreateFileA,运行web扫描。扫描时程序会读取脚本文件来解密执行,断下后可以看到:

WVS scripts decode825

堆栈回溯可以看到:

WVS scripts decode838

这里是获取并检测文件部分。

WVS scripts decode854

这是一些关键词检测部分,看到这些就可以肯定这里会有语句的解密,于是就单步跟踪看看,果然在看到了解密后的明码:

WVS scripts decode911

看到这里我还以为差不多可以了,以为它是一句一句循环提取解密并且检测的。但当我写了个脚本将这一句一句都提取出来并组合成完整脚本后,发现脚本中总是少几行不完整。还是要看看关键的解密call里干了什么,于是就跟进出现明码语句的上一个call看看。跟踪了下就发现了

WVS scripts decode1042

WVS scripts decode1044

00658FD1上的call会解密不止一行的数据,可以看出它每次解密的字符数量为0x1000。分析之后发现,它每次会解密0x1000的字符数,然后再进行单行检测,检测完后再解密下一个0x1000字符串。而在这两个0x1000字符串中间的同行数据就不会再这个函数返回是显示,这也是我第一次提取时总是缺几行的原因。

到了这步,其实最好的解密脚本方法就是分析提取出它的算法来写个解密工具,但因为程序上在这里会直接解密出所有的明码,我们可以偷下懒写个脚本来解密,而所要做的工作就是字符串的拼接。其实我也粗略跟了下算法,感觉并不好提取……

 

  • 写OD脚本提取解密脚本

首先在关键Call的结尾部分找到了个合适地址来Patch代码。

WVS scripts decode1361

运行到该地址后,一些变量的值正好是关键字符串的地址。WVS scripts decode1390

其中ebp-8的地址为新解密字符串的首行,ebp-C为新解密字符串的地址,ebp-10为旧解密字符串的尾行,ebp-14为就解密字符串。

有了这些变量数据,只要Patch这个地址,然后自己写一个字符串组合的过程,完整的解密数据就出来了。自己写的code如下:

WVS scripts decode1522

简单测试code后就提取二进制shellcode写到OD脚本里方便使用。下面就开始写OD脚本了。首先先有Python写个小脚本来提取所有要解密的脚本的文件名:

WVS scripts decode1604

WVS scripts decode1623

一共有将近400个脚本文件。

OD编写脚本流程如下:

  1. 导入所有要解密的脚本文件名
  2. 申请shellcode地址和初始化一些变量
  3. 写入shell code
  4. 重定位shell code数据
  5. 关键地址下断
  6. patch掉无用过程和解密地址
  7. 保存Context
  8. 获取下一个要解密文件名,取完侧跳到第14步
  9. 替换Context中解密脚本文件名
  10. 运行程序,解密数据
  11. 导出解密数据
  12. 恢复Context
  13. 跳到第8步
  14. 所有脚本解密完成,退出

 

写完脚本后,重新载入程序,运行脚本,WSV的脚本就都解密了。

makings:

wvs_scripts_decode_makings.zip

发表评论

电子邮件地址不会被公开。 必填项已用*标注