这是个原型,只能对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
29
Local cFile,cSep,cCode,aXtbl[1,2],i,j,k,cLine,cBin,nIdx,cVarDefKeyWord,cVarName,cVarCnt,nPos,cTmpCodes,cTmpLine
30
Local nIdx,cVarDefKeyWord,cVarName,cVarCnt,nPos,cTmpCodes,cTmpLine
31
32
33
*cFile = Getfile('prg')
34
*cFile = 'D:\02WORKSHOP\YXERP01\01STD\TEST\abc.PRG'
35
cFile = 'D:\02WORKSHOP\YXERP01\01STD\source\通用函数.PRG'
36
If Empty(cFile)
37
Return .F.
38
EndIf
39
40
*--
41
cCode=Filetostr(cFile)
42
cSep = Chr(13)+Chr(10)+Chr(9)+"()=+-*/&@<>.',%[] "+'"'
43
44
*-- 1. 去掉注解--------------------------------------------------
45
cTmpCodes=''
46
For 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
61
Next
62
cCode = cTmpCodes
63
64
65
66
*-- 2. 取得local 及 lparameters 定义,生成对照表-------------------------------
67
cVarDefKeyWord='local'
68
nIdx = 0
69
Do 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)+1, 2)
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
124
Enddo
125
126
127
*--3. 替换变量
.o0o0o0o0o0oooo000 --------------------------------------
128
For 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
153
Next
154
155
StrToFile(cCode,'obfuscated.prg')
156
Wait clear
157
158
Modify Command obfuscated.prg
159
160
161
162
163
164
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164