请问,如何控制一个软件只能用30天,用过30天后就需要注册,要考虑哪几种情况?请大师们给一个解题的思路.

rockett 2001-12-19 01:09:19
 
如题,请帮忙。
...全文
231 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
rockett 2001-12-19
  • 打赏
  • 举报
回复
太深奥,得认真学习学习。
jiagh 2001-12-19
  • 打赏
  • 举报
回复
好好
gust 2001-12-19
  • 打赏
  • 举报
回复
VCKBASE Online Help Journal No.8


Win95下隐藏注册表中的自启动键--兼谈一个虚拟设备服务钩子的制作


河南省郑州市第四职业中专 叶文伟(disini@yeah.net)



一、提出问题

在Win95/98下,一些保护或者杀毒程序常常需要在Windows启动时自动运行,为做到这一点,程序员常常将程序放在以下几处:

1. AUTOEXEC.BAT中;

2. WINSTART.BAT里加载;

3. 注册表里RUNSERVICEONCE/RUNSERVICE项记载;

4. 注册表RUNONCE/RUN记载;

5. WIN.INI里的LOAD/RUN;

6. 启动组里的项。

在以上常见的六种方法里,利用注册表法效果算最好,因为它不能被直接看到,不能直接被修改,故相对来说安全一些。但由于人们还是可以用Regedit.exe、Msconfig.exe找到这些程序的隐身之处,进而删除它们的自启动键值,故如何隐藏注册表中程序的自启动键值就成了一个关键。

二、问题解决原理

1. Msconfig、Regedit找到自启动键值的方法

注册表的HKEY_LOCAL_MACHINE键下面就是自启动程序的键值名和键值,由于Windows对键值名没有特殊要求,每个程序都可以自己命名。所以,Regedit.exe或者是Msconfig.exe要想找出Run下面的所有键值名和键值,就必须用枚举的办法,即调用

LONGRegEnumValue(HKEY hKey, // 要枚举的键的句柄

DWORD dwIndex, // 键值索引

LPTSTR lpValueName, // 接收键值名的缓冲区地址

LPDWORD lpcbValueName, // 接收键值名的缓冲区大小的指针

LPDWORD lpReserved, // 保留

LPDWORD lpType, // 接收返回键值类型的指针

LPBYTE lpData, // 接收返回键值的指针

LPDWORD lpcbData // 返回键值缓冲大小的指针

);

2. 隐藏某个特殊键值的方法

由1可知,Regedit.exe、Msconfig.exe发现自启动程序是通过调用RegEnumValue()函数,而这个函数的实现依靠的是虚拟设备服务。在Vxd中我们可以对这个服务安装一个钩子(HOOK),在安装的同时获得原来的RegEnumValue的入口地址RealRegEnumValue;在钩子函数中先调用一次RealRegEnumValue,而后检测lpValueName的值是否是要隐藏的键值名,是则再调用一次RealRegEnumValue并返回,若不是就直接返回。当然也可以检测lpData作进一步的判断。

3. 安装钩子函数

PVOID Hook_Device_Service_C(DWORD Service, PVOID pHandler, HDSC_Thunk*pThunk);

该函数有四个参数,其中Service是要安装钩子的服务名,pHandler指向钩子函数,pThunk是一个指向Thunk内存块指针。若安装成功,函数返回服务的原来地址。

三、程序的实现

1. 启动Quickvxd,并设置参数。

2. 启动VC++6.0,在test.h中加入以下两行:

//声明RegEnumValue的原形:

LONG (*RealRegEnumValue)

(HKEY,DWORD,PCHAR,PDWORD,PDWORD,PDWORD,PBYTE,PDWORD);

//声明Thunk:

HDSC_Thunk thunkREG;

3. 在test.CPP中,Vxd初使化和退出时作如下处理:

BOOL MyfileDevice::OnSysDynamicDeviceInit()

{

//安装钩子

RealRegEnumValue =(long (__cdecl *)(unsigned long,unsigned long,char*,unsigned long *,unsigned long *,unsigned long *,unsigned char *,unsigned long *))

Hook_Device_Service_C(___RegEnumValue,HookRegEnumValue,&thunkREG);

return TRUE;

}

