求PB的给自己的程序增加注册机制的源代码

Goshawkx 2004-01-14 05:29:00
自己用pb做了个程序,想增加注册码机制来控制一下。
哪位高手能赐予pb的代码。非常感谢。
...全文
64 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ld2099 2004-01-18
  • 打赏
  • 举报
回复
不过还存在一些问题,
1、可通过下载一个dll文件来取序列号
2、这个源码不是很好。作者在98下能够运行,而我在2000下运行就会出错,而且对字母也无效。
ld2099 2004-01-17
  • 打赏
  • 举报
回复
huoyan21(hy) 的代码很好。
ld2099 2004-01-16
  • 打赏
  • 举报
回复
学习!
Goshawkx 2004-01-15
  • 打赏
  • 举报
回复

我先试试。
huoyan21 2004-01-14
  • 打赏
  • 举报
回复
// 以下参数由RSA加密算法得来

integer li_e, li_d, li_n

li_e = 3 // 设置指数e,加密密钥

li_d = 7 // 设置指数d,解密密钥

li_n = 33 // 设置N:两个素数得乘积

string ls_str

ls_str = Trim(sle_1.text) // 将明文转换成字符串,以便随后进行分组

ulong lul_temp

lul_temp = 0

ulong lul_x, lul_y // lul_x: 加密明文; lul_y: 加密密文

int I

do until ls_str = ""

lul_temp = Integer(left(ls_str, 2))

if lul_temp >= li_n then // 将明文分组,且每组均小于N(N=33)

lul_temp = Integer(left(ls_str, 1))

ls_str = right(ls_str, len(ls_str)-1)

else

ls_str = right(ls_str, len(ls_str)-2)

end if

lul_y = 1

for I = 1 to li_e // 进行乘方运算

lul_y = lul_y * lul_temp

next

lul_y = mod( lul_y, 33) // 根据加密公式计算密文

sle_2.text = trim(sle_2.text) + string(lul_y) // sle_2.tex中存放的是加密后的密文

loop

/******************** 结束 *****************/

/**************** 解密程序代码 ***************/

ls_str = Trim(sle_2.text) // 与加密同理,将密文转换成字符串,以便随后进行分组

ulong lul_x0, lul_x1

do until ls_str = ""

lul_temp = Integer(left(ls_str, 2))

if lul_temp >= li_n then // 将密文分组,且每组均小于N(N=33)

lul_temp = Integer(left(ls_str, 1))

ls_str = right(ls_str, len(ls_str)-1)

else

ls_str = right(ls_str, len(ls_str)-2)

end if

// 由于考虑到乘方运算得结果可能会超出数值所允许得最大取值,

// 因此对解密公式进行适当转换,lul_x = lul_x0 * lul_x1

lul_x0 = 1

lul_x1 = 1

// 假如解密密钥是7,则先进行数的4次方运算取模,在进行数的3次方运算取模

for I = 1 to 4

lul_x0 = lul_x0 * lul_temp

next

lul_x0 = mod( lul_x0, 33)

for I = 1 to li_d - 4

lul_x1 = lul_x1 * lul_temp

next

lul_x1 = mod( lul_x1, 33)

lul_x = mod(lul_x0 * lul_x1, 33) // 根据解密公式计算明文

sle_3.text = trim(sle_3.text) + string(lul_x) // sle_3.tex中存放的是解密后的明文

loop

/******************** 结束 *****************/

  总结,文中所提供的程序代码已经在PowerBuilder 7.0,Windows 98环境下运行通过。本文所讨论的通过读取硬盘序列号方法来实现程序加密技
术同样可以运用到其它程序语言中,只是具体的实现方法略有差异罢了。由于本人水平有限,错误和不足之处再所难免,因此还敬请同行们给予指
教。

huoyan21 2004-01-14
  • 打赏
  • 举报
