作为一个新手,一直以来都听说vmp没有源码写代码的情况下加不了授权,事实也确实如此。但最近闲着无聊,想弄一下vmp的授权,就调用汇编做了个小程序,编译后发现,所谓的SDK,好像只是添加了一个导入表的样子,然后编译的时候替换成壳的内部函数,如果是这样,那可不可以理解成,我添加一个导入表到没有源码的程序里面调用也可以呢?经过多次失败和实践,终于成功。
但在没有源码的情况下毕竟很多东西都很难弄,不是实现不了,是太费劲了,比如分解key,获取时间这些,经过自己写代码测试,发现vmp一个强大之处,手动添加vm地址,可以绑定注册码才可以被正确执行,如果没有正确的lic,即使绕过了授权的代码或者修改授权返回值,一样不会被正确执行,提示:
This code requires valid serial number to run.
Program will be terminated. 可以自行修改
这里的关键是通过vmp的一个api传一个参数,也就是注册码的值去决定的,VMProtectSetSerialNumber,这个,那是不是可以理解为我们只要添加这个到其他程序,然后调用就可以呢,想到这里特别兴奋,自己动手简单的弄了一个,发现还真可以,但是又有个问题,我加授权的话不可能每个程序的lic都放到里面吧,这样也太麻烦了,然后想到ReadFile把内容从文件读取,这样的话就会涉及到好几个api,CreateFile、GetFileSize、ReadFile、CloseHandle,在有源码的情况下当然是好实现,一想到是没源码的情况下做这个,呃,有点要命,在和smny大牛的讨论中他提到用GetPrivateProfileStringA来直接读取配置文件内容,这样下来就只用一个api即可实现读取内容,再次特别感谢smny大牛的提示。
下面就是添加区段来实现读取key和设置key内容了,手动在OD写代码确实有点麻烦,每次都弄太费时间,然后想到自己用汇编写好代码,到时候直接添加区段,当然咯,这样的话最好越省事越好,借鉴了看雪http://bbs.pediy.com/showthread.php?t=182964这个帖子的shellcode那种形式来获取api地址,以下代码思路来自于wjuid大牛