发信人: m9412()
整理人: smallhors(1999-07-18 18:41:12), 站内信件
|
随着人们对软件自我保护意识的加强,加密越来越成为保护自己软件不被非法人 员窃取和偷看的方法。
为此,许多人编写了各种各样的加密软件。但在众多此类软件中,总免不了 使用“密钥”、“口令”等加密方法。这些方法固然很好,但市面上早已出现了 许多反加密软件,可不费吹灰之力,将已被加密的软件解密,从而形成了“道高 一尺,魔高一丈”的局面。这使得许多人开始寻求一种新式的加密方法。笔者在 实践中,经常使用一种自称为“分字符串法”的加密方法。试用了几个月,效果 不错。现将其思路及运用此方法编制的源程序奉献给大家,愿为大家起个“抛砖 引玉”的作用。此方法的思路是:将欲加密程序(以下简称:“欲密”)中的字 符串分解成若干个字符相加的形式,再取得每个字符的ASCII码,最后用CHR() 函数将各个字符连接起来。例如:A=“ABC”,分解后便是A=CHR(65)+CHR(6 6)+CHR(67)。这样既可以保证其正常运行,又能起到加密源程序的作用。若 将“欲密”经上述处理后编译,则效果更佳,在“欲密”中找不到任何字符串。 但考虑到在不破坏“欲密”正常运行的情况下,又要简化加密软件的程序设计, 笔者采用一种折衷的方法,即将“欲密”中想加密的字符串用“‘”、“’”括 起来。这样一来,既可不破坏“欲密”的执行,又可方便地被加密软件所识别。
该程序分两部分。第一部分是界面,提示用户输入源程序和目标程序文件名 ,并进行处理。第二部分是处理模块,用以处理源程序。具体程序如下:
set talk off
do whil .t.
clea
defi wind input_fn from 9,13 to 13,67 ;
shad ;
colo w+/r
defi wind gs from 16,25 to 18,55 ;
shad ;
none ;
colo gr+/g
acti wind gs
@0,13 say'格 式' colo b+/g
@1,3 say'<盘符><路径><文件名><.prg>'
acti wind input_fn
dime fn<2>
stor spac(32) to fn<1>,fn<2>
@0,1 say'请输入源文件名: ' get fn<1>
@2,1 say'请输入目标文件名:' get fn<2>
read
rele wind gs
if read()=12
clea wind
retu
endi
fn<1>=allt(fn<1>)
fn<2>=allt(fn<2>)
f1=fopen(fn<1>) &&打开文件
defi wind err from 14,20 to 16,60 ;
shad ;
colo sche 5
if f1<0 &&判断文件是否存在
acti wind err
dy=19-int((len(fn<1>)+11)/2) &&计算显示列数(为了取中显示)
@0,dy say uppe(fn<1>)+'文件不存在!'
=inke(5,'h')
deac wind err
loop
endi
f2=fcreate(fn<2>,0)
if f2<0
acti wind err
dy=19-int((len(fn<1>)+11)/2)
@0,dy say uppe(fn<2>)+'文件已存在!'
=inke(5,'h')
deac wind err
loop
endi
exit
endd
defi wind dd from 16,29 to 18,51 ;
shad ;
colo w+/g
acti wind dd
@0,1 say'正在处理, 请稍候...'
do whil !feof(f1) &&判断文件指针是否指到文件末尾
oldstr=fget(f1) &&读出一程序行
newstr=cl() &&调用CL(处理)自定义函数
=fput(f2,newstr)
endd
=fclo(f1)
=fclo(f2)
clea
@0,4 say'按任意键返回...'
=inke(0,'h')
clea wind
retu .t.
func cl
jmnstr=oldstr
yhwz1=at('"',oldstr,1)
yhwz2=at('"',oldstr,2)
do whil yhwz1#0
yhwz3=yhwz1+1
yhwz4=yhwz2-1
jmstr=subs(oldstr,yhwz3,yhwz4-yhwz3+1)
jmstr1=''
for strgs=1 to len(jmstr)
jmsasc=asc(subs(jmstr,strgs,1))
jmstr1=jmstr1+'CHR('+allt(str(jmsasc))+')+'
endf
jmstr1=left(jmstr1,len(jmstr1)-1)
jmnstr=left(oldstr,yhwz1-1)+jmstr1+righ(oldstr,len(oldstr)-yh wz2)
oldstr=jmnstr
yhwz1=at('"',oldstr,1)
yhwz2=at('"',oldstr,2)
endd
retu jmnstr
若要将识别符改为“'”,则将程序中的“yhwz1=at('"',oldstr,1)”一句及 其下一句(注意有两处!)
改为“yhwz1=at("'",oldstr,1)”和“yhwz2=at("'",oldstr,2)”或“yhwz 1=at("<",oldstr,1)”和“yhwz2=at(">",oldstr,1)”即可。
以上程序已在UCDOS 5.0、FOXPRO 2.0和2.5下顺利通过。北京 杨扬
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.100.71.68]
|
|