找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1742|回复: 14

如何限制ARX程序使用的次数?

[复制链接]
发表于 2002-1-19 12:02:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
如何限制ARX程序使用的次数?如果重新安装该程序,其使用次数应从以前的记数继续算起?:8
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-1-19 23:22:50 | 显示全部楼层

在注册表中做记录

在注册表中写些东西
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-1-20 02:44:53 | 显示全部楼层
注册表不是很安全,用注册表监视器一下就能发现。最好是在系统目录写个文件,虽然别人也能监视,但你里边要注意一些写的技巧,也可以同时和注册相配合。写文件时注意和时间配合,不怕别人修改,而且最好写多个文件。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-1-20 02:52:40 | 显示全部楼层
最初发表由 masterhe
[B]注册表不是很安全,用注册表监视器一下就能发现。最好是在系统目录写个文件,虽然别人也能监视,但你里边要注意一些写的技巧,也可以同时和注册相配合。写文件时注意和时间配合,不怕别人修改,而且最好写多个文件。 [/B]


给大家提供个例子程序吧

:a :9 :9
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-1-21 10:01:00 | 显示全部楼层

参考代码

1.先获得一个唯一或相对唯一的数据,比如硬盘的物理序列号(这是硬盘厂家设定的,这是唯一的)、C盘的序列号(注意不是卷标,此号在格式化时生成的,相对唯一)。然后你就有一个对于该机器能够锁定的信息,当然这个信息你可以对其加密,基本上64位就够了。前边所讲的取得序列号和加密在网上有很多现成的东东,我这里就不一一写出来了。
2.将系统目录下一个大小适中的Dll文件引入到你的ARX工程中作为资源,在你的程序启动时将此资源生成到系统目录(或其它目录也行),文件名字和该目录下某个动态库名字可以十分相近,如:本来叫User32.Dll,你可以叫UserEx32.Dll等等。要想不引人注意,写成别的文件名当然也行。如果启动时该文件已存在就不用再重新生成了。
3.这时候我们就有两个变量了:LPCTSTR lpszDataText和LPCTSTR lpszFileName
4.下边的代码中我加入了时间限制

  1. #define FIRSTPOS                2047L
  2. #define SECONDPOS                (FIRSTPOS*4)
  3. #define THIRDPOS                (FIRSTPOS*16)
  4. #define FOUTHPOS                (FIRSTPOS*20)
  5. #define FIFTHPOS                (FIRSTPOS*21)

  6. //当文件新建立时调用
  7. BOOL DoNewFile(LPCTSTR lpszDataText,LPCTSTR lpszFileName,int nLimitCount)
  8. {
  9.         try
  10.         {
  11.                 CFile fileWrite;
  12.                 if(!fileWrite.Open(lpszFileName,CFile::modeReadWrite))
  13.                         throw 0;
  14.                 time_t timeTime;
  15.                 time(&timeTime);
  16.                 srand(timeTime);
  17.                 if(fileWrite.Seek(FIRSTPOS-2,CFile::begin)!=FIRSTPOS-2)
  18.                         throw 0;
  19.                 int nValue=rand();
  20.                 fileWrite.Write(&nValue,2);
  21.                 fileWrite.Write(&timeTime,sizeof(time_t));
  22.                 nValue=rand();
  23.                 fileWrite.Write(&nValue,2);
  24.                
  25.                 time(&timeTime);
  26.                 if(fileWrite.Seek(SECONDPOS-2,CFile::begin)!=SECONDPOS-2)
  27.                         throw 0;
  28.                 nValue=rand();
  29.                 fileWrite.Write(&nValue,2);
  30.                 fileWrite.Write(&timeTime,sizeof(time_t));
  31.                 nValue=rand();
  32.                 fileWrite.Write(&nValue,2);
  33.                
  34.                 time(&timeTime);
  35.                 if(fileWrite.Seek(THIRDPOS-2,CFile::begin)!=THIRDPOS-2)
  36.                         throw 0;
  37.                 nValue=rand();
  38.                 fileWrite.Write(&nValue,2);
  39.                 fileWrite.Write(&timeTime,sizeof(time_t));
  40.                 nValue=rand();
  41.                 fileWrite.Write(&nValue,2);
  42.                
  43.                 if(fileWrite.Seek(FOUTHPOS,CFile::begin)!=FOUTHPOS)
  44.                         throw 0;
  45.                 CString strAuthor=_T("Author:masterhe");
  46.                 fileWrite.Write((LPCTSTR)strAuthor,strAuthor.GetLength());
  47.                 nValue=rand();
  48.                 fileWrite.Write(&nValue,2);
  49.                 time(&timeTime);
  50.                 fileWrite.Write(&timeTime,sizeof(time_t));
  51.                 nValue=rand();
  52.                 fileWrite.Write(&nValue,2);
  53.                
  54.                 if(fileWrite.Seek(FIFTHPOS-2,CFile::begin)!=FIFTHPOS-2)
  55.                         throw 0;
  56.                 nValue=rand();
  57.                 fileWrite.Write(&nValue,2);
  58.                 DWORD dwLength=_tcslen(lpszDataText);
  59.                 fileWrite.Write(&dwLength,sizeof(DWORD));
  60.                 fileWrite.Write(lpszDataText,dwLength);
  61.                 fileWrite.Write(&nLimitCount,sizeof(nLimitCount));
  62.                 nValue=rand();
  63.                 fileWrite.Write(&nValue,2);
  64.                
  65.                 fileWrite.Close();
  66.         }
  67.         catch(...)
  68.         {
  69.                 ::AfxMessageBox(_T("你的提示!"));
  70.                 return FALSE;
  71.         }
  72.         return TRUE;
  73. }
  74. //检查文件中次数是否可靠
  75. BOOL CheckUsedCountIsValid(LPCTSTR lpszDataText,LPCTSTR lpszFileName,int nLimitCount)
  76. {
  77.         try
  78.         {
  79.                 CFile fileWrite;
  80.                 if(!fileWrite.Open(lpszFileName,CFile::modeReadWrite))
  81.                         throw 0;
  82.                 time_t timeTime1,timeTime2;
  83.                
  84.                 if(fileWrite.Seek(FIRSTPOS,CFile::begin)!=FIRSTPOS)
  85.                         throw 0;
  86.                 fileWrite.Read(&timeTime1,sizeof(time_t));
  87.                 if(fileWrite.Seek(SECONDPOS,CFile::begin)!=SECONDPOS)
  88.                         throw 0;
  89.                 fileWrite.Read(&timeTime2,sizeof(time_t));
  90.                 if(fileWrite.Seek(THIRDPOS,CFile::begin)!=THIRDPOS)
  91.                         throw 0;
  92.                 fileWrite.Read(&timeTime1,sizeof(time_t));
  93.                 CTime time1(timeTime1),time2(timeTime2);
  94.                 if(time1>CTime::GetCurrentTime())
  95.                 {
  96.                         SYSTEMTIME timeDest;
  97.                         time1.GetAsSystemTime(timeDest);
  98.                         ::SetLocalTime(&timeDest);
  99.                 }

  100.                 if(time1<time2)
  101.                 {
  102.                         SYSTEMTIME timeDest;
  103.                         time2.GetAsSystemTime(timeDest);
  104.                         ::SetLocalTime(&timeDest);
  105.                 }

  106.                 if(fileWrite.Seek(FIFTHPOS,CFile::begin)!=FIFTHPOS)
  107.                         throw 0;
  108.                 DWORD dwLength;
  109.                 fileWrite.Read(&dwLength,sizeof(DWORD));
  110.                 CString strInfo;
  111.                 fileWrite.Read(strInfo.GetBuffer(dwLength+1),dwLength);
  112.                 strInfo.ReleaseBuffer(dwLength);
  113.                 int nLimit;
  114.                 fileWrite.Read(&nLimit,sizeof(nLimit));
  115.                 int nLimit1=nLimit+1;
  116.                 fileWrite.Seek(-sizeof(nLimit),CFile::current);
  117.                 fileWrite.Write(&nLimit1,sizeof(nLimit1));

  118.                 time_t timeTime;
  119.                 time(&timeTime);
  120.                 if(fileWrite.Seek(THIRDPOS,CFile::begin)!=THIRDPOS)
  121.                         throw 0;
  122.                 fileWrite.Write(&timeTime,sizeof(time_t));

  123.                 fileWrite.Close();


  124.                 if(nLimit>nLimitCount || nLimit<=0)
  125.                 {//次数已超
  126.                         throw 1;
  127.                 }
  128.                 if(strInfo!=lpszDataText)
  129.                         throw 1;
  130.                 int nMonth=3;
  131.                 CTime timeEnd;
  132.                 if(time2.GetMonth()+nMonth>12)
  133.                         timeEnd=CTime(time2.GetYear()+1,time2.GetMonth()+nMonth-12,time2.GetDay(),time2.GetHour(),time2.GetMinute(),time2.GetSecond());
  134.                 else
  135.                         timeEnd=CTime(time2.GetYear(),time2.GetMonth()+nMonth,time2.GetDay(),time2.GetHour(),time2.GetMinute(),time2.GetSecond());
  136.                
  137.                 if(CTime::GetCurrentTime()>=timeEnd)
  138.                 {
  139.                         //已超时
  140.                         return FALSE;
  141.                 }
  142.         }
  143.         catch(...)
  144.         {
  145.                 DeleteFile(lpszFileName);
  146.                 return FALSE;
  147.         }
  148.         return TRUE;
  149. }
