[TOC]



## 查壳



![1553853455486](assets/1553853455486.png)



还是个VB写的程序，没有壳



## 分析程序



![1553853635575](assets/1553853635575.png)



既然是单纯的一个序列号的保护方式 就没有必要分析算法了，直接追踪序列号就行



![1553853499063](assets/1553853499063.png)



首先，根据错误的字符串提示向上找跳转



![1553853568972](assets/1553853568972.png)



这两句一共有三个跳转，也就是说对序列号进行了三次判断



![1553853611341](assets/1553853611341.png)



首先来到403704这个位置的跳转



![1553853679139](assets/1553853679139.png)



这里是比较字符串的长度是否为9，不是则报错



![1553853713287](assets/1553853713287.png)



接着再来到403A04这个位置的跳转



![1553853757182](assets/1553853757182.png)



这里会根据vbaVarTstNe的比较结果来判断是否进行跳转，这个函数的VB常用的比较函数，可以肯定这里就是比较正确的序列号的地方了



等待程序断下后，来观察两个参数的内容，var18固定为0，var28是个字符串



![1553853996310](assets/1553853996310.png)



首地址+8才是真正的内容



![1553854010381](assets/1553854010381.png)



是字符3，理论上来说这里应该是个序列号，但是只出现一个字符，也就是说这个软件比较序列号的方式是逐个字符的比较，



再来看一下判断的部分



![1553854128460](assets/1553854128460.png)



比较di之后，如果不相等则跳转到报错的地方，如果相等则继续往下走，后面两句相当于i++，然后跳转到循环开始处，



也就是说只要在vbaVarTstNe比较之后跳转之前修改ZF标志位，就能看到每个正确的序列号



正确的序列号是**301674501**



## 验证结果



输入得到的结果，提示正确



![1553854398727](assets/1553854398727.png)



需要相关文件的可以到我的Github下载：https://github.com/TonyChen56/160-Crackme