首页
社区
课程
招聘
[原创]无源码给程序加VMP壳(硬件锁)的另类猜想
2018-4-12 10:24 6768

[原创]无源码给程序加VMP壳(硬件锁)的另类猜想

2018-4-12 10:24
6768

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

测试环境:

Windows 7 32

工具:StudyPE+ x86

样本:notepad.exe

详细步骤:

一、关于猜想的测试:

1、 VMP的示例测试:

我们可以在VMP的帮助中找到对硬件锁的范例:

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

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++也没有学多久)

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、捆绑之类的……


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
打赏
分享
最新回复 (10)
雪    币: 1042
活跃值: (455)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Rookietp 2018-4-12 10:49
2
0
完全可以写一个工具.加壳脱壳版块好多例子.
雪    币: 211
活跃值: (511)
能力值: ( LV9,RANK:172 )
在线值:
发帖
回帖
粉丝
vmtest 2018-4-12 12:12
3
0
if  (*UID==*buf)

厉害
雪    币: 7618
活跃值: (2002)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
friendanx 2018-4-12 12:49
4
0
vmtest if (*UID==*buf) 厉害
雪    币: 1412
活跃值: (4469)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2018-4-12 14:44
5
0
vmtest if (*UID==*buf) 厉害
delete  []  UID;也比较厉害
雪    币: 2082
活跃值: (2845)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
xiaohang 3 2018-4-13 10:04
6
0
这个……  请问谁刚学c没踩过这个坑
雪    币: 1052
活跃值: (1078)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
天涯一鸿 2018-4-13 11:09
7
0
xiaohang 这个…… 请问谁刚学c没踩过这个坑[em_16]
strcmp没踩过……但是释放全局/局部变量的坑踩过……那时候还是用的delphi……时代的眼泪……
最后于 2018-4-13 11:10 被天涯一鸿编辑 ,原因:
雪    币: 2082
活跃值: (2845)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
xiaohang 3 2018-4-13 13:59
8
0
我说的是  delete    []    UID  这个坑
至于  if  (*UID==*buf)  ,只能说楼主的c还没入门,还需继续努力
雪    币: 202
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zeknight 2018-4-13 21:16
9
0
谢谢各位的帮助,我刚刚学没有多久,继续努力中!大家都说说这个逻辑能行吗?
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rokeys 2018-4-14 12:51
10
0
不错不错,继续完善~
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
锅里的肥肉啊 2018-4-20 22:07
11
0
加油
游客
登录 | 注册 方可回帖
返回