复制代码


就写这么多吧,直接在这上边写程序眼手都累。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-1-22 18:17:58 | 显示全部楼层

严格说来,没有!但是,你可以……

想象DOS时代算EXE吗,NO
    我的一条思路:
在注册表生成两个值,一个是使用次数的加密,另一个是对该加密结果的加密,注意了,千万要自己写算法,最好用必要非充分条件,这样就加大了解密难度。还要避开人家如何跟踪,发现跟踪或出现加密结果异常则停止运行,再加上如果跟踪或解密次数超过n次就来点惩罚措施(这着太损),谁敢解??
    话说回来,一般的程序至于这样吗?

masterhe(老何)先生,你的名字的第三个字很多人不认识,你在98年前就搞了一个总图软件,用自定义对象标坐标,记得否,现在进展如何,我可想用啦?
我并没有悄悄蒙上你的眼睛,让你猜猜我是谁。

                 laoliu
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-1-22 18:55:20 | 显示全部楼层

回复: 严格说来,没有!但是,你可以……

最初发表由 laoliu
[B]想象DOS时代算EXE吗,NO
    我的一条思路:
在注册表生成两个值,一个是使用次数的加密,另一个是对该加密结果的加密,注意了,千万要自己写算法,最好用必要非充分条件,这样就加大了解密难度。还要避开人家如何跟踪,发现跟踪或出现加密结果异常则停止运行,再加上如果跟踪或解密次数超过n次就来点惩罚措施(这着太损),谁敢解??
    话说回来,一般的程序至于这样吗?

