发信人: 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]
  | 
 
 
 |