如何将程序做成30天的试用版本并禁止拷贝?

lkzyy 2001-07-20 04:59:59
谢谢!急用。
...全文
161 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
willpufo 2002-05-25
  • 打赏
  • 举报
回复
agree to xinghf!
I don't think there are anything cannot be cracked!!
xinghf 2002-05-25
  • 打赏
  • 举报
回复
用法律
dirboy_tym 2002-05-25
  • 打赏
  • 举报
回复
学习,
哎,vc真是博大啊
ximuwa 2001-07-20
  • 打赏
  • 举报
回复
听课
不解 2001-07-20
  • 打赏
  • 举报
回复
我认为防只是一种手段,关键在于意识。
1。通过注册表。
2。通过文件,实际上1,2 的原理是相同的。
3。修改自己的可执行文件,
4。远程注册。
vcsongs 2001-07-20
  • 打赏
  • 举报
回复
防COPY. 可以找一个硬件的ID. 比如网卡号. 硬盘ID. CPU ID. ...
写程序可以想办法修改EXE文件自身...
还有比如防softice等的方法...
很多都是经验, 而且只要有足够的资料. 没有破解不了的东西...

给你一段加密狗产品中关于加密的论述:
6 章 更好地使用RG-UMH

以下的所有叙述对GS-MH并口狗和USB狗同样试用。不同的是USB狗只能用于Windows 98和Windows 2000操作系统下。
1)加密技巧
简单技巧:
1. 赋值和判断分开 参考强度值:1
在赋值和对值的判断之间,可以插入很多的其他操作,让解密者难以猜到二者之间的联系。对于全局变量,可以在别的函数块中做判断。如下:
RetCode = DogCheck();
... // 加入多条语句,可以是与操作狗有关的,或者其他复杂的语句结构
if ( RetCode != 0 )
{
...
}

2. 多次判断值 参考强度值:2
对于一个值,可以在不同的地方做判断,可以做很多的判断,让解密者难以屏蔽所有的判断操作,而只要有一个地方判断结果不对就可以认为整个结果是不对的。例如:
RetCode = ReadDog();
If ( RetCode != 0 )
{
...
}
... // 加入多条语句,可以是与操作狗有关的,或者其他复杂的语句结构
If ( RetCode != 0 )
{

...

}

.... // 加入多条语句,可以是与操作狗有关的,或者其他复杂的语句结构

If ( RetCode != 0 )

{

...

}



3.多次赋值 参考强度值:3

对于一个返回值,可以多次赋值给它,可以用复杂循环来做,让解密者无法跟踪该值的变化。在下面的例子中是在使用 RetCode 之前多次赋一些无用的值:



for ( i = RetCode; i < RetCode + 1000; i++ )

{

if ( random() % 3 )

RetCode = i ^ i + 157;

}

RetCode = DogCheck();



4. 赋多个值 参考强度值:3

返回的结果可以赋给很多的值,让解密者难以跟踪所有的这些返回值。而任意一个返回值不正确,都可以认为结果不正确。



RetCode = ReadDog();

for ( i = 0; i < 100; i ++ )

{

a [i] = RetCode ;

}

for ( i = 0; i < 100; i ++ )

{

b [i] = a [i] ;

}



5. 使用返回值 参考强度值:4

其实做判断是一种不好的方法,容易被识破和屏蔽。直接使用结果可以更好地让应用软件和加密软件结合。如下例中,如果返回值不正确,圆周率肯定也不正确,程序运行的结果也就会混乱了。



RetCode = DogCheck ();

PI = RetCode + 3.14159;



6. 使用狗中常量 .参考强度值:6

在狗中放置一些常量,要使用时从狗中读出使用。比如路径名,文件名,一些常用数据等。在下面的例子中,在狗中10-14单元放置了字符串“AUTO”,15单元放置了数字1。



DogBytes = 5;

DogAddr = 10;

RetCode = ReadDog();

Strcpy ( Path, “C:\” );

Strcat ( Path, DogData );

Strcat ( Path, “EXEC.BAT” );

....

DogBytes = 1;

DogAddr = 15;

RetCode = ReadDog ();

for ( i = 0; i < 100; i = i + *DogData )

{

...

}



7. 使用多个变换结果 参考强度值:10-20

变换的结果可以看成是一种可预知的返回值,随着输入的不同,输出也会不同,进行多次变换,并且使用变换的结果。



中级技巧

8. 随机执行 参考强度值:10

解密者往往是通过大工作量地跟踪程序以发现加密点的,这需要不停地运行程序,以发现规律。在程序中设置随机量可以让加密者糊涂。这种随机可以是随机对返回值进行判断,可以是随机的赋值,也可以是程序随机地执行。

比如下面的程序是随机执行:



if ( Random ( 10 ) = 5 )

{

RetCode = DogCheck ();

...

}

if ( Random ( 10 ) = 7 )

{

RetCode = ReadDog ();

...

}

一些解密的高手可能会注意到程序执行的随机性,从而屏蔽 Random 函数。下面几条技巧也用到随机量,如果可能,可以使用自己编写的随机数发生器。随机数发生器的初始化可以取如系统时间这样的随机值。



9. 随机读 参考强度值:15

可以随机地从狗中读取一些内容,但是除非需要,这些内容可以不使用。地址、长度都可以是随机的。



DogAddr = Random ( 200 );

DogBytes = Random ( 200 – DogAddr );

RetCode = ReadDog();

....



10. 随机写 参考强度值:20