masterhe(老何)先生,你的名字的第三个字很多人不认识,你在98年前就搞了一个总图软件,用自定义对象标坐标,记得否,现在进展如何,我可想用啦?
我并没有悄悄蒙上你的眼睛,让你猜猜我是谁。

                 laoliu [/B]


那个字念 heng(hang),我也是问他的,我用拼音不用五笔,一直不会输入。
老刘同志,很高兴认识你,你用MSN吗?希望和你聊聊。我的MSN ID是xdsoft@21cn.com
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-1-23 09:15:28 | 显示全部楼层

结合这样的方法也许会有更好的效果。

给自己的ARX程序做一个启动画面(如640*480图象),
在该启动画面中嵌入一个水印图案(如32*32图象),
而该水印图案内还可以嵌入任何数据(可以为16*16=256个字节的数据)
以上操作对任何一个图象、数据没有影响。

然后你修改、保存这256个字节的数据就行了,
结果就是:别人都知道你做了些什么,但别人却不知道你做了什么。

不过没有绝对的加密方式,等到未来的CAD软件变成CAD服务模式,就不用加密了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-1-23 17:11:58 | 显示全部楼层
最初发表由 laoliu
[B]想象DOS时代算EXE吗,NO
    我的一条思路:
在注册表生成两个值,一个是使用次数的加密,另一个是对该加密结果的加密,注意了,千万要自己写算法,最好用必要非充分条件,这样就加大了解密难度。还要避开人家如何跟踪,发现跟踪或出现加密结果异常则停止运行,再加上如果跟踪或解密次数超过n次就来点惩罚措施(这着太损),谁敢解??
    话说回来,一般的程序至于这样吗?