BOOL MyfileDevice::OnSysDynamicDeviceExit()

{

//卸载钩子

Unhook_Device_Service_C(___RegEnumValue, &thunkREG );

return TRUE;

}

4. 钩子函数的处理:下面的例子中隐藏了一个名为"Temp"的键值名。

LONG HookRegEnumValue(HKEY hkey, DWORD iValue, PCHAR lpszValue,PDWORD lpcchValue,

PDWORD lpdwReserved,PDWORD lpdwType, PBYTE lpbData, PDWORD lpcbData)

{

LONG retval;

//先枚举一次

retval = RealRegEnumValue( hkey, iValue, lpszValue, lpcchValue,

lpdwReserved, lpdwType, lpbData, lpcbData );

if( retval == ERROR_SUCCESS && lpbData && *lpcbData )

{

//检测键值名是否为"Temp",是则枚举下个键值:

if (strstr(lpszValue,"Temp")>0)

{

return RealRegEnumValue( hkey, iValue, lpszValue, lpcchValue,lpdwReserved,lpdwType,lpbData,lpcbData);

}

}

return retval;

}

四、说明

1. 这个Vxd是动态的,若改成静态Vxd,效果会更好。

2. 在钩子函数中可以进一步判断枚举出的数据。



--------------------------------------------------------------------------------

©1997-2000 VCKBASE.COM All Rights Reserved.

dongfa 2001-12-19
  • 打赏
  • 举报
回复
那就再写一项内容:记录最后一次运行软件的时间.
在启动软件时检查当前时间是否大于注册表里的最后一次运行的时间,如果小于就表明系统时间已经更改了,就告诉他过期或者其他的.
rockett 2001-12-19
  • 打赏
  • 举报
回复
这样啊?我知道你讲的一般的时间是不修改的,主要是对公司面言。

但对个人用户来讲,修改系统时间是很平常的事情。如果我就这样交了差,老板一时也一定是发觉不了,但我老觉得应该有更好的方法,要不那些主要针对个人的免费试用一段时间后要交钱的软件怎么能赚到钱啊?
dongfa 2001-12-19
  • 打赏
  • 举报
回复
是的,在过期之前改时间那是有效的,过期软件一般都是这样的。
但一般计算机的时间是不修改的。
cmpp 2001-12-19
  • 打赏
  • 举报
回复
我来学习一下!
rockett 2001-12-19
  • 打赏
  • 举报
回复
我这人很笨,我想提一个问题,如果我知道这个软件只能用30天(一般都会让别人知道),那我可以在过期那天到之前就把系统日期改前,那就永远不过期了,是不是这样?就算是注册表里加密了也可以这样啊?
dongfa 2001-12-19
  • 打赏
  • 举报
回复
要对写入注册表的东西进行加密,否则太容易被解密了。
dongfa 2001-12-19
  • 打赏
  • 举报
回复
要写两个东西:
1.写入加密的开始日期
2.写现在是否过期的标志
先判断是否过期了,再判断过期标志。
一旦过期了,就把标志写成TRUE或者其他,这样就算它再把时间改回去,也不起作用的。
georgehuang 2001-12-19
  • 打赏
  • 举报
回复
来学习一下
rockett 2001-12-19
  • 打赏
  • 举报
回复
我本想是用系统日期加密写进注册表里面。但一想不管写什么只要是注册表里的东西用户都可以看到,那用户也都可以改回来。

不知道我的这种说法有没有问题,也请有相同开发经验的朋友提供一些思路。
rockett 2001-12-19
  • 打赏
  • 举报
回复
在注册表里记录什么呢?是第一次运行时的系统日期吗?或是每次运行一次就在注册表里改变一个东西,但用户可以改系统时间啊,我用到过一些软件,就算是改系统日期也是无效的,那是怎么实现的呢?
xiaoxiaohan 2001-12-19
  • 打赏
  • 举报
回复
安装时把安装的时间写入注册表,每次启动程序判断当前时间减去注册表纪录的时间是否大于30天。
profwy 2001-12-19
  • 打赏
  • 举报
回复
在注册表里记录一下

16,472

社区成员

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

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

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