Skip to content

Commit 873a4bc

Browse files
committed
Fix collision of new name with original name
Fix yck1509#429
1 parent 8c15c91 commit 873a4bc

1 file changed

Lines changed: 48 additions & 34 deletions

File tree

Confuser.Renamer/NameService.cs

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ internal class NameService : INameService {
4646
readonly RandomGenerator random;
4747
readonly VTableStorage storage;
4848
AnalyzePhase analyze;
49+
50+
readonly HashSet<string> identifiers = new HashSet<string>();
4951
readonly byte[] nameId = new byte[8];
5052
readonly Dictionary<string, string> nameMap1 = new Dictionary<string, string>();
5153
readonly Dictionary<string, string> nameMap2 = new Dictionary<string, string>();
@@ -128,17 +130,7 @@ void IncrementNameId() {
128130
}
129131
}
130132

131-
public string ObfuscateName(string name, RenameMode mode) {
132-
if (string.IsNullOrEmpty(name))
133-
return string.Empty;
134-
135-
if (mode == RenameMode.Empty)
136-
return "";
137-
if (mode == RenameMode.Debug)
138-
return "_" + name;
139-
140-
byte[] hash = Utils.Xor(Utils.SHA1(Encoding.UTF8.GetBytes(name)), nameSeed);
141-
133+
string ObfuscateNameInternal(byte[] hash, RenameMode mode) {
142134
switch (mode) {
143135
case RenameMode.Empty:
144136
return "";
@@ -148,32 +140,52 @@ public string ObfuscateName(string name, RenameMode mode) {
148140
return Utils.EncodeString(hash, letterCharset);
149141
case RenameMode.ASCII:
150142
return Utils.EncodeString(hash, asciiCharset);
151-
case RenameMode.Decodable: {
152-
if (nameMap1.ContainsKey(name))
153-
return nameMap1[name];
143+
case RenameMode.Decodable:
154144
IncrementNameId();
155-
var newName = Utils.EncodeString(hash, alphaNumCharset);
156-
nameMap2[newName] = name;
157-
nameMap1[name] = newName;
158-
return newName;
159-
}
160-
case RenameMode.Sequential: {
161-
if (nameMap1.ContainsKey(name))
162-
return nameMap1[name];
145+
return Utils.EncodeString(hash, alphaNumCharset);
146+
case RenameMode.Sequential:
163147
IncrementNameId();
164-
var newName = Utils.EncodeString(nameId, alphaNumCharset);
165-
nameMap2[newName] = name;
166-
nameMap1[name] = newName;
167-
return newName;
168-
}
169-
case RenameMode.Reversible: {
170-
if (reversibleRenamer == null)
171-
throw new ArgumentException("Password not provided for reversible renaming.");
172-
var newName = reversibleRenamer.Encrypt(name);
173-
return newName;
174-
}
148+
return Utils.EncodeString(nameId, alphaNumCharset);
149+
default:
150+
151+
throw new NotSupportedException("Rename mode '" + mode + "' is not supported.");
175152
}
176-
throw new NotSupportedException("Rename mode '" + mode + "' is not supported.");
153+
}
154+
155+
public string ObfuscateName(string name, RenameMode mode) {
156+
string newName = null;
157+
158+
if (string.IsNullOrEmpty(name))
159+
return string.Empty;
160+
161+
if (mode == RenameMode.Empty)
162+
return "";
163+
if (mode == RenameMode.Debug)
164+
return "_" + name;
165+
if (mode == RenameMode.Reversible) {
166+
if (reversibleRenamer == null)
167+
throw new ArgumentException("Password not provided for reversible renaming.");
168+
newName = reversibleRenamer.Encrypt(name);
169+
return newName;
170+
}
171+
172+
if (nameMap1.ContainsKey(name))
173+
return nameMap1[name];
174+
175+
byte[] hash = Utils.Xor(Utils.SHA1(Encoding.UTF8.GetBytes(name)), nameSeed);
176+
for (int i = 0; i < 100; i++) {
177+
newName = ObfuscateNameInternal(hash, mode);
178+
if (!identifiers.Contains(newName))
179+
break;
180+
hash = Utils.SHA1(hash);
181+
}
182+
183+
if ((mode & RenameMode.Decodable) != 0) {
184+
nameMap2[newName] = name;
185+
nameMap1[name] = newName;
186+
}
187+
188+
return newName;
177189
}
178190

179191
public string RandomName() {
@@ -185,10 +197,12 @@ public string RandomName(RenameMode mode) {
185197
}
186198

187199
public void SetOriginalName(object obj, string name) {
200+
identifiers.Add(name);
188201
context.Annotations.Set(obj, OriginalNameKey, name);
189202
}
190203

191204
public void SetOriginalNamespace(object obj, string ns) {
205+
identifiers.Add(ns);
192206
context.Annotations.Set(obj, OriginalNamespaceKey, ns);
193207
}
194208

0 commit comments

Comments
 (0)