masterhe(老何)先生,你的名字的第三个字很多人不认识,你在98年前就搞了一个总图软件,用自定义对象标坐标,记得否,现在进展如何,我可想用啦?
我并没有悄悄蒙上你的眼睛,让你猜猜我是谁。

                 laoliu [/B]


呵呵!你还记得我那个总图软件,我都好久没摸了,而且你看到的版本里边Bug还不少。虽然我有好多好多的想法想在升级版中使用,可惜没有时间去完善了。总图各行各业都不太一样,我R2000的升级版参考了一些设计院的绘图习惯,终因吃饭问题搁置。
另外,ARX文件在NT/W2K也是可以自己修改的,不过人家给你覆盖回去了,就白改了。
:)是的,你没有悄悄蒙上我的眼睛,只是正在光明的蒙,明明是小刘偏偏说自己是老刘。长清同志,近来还好吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-1-23 17:30:57 | 显示全部楼层

回复: 结合这样的方法也许会有更好的效果。

最初发表由 Unknown
[B]给自己的ARX程序做一个启动画面(如640*480图象),
在该启动画面中嵌入一个水印图案(如32*32图象),
而该水印图案内还可以嵌入任何数据(可以为16*16=256个字节的数据)
以上操作对任何一个图象、数据没有影响。

然后你修改、保存这256个字节的数据就行了,
结果就是:别人都知道你做了些什么,但别人却不知道你做了什么。

不过没有绝对的加密方式,等到未来的CAD软件变成CAD服务模式,就不用加密了。 [/B]


:)
你这个想法很好,不过作不作Logo无所谓,一个位图资源中可以含加密信息(网上有这个代码),然后写回资源中去。不过这种办法只能和外部写文件或注册表相结合,不然人家用原来的文件覆盖回去就白搭了。写到这儿想一想,还是离不了外部的东东,唉!其实说的这些个所谓办法,归根结底一回事儿,搞定普通用户还行,稍高点的水平的,没用!再说了,即使用硬锁,碰到看汇编和普通人看英语似的的同志,一样白搭。水平到不了这高度的同志,也能给大家弄出个D版ACAD玩儿玩儿。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-1-24 09:40:44 | 显示全部楼层

Re: 回复: 结合这样的方法也许会有更好的效果。

最初由 masterhe 发布


水印的功能就在于校正LOGO是否正确,因为是个很小的图片,所以更隐蔽,
如果用的是图标,AutoCAD下有好几百个吧,别人如何知道你嵌入的是那一个?
算法又是如何?不同的水印,不同的算法,导致不同的结果。

把多种加密方法结合起来,就很有效了。

20%真,80%假,对付的初水平的解密者。
80%真,20%假,对付高水平的解密者。
90%真,10%假,对付更高水平的解密者。
越高水平的人往往犯越低级的错误。

不过还是那句话,技术没有绝对的壁垒,加密也没有绝对的安全性。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-10 14:49:28 | 显示全部楼层
to 土土土、unknown、laoliu、xulixin:
很想和各位高手聊聊,请问都有没有msn,我的email和msn:mycreatedream@etang.com
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-28 16:42:41 | 显示全部楼层
高手!!!绝对高!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-11-26 09:07:50 | 显示全部楼层
受教了,收藏了,下回再研究
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-11-30 17:25:51 | 显示全部楼层
加密说难也难说容易也容易。
有些“高手”,加密搞得很复杂,编译后的代码达到1M还多,
可碰到高手(真正的)一下子就破解了,而且破解方法极其简单。
有些“新手”,加密搞的比较简单(当然也不能搞得太简单,
简单到常规软件就能直接破解),真正的高手搞了很就也没搞出来。
其实加密不在技术难度,而在出其不意。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 10:17 , Processed in 0.227127 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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