现在的位置: 首页 > 综合 > 正文

VFP的代码混淆器,只在VFP9下运行正常

2012年11月12日 ⁄ 综合 ⁄ 共 4965字 ⁄ 字号 评论关闭
这是个原型,只能对PRG文件进行混淆,还未完善。

阿明的FOXSHELL看界面有 代码混淆功能,应是很好。

但我的需要,有些不同,要公开部分代码、公开部分二次开发接口,LEONID的混淆器只能
对EXE/APP处理,且BUG不小, 自主的混淆器暂时还是必须的。

  1
  2*- OBFUSCATOR ----------------------------------------------------------------------------------------------------
  3*-
  4*-    功能: 针对 PRG代码|代码串的 混淆器,只混淆local定义和lParameters定义。
  5*-
  6*-
  7*-    现行的算法: 只是替换 LOCAL定义和lParameters定义中变量。这两个关键字必须写全,不能缩写。
  8*-    替换的必须是 独立的“词”,以cSep来界定。 
  9*-
 10*-  未解决的问题: 
 11*-
 12*-        1. 能会误将 字符串中字符 的与local定义同形的 也混了。算法上应区别 textmerge等
 13*-             字符串中,不替换  
 14*-                    除非:  (1)在textmerge中 and <>之内;
 15*-                            (2& 之后
 16*-                            (3)type('')之内
 17*-                            (4)形如: evaluate('oObj.name') 中的oObj
 18*-                            (5
 19*-
 20*-           这个算法未做,但影响不大,只是某些情况下有字符串会乱了。 
 21*-
 22*-        2. 个funciton一起时. 应分开FUNCTION、分段处理的,目前是混在一起。有可能出错
 23*-      3. 换后,可能做成行长大于255。但vfp9好象没有行长限制了。
 24*-        4. 以分号续行的情况,未有考虑。
 25*-        5. 生成随机的变量名,除0o之外,应有其他选项。
 26*--------------------------------------------------------------------------------------------------------------------
 27
 28
 29Local cFile,cSep,cCode,aXtbl[1,2],i,j,k,cLine,cBin,nIdx,cVarDefKeyWord,cVarName,cVarCnt,nPos,cTmpCodes,cTmpLine
 30Local nIdx,cVarDefKeyWord,cVarName,cVarCnt,nPos,cTmpCodes,cTmpLine
 31
 32
 33*cFile = Getfile('prg')
 34*cFile = 'D:\02WORKSHOP\YXERP01\01STD\TEST\abc.PRG'
 35cFile = 'D:\02WORKSHOP\YXERP01\01STD\source\通用函数.PRG'
 36If Empty(cFile)
 37    Return .F.
 38EndIf
 39
 40*--
 41cCode=Filetostr(cFile)
 42cSep = Chr(13)+Chr(10)+Chr(9)+"()=+-*/&@<>.',%[] "+'"'
 43
 44*-- 1. 去掉注解-------------------------------------------------- 
 45cTmpCodes=''
 46For i=1 to GetWordCount(cCode,Chr(13)+Chr(10))
 47    cLine = Ltrim(GetWordNum(cCode,i,Chr(13)+Chr(10)) ,1,Chr(9),' ')
 48    If     Left( cLine,1= '*'
 49        Loop
 50    EndIf 
 51    
 52    nPos = At('&'+'&',cLine)
 53    If nPos > 0
 54        cTmp = Substr(cLine,1,nPos-1)
 55        If Occurs("'",cTmp)%2=0 and Occurs('"',cTmp)%2=0 &&不在字符串中
 56            cLine = cTmp
 57        EndIf 
 58    EndIf     
 59    
 60    cTmpCodes = cTmpCodes + Chr(13)+Chr(10+ cLine
 61Next 
 62cCode = cTmpCodes
 63
 64
 65
 66*-- 2.  取得local 及 lparameters 定义,生成对照表-------------------------------
 67cVarDefKeyWord='local'
 68nIdx = 0
 69Do While .T.
 70    nIdx = nIdx + 1
 71    nPos = Atc(cVarDefKeyWord,cCode,nIdx)
 72    If nPos = 0 
 73        If cVarDefKeyWord='local'
 74            cVarDefKeyWord='lparameters'
 75            nIdx = 0
 76            Loop 
 77        Else
 78            Exit            
 79        EndIf     
 80    Endif
 81
 82    cLine = Substr(cCode,nPos-1,500)
 83    cLine = Left( cLine, At(Chr(13),cLine))
 84    If Not Inlist(Left(cLine,1),Chr(10),Chr(13),' ')
 85        Loop
 86    EndIf
 87    
 88    cLine = Substr(cLine,Len(cVarDefKeyWord)+2)
 89
 90    If At('[',cLine)>0 or At('(',cLine)>0 &&array handling 
 91        cLine = Chrtran( cLine,'[]()', '****' )
 92        cTmpLine=''
 93        For i=1 to GetWordCount(cLine,'*')
 94            cTmp = Alltrim(GetWordNum(cLine,i,'*'),1,Chr(9),' ')
 95            If IsDigit(cTmp)
 96                Loop
 97            EndIf 
 98            cTmpLine = cTmpLine + cTmp 
 99        Next
100        cLine =  cTmpLine        
101    EndIf 
102    *---
103    
104    For i=1 To Getwordcount(cLine,',')
105        cVarName = Lower( Alltrim(Getwordnum(cLine,i,','),1,Chr(10),Chr(9),Chr(13),' ') )
106        cVarName =  GetWordNum(cVarName,1 ,'([')
107        If Ascan(aXTbl,cVarName,1,0,1,2+4)>0
108            Loop 
109        EndIf     
110        
111        If Vartype(aXtbl(1))<>'L'
112            Declare aXtbl( Alen(aXTbl,1)+12)
113        EndIf      
114        
115        aXTbl(Alen(aXtbl,1),1= cVarName 
116        cBin = ''
117        For j=30 To 0 Step -1
118            cBin = cBin + Iif(Bittest(Rand()*100000000,i),'0','o')
119        Next
120        aXTbl(Alen(aXtbl,1),2= 'o' + cBin
121        
122        wait window nowait '取得变量:  ' + padr(cVarName + ' ---> ' + 'o'+cBin,50)
123    Next
124Enddo
125
126
127*--3.   替换变量.o0o0o0o0o0oooo000 --------------------------------------
128For i=1 To Alen(aXTbl,1)
129    If Vartype(aXtbl(i,1))='L'
130        Loop
131    Endif
132
133    nIdx = 1
134    Do While .T.
135        nPos = Atc(aXtbl(i,1),cCode,nIdx)
136        If nPos=0
137            Exit
138        Endif
139
140        nBeforeChar = Substr(cCode,nPos-1,1)
141        nAfterChar = Substr(cCode,nPos+Len(aXtbl(i,1)),1)
142        If Not (nBeforeChar $ cSep Or Empty(nBeforeChar)) or ;
143                Not (nAfterChar $ cSep Or Empty(nAfterChar))
144
145            nIdx = nIdx + 1
146            Loop
147        Endif
148        *-----
149        cCode =  Left(cCode, nPos-1+ aXTbl(i,2+ Substr(cCode,nPos + Len(aXTbl(i,1)) )
150    EndDo
151
152    wait window nowait 'obfuscating  ' +  Str( i / Alen(aXTbl,1)*100,5,2) +' %  ' && +cVarName + ' ---> ' + 'o'+cBin
153Next
154
155StrToFile(cCode,'obfuscated.prg')
156Wait clear 
157
158Modify Command obfuscated.prg
159
160
161
162
163        
164

抱歉!评论已关闭.