回复
一、如何读取硬盘序列号

  要读取硬盘序列号我们可以用汇编来实现,但毕竟不容易,况且也不能有效的结合到PB脚本中。在PB中我们可以通过调用Windows提供的外部函数
GetVolumeInformationA()来实现。这相对来说比较简单。

  该函数的原型为:

  BOOL GetVolumeInformation(

  LPCTSTR lpRootPathName,

  LPTSTR lpVolumeNameBuffer,

  DWORD nVolumeNameSize,

  LPDWORD lpVolumeSerialNumber,

  LPDWORD lpMaximumComponentLength,

  LPDWORD lpFileSystemFlags,

  LPTSTR lpFileSystemNameBuffer,

  DWORD nFileSystemNameSize

  上述原型中,参数类型只要是以"LP-"开头的表明该参数用的是长指针(Long Pointer)类型,即在PB中调用时的参数传递是通过引用传递。在8
个参数中对我们真正有用的只有两个LPCTSTR lpRootPathName和LPDWORD lpVolumeSerialNumber。其中参数lpRootPathName是指向文件系统根目录的
地址,我们需要用它来指明所要获取序列号的硬盘盘符;参数lpVolumeSerialNumber是返回的硬盘序列号的地址,这正是我们需要的。

  众所周知,PB在调用任何外部函数前都要首先进行函数声明,可以将声明放在全局或局部函数声明中。具体声明如下:

  Function Boolean GetVolumeInformationA( &

  ref String ls_Rootpath, &

  ref String ls_volumnename, &

  Ulong lul_VolumeNameSize, ref Ulong lul_VolumeSerialNumber, &

  ref Ulong lul_MaximumComponentLength, &

  ref Ulong lul_FileSystemFlags, &

  ref String ls_FileSystemNameBuffer, &

  Ulong lul_FileSystemNameSize &

  ) Library "Kernel32.dll"



  上述声明中,"ref"指明是该参数是通过引用传递的,有关函数引用的详细内容请参见有关教程。声明完毕我们不能马上进行调用,还必需确保已
为它分配足够的内存空间,即使是参数引用传递也是这样,否则的话将会出现调用错误,这跟C语言的引用调用不同,这一点往往被忽视,希望读者能
够注意。也就是为什么我在调用该函数前将有些字符串参数给它预先分配了多达256个字符空间以及给一些整型类型的参数赋初始值256。完整的读取
硬盘序列号的程序代码如下:

/******************* 程序代码 ************************/

String ls_Rootpath, ls_volumnename

ls_Rootpath = "C:" // 指定要得到序列号的硬盘,

// 一般情况都是C盘,除非你能保证用户存在其它逻辑盘或物理盘

ls_volumnename = Space(256) // 分配足够的空间,下同

Ulong lul_VolumeNameSize

lul_VolumeNameSize = 256

Ulong lul_VolumeSerialNumber, lul_MaximumComponentLength, lul_FileSystemFlags

lul_MaximumComponentLength = 256

String ls_FileSystemNameBuffer

ls_FileSystemNameBuffer = space(256)

Ulong lul_FileSystemNameSize

lul_FileSystemNameSize = 256

beep(1)

boolean lb_rtn

lb_rtn = False

lb_rtn = GetVolumeInformationA(ls_Rootpath, ls_volumnename, lul_VolumeNameSize,

lul_VolumeSerialNumber, lul_MaximumComponentLength, lul_FileSystemFlags,

ls_FileSystemNameBuffer, lul_FileSystemNameSize)

if lb_rtn = true then

MessageBox("提示","函数调用成功!")

else

MessageBox("提示","函数调用失败!")

end if

sle_1.text = String(lul_VolumeSerialNumber) // 得到硬盘序列号

/********************* 结束 *************************/

yanghongfeng 2004-01-14
  • 打赏
  • 举报
回复
我用的是提取硬盘的物理id号,得到十进制的值后与一个字符的十进制的值进行取余后,得到的一串字符中的后面的几个字符为注册码。
只供参考。源代码我现在手里没有。

399

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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