还有其他字段的解析,如到期日期,时间限制等,不做赘述,可参考VMProtectGenerateSerialNumber的实现。
同样的我们也可以用VMProtectGenerateSerialNumber来生成自己的序列号,因为我们已经拿到了ProductCode,其他的限制字段都可以不加,只需要自己生成一组RSA,并替换掉程序的mod值就可以keygen了。
大数加解密算法的版本差异vmp使用的大数都在内存中加密了,加解密算法根据版本的不同有一些细微差异,但都需要随机生成的20字节salt跟内存地址进行加解密,下硬件写断点跟踪虚拟机可以得到算法。
3.5
```c++
//解密
uint16t* salt = (uint16_t)psalt;
for (size_t i = 0; i < BigNum.size() / 2; i++)
{
size_t offset = (addr + (addr >> 7)) % 16;
size_t salt = ((uint8t*)(salt)+offset) + 0x37 + (addr >> 4);
buffer = (uint16_t)((buffer ^ salt) + addr);
addr += 2;
}
//加密
uint16t* salt = (uint16_t)psalt;
for (size_t i = 0; i < BigNum.size() / 2; i++)
{
size_t offset = (addr + (addr >> 7)) % 16;
size_t salt = ((uint8t*)(salt)+offset) + 0x37 + (addr >> 4);
buffer = (uint16_t)((buffer - addr) ^ salt);
addr += 2;
}