吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7353|回复: 17
收起左侧

[原创] 无源码给程序加VMP壳(硬件锁)的个人想法

  [复制链接]
zeknight 发表于 2018-4-12 10:10
本帖最后由 zeknight 于 2018-4-12 10:12 编辑

由于时常需要对软件做一些小的限制(主要防止分发出去的程序被用于商业用途),在仔细阅读了pxhb 的《无源码给程序加VMProtect授权 》后,觉得还可以用另一种方式利用VMP进行加密,主要是针对硬件锁部分:


测试环境:Windows 7 32

工具:StudyPE+ x86

样本:notepad.exe

详细步骤:
一、关于猜想的测试:

1、 VMP的示例测试:我们可以在VMP的帮助中找到对硬件锁的范例:

Licensingsystem-Step 1.9: Hardware lock里面有这样的例子

[C++] 纯文本查看 复制代码
int main(int argc, char **argv)
{
        int nSize = VMProtectGetCurrentHWID(NULL, 0);
        char *buf = new char[nSize];
        VMProtectGetCurrentHWID(buf, nSize);
        printf("HWID: %s\n", buf);
        delete [] buf;
        return 0;
}


这个例子在程序未加VMP壳以前得到的是HWID: myhwid

加壳以后得到的就是目标机器的硬件锁编码

我们利用studyPE查看编译后的程序可以发现,导入表中有以下函数:VMProtectSDK32.dll->VMProtectGetCurrentHWID

2、 该函数的利用:

为了更为简单的利用这个函数,我们可以在程序的新区段中构造一个利用该函数的判断,达到直接让程序匹配目标计算机的目的。
相对于《无源码给程序加VMProtect授权 》来说修改量应该会大大减少,当然困难的地方在于将C++程序代码转换成ASM代码(这个是对我来说)。

二、实际操作:

第1步:添加导入函数利用StudyPE+ x86增加notepad的导入函数,添加函数的时候只需要添加VMProtectSDK32.dll里的 VMProtectGetCurrentHWID这一个函数就行了。

第2步:添加区段       利用StudyPE+ x86追加notepad的区段,区段的名称随你高兴了,大小根据你后面代码的长度而定,我个人觉得默认应该够你使用了。

第3步:编写代码              以下是我个人写的一个例子(大神勿喷,我C++也没有学多久)

[C++] 纯文本查看 复制代码
int main(int argc, char **argv)
{
        int nSize = VMProtectGetCurrentHWID(NULL, 0);
        char *buf = new char[nSize];
        VMProtectGetCurrentHWID(buf, nSize);
        char *UID="3J4fvIm4Yyd/qTJ9tvv9fg=="; //用户的机器码
        if (*UID==*buf)
        {
                MessageBox(NULL,TEXT("成功"),TEXT("警告"),MB_OKCANCEL);//添加你想做的事情
}
        delete [] buf;
        delete [] UID;
        return 0;



       注意:如果你是用来测试的话,需要编译以后加上VMP壳才能使用。

第4步:编写ASM代码      
这个就看有没有大神能写了,我只能写点简单的,这个就靠你们补全了。

第5步:在程序关键地方设置跳转      
在程序的关键代码处设置跳转,直接跳转到你新增的区段,完成你想做的事情以后再跳回去。

第6步:加壳      
这一步非常关键,如果没有加VMP的壳子是会出错的,程序也不能正常运行,请特别注意。

结语:这里只是谈谈个人的想法,欢迎大家一起探讨,当然也有很多其它的方法可以实现这样的加密,比如hook、捆绑之类的……

免费评分

参与人数 3吾爱币 +4 热心值 +3 收起 理由
C-ARan + 1 + 1 热心回复!
依旧沉沉 + 1 + 1 我很赞同!
丶丿後宫 + 2 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

依旧沉沉 发表于 2018-4-12 16:43
不错不错,感谢分享
无阻 发表于 2018-4-12 11:08
pxhb 发表于 2018-4-12 11:06
我的意思是LoadPe给你删了这个导入的dll,因为主程序也没源码,单纯的添加,不删随便写一个一样导出名字 ...



这时候再给主程序加个VMP壳子人家不就没法子LoadPe动手了
pxhb 发表于 2018-4-12 10:54
主要是因为VMProtectSetSerialNumber没正常授权那即使绕过对比机器码也不能正常执行被保护的代码
无阻 发表于 2018-4-12 10:45
本帖最后由 无阻 于 2018-4-12 10:46 编辑

能够对程序修改的话 直接给程序加一个导入函数..

然后写一个DLL

程序运行的之后因为导入函数的关系会自动调用这个DLL

这个DLL里面进行VMP硬件锁的验证代码不就好了..

什么增加区段跳啊跳的 还要汇编

那不是自找难受?
pxhb 发表于 2018-4-12 10:53
无阻 发表于 2018-4-12 10:45
能够对程序修改的话 直接给程序加一个导入函数..

然后写一个DLL

删了这个导入的dll就行了嘛
无阻 发表于 2018-4-12 10:55
pxhb 发表于 2018-4-12 10:53
删了这个导入的dll就行了嘛

因为函数在导入表里面导入的
这个DLL被删除的话 这个软件导入表检查就出错了啊 软件就没法子运行的
pxhb 发表于 2018-4-12 11:06
无阻 发表于 2018-4-12 10:55
因为函数在导入表里面导入的
这个DLL被删除的话 这个软件导入表检查就出错了啊 软件就没法子运行的

我的意思是LoadPe给你删了这个导入的dll,因为主程序也没源码,单纯的添加,不删随便写一个一样导出名字的dll也行
 楼主| zeknight 发表于 2018-4-12 11:35
本帖最后由 zeknight 于 2018-4-12 11:36 编辑
无阻 发表于 2018-4-12 10:45
能够对程序修改的话 直接给程序加一个导入函数..

然后写一个DLL

没有试过~~我去试一试!
 楼主| zeknight 发表于 2018-4-12 11:42
无阻 发表于 2018-4-12 10:45
能够对程序修改的话 直接给程序加一个导入函数..

然后写一个DLL

方法肯定是多种多样的,其实我只是探讨这种方法是否能够实现,如果要说方法还有HOOK的时候直接加载我编写的dll这样会更快,而且不用改变成员,也不用导入表之类的!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 00:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表