可以随机地向狗中写入一些随机内容,地址、长度都可以是随机的。但是要注意不要覆盖狗中有用的内容。较好的办法是在狗中规定一个区域用于随机写,并使随机写的地址和长度不会越界。在下面的例子中,单元80-99单元是不使用的。



DogAddr = 80 + Random(20);

DogBytes = 20 – Random ( 100 – DogAddr );

DogData[1] = DogAddr;

DogData[2] = DogBytes;

RetCode = WriteDog();



11. 随机写然后读出 参考强度值:35

这其实是上面两个技巧的配对使用。要注意的是读和写要从程序的运行逻辑上分离远一些,中间可以加入其他对狗的操作,这样解密者极难看出两者的联系。



12. 随机变换 参考强度值:35

随机变换是指做变换的内容和长度可以是随机的。而返回的变换结果可以不使用。



13. 随机变换并使用结果 参考强度值:20-100

这个技巧可能比较难于理解。使用方法是这样的:假如我们要使用常数1,我们可以先产生一个随机内容 A,把 A 保存起来,按照技巧 12 用 A 做一次随机变换,得到变换结果 B, 再把 B 同我们要得到的常数做一次运算,这里比如是简单的加法,得到结果 C,那么肯定 C = B + 1,再把 C 也保存起来。在程序的另外一个地方,我们再用保存的 A 再做一次变换,变换的结果肯定与上次的 B 相同,同保存的 C 做一次反运算,这里是减法,会得到结果 D = C - B = 1。这时就可以使用 D 了,D 就是我们要用的常量。要注意这个技巧也是有两部分组成,它基于以下的原理:即使变换的结果是不可预知的,但是两次相同的变换的结果肯定是一样的。有人可能会觉得中间那步运算和反运算是多余的,其实不然。下面的例子中我们假设要使用字符A:



DogBytes = Random ( 64 );

For ( i = 0; i < DogBytes; i ++ )

{

DogData [i] = Random ( 255 );

}

RetCode = DogConvert ();



SaveDogBytes = DogBytes;

For ( i = 0; i < DogBytes; i ++ )

{

SaveDogData [i] = DogData [i];

}

SaveResult = DogResult ^ (unsigned long)"A";





....



DogBytes = SaveDogBytes;

DogData = SaveDogData;

RetCode = DogConvert ();

DataWeWant = DogResult ^ SaveResult; // DataWeWant

运行到这里会被赋值为“A”



14. 使用狗做全局变量 参考强度值:40

可以把一些变量放在狗中,使用狗来做传递变量。而且这些变量还是全局的。甚至下一次运行程序时还在。



高级技巧:

15. 多线程 参考强度值:20-150

利用高级操作系统的多线程技术可以很好地迷惑解密者和解密工具。基本思路是这样的:在一个线程中对狗操作,在另外一个线程中判断和使用。



16. 队列 参考强度值:40-60

可以建造一个队列以管理返回值和返回结果,管理的方法可以复杂一些,而程序的执行是依赖于这个队列的。当然不用队列而使用其他的数据结构也是一样的,甚至效果更好。有心的读者可能注意到本技巧也可以和上面的技巧 15 结合起来。一个简单的使用队列进行返回值管理的例子如下图所示:













在上图中,有一个初始化了的队列,共有6个单元,初始数据为148888,当发生的返回值不为0时,将205429赋给Pin,并使队列移动一个单元。在Pout处检测被推出的数据,当为148888时不做动作,当为205429时即认为非法。



总结:在程序中综合使用以上16种加密方法可以很好地保护你的软件。参考强度值仅供参考,与使用者的具体使用方法有很大关系。事实上也并不一定要追求高强度值的技巧,低强度参考值的技巧只要使用巧妙,而且多次使用,也可以达到很好的效果。而高级的技巧一般难于实现,使用和调试都比较困难。开发商同时要注意,对RG-UMH操作是要耗时的,延时可能在 50 - 200 毫秒之间,与所读写字节的长度有关。此外,使用RG-UMH提供的AS技术,即程序中调用API函数和SHELL加密EXE同时使用,可以有更好的加密强度。

red_eyes 2001-07-20
  • 打赏
  • 举报
回复
读一个硬件的序列号,用它做键值。可以防止有规律和找。防考贝的方法2ndboy 的应该可以/
vcsongs(vcsongs)这些都是相对而言的,没有什么绝对的东西。对与一般的客户而言,写注册表的方法是可以用的。更高级的请教你了?!!!
2ndboy 2001-07-20
  • 打赏
  • 举报
回复
道高一尺 魔高一丈!

对,可是没办法,就是这种环境,有人热衷编程,有人热衷破解。。。。。。
2ndboy 2001-07-20
  • 打赏
  • 举报
回复
把使用天数写到注册表或数据文件里(要注意隐蔽)。至于禁止拷贝嘛,把与机器有关的数据写入文件(注册表)中,程序判断如果没有此文件(键值)则不执行,机器信息不符也不执行。
vcsongs 2001-07-20
  • 打赏
  • 举报
回复
什么方法都不是绝对有用的.
道高一尺 魔高一丈!

象你用标志的. 用REGMON一眼就看出来了... 管你多深的目录.
qin_wei 2001-07-20
  • 打赏
  • 举报
回复
在注册表里写一个标志,用很深的目录,(嘻嘻)
lkzyy 2001-07-20
  • 打赏
  • 举报
回复
大侠请快出手!

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