diff --git a/de4dot.code/FilesDeobfuscator.cs b/de4dot.code/FilesDeobfuscator.cs index c972e69d..d6a5563e 100644 --- a/de4dot.code/FilesDeobfuscator.cs +++ b/de4dot.code/FilesDeobfuscator.cs @@ -268,7 +268,7 @@ namespace de4dot { var inDir = Utils.getFullPath(searchDir.InputDirectory); var outDir = Utils.getFullPath(searchDir.OutputDirectory); - if (!fileOptions.Filename.StartsWith(inDir, StringComparison.OrdinalIgnoreCase)) + if (!Utils.StartsWith(fileOptions.Filename, inDir, StringComparison.OrdinalIgnoreCase)) throw new UserException(string.Format("Filename {0} does not start with inDir {1}", fileOptions.Filename, inDir)); var subDirs = fileOptions.Filename.Substring(inDir.Length); diff --git a/de4dot.code/ObfuscatedFile.cs b/de4dot.code/ObfuscatedFile.cs index 7010af03..99ef2565 100644 --- a/de4dot.code/ObfuscatedFile.cs +++ b/de4dot.code/ObfuscatedFile.cs @@ -326,7 +326,7 @@ namespace de4dot { foreach (var val in options.StringDecrypterMethods) { var tokenStr = val.Trim(); - if (tokenStr.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + if (Utils.StartsWith(tokenStr, "0x", StringComparison.OrdinalIgnoreCase)) tokenStr = tokenStr.Substring(2); int methodToken; if (int.TryParse(tokenStr, NumberStyles.HexNumber, null, out methodToken)) @@ -398,14 +398,14 @@ namespace de4dot { remaining = ""; } - if (remaining.StartsWith("(", StringComparison.Ordinal)) { + if (Utils.StartsWith(remaining, "(", StringComparison.Ordinal)) { stringArgs = remaining; } else if (remaining.Length > 0) throw new UserException(string.Format("Invalid method desc: '{0}'", methodDesc)); if (stringArgs != null) { - if (stringArgs.StartsWith("(", StringComparison.Ordinal)) + if (Utils.StartsWith(stringArgs, "(", StringComparison.Ordinal)) stringArgs = stringArgs.Substring(1); if (stringArgs.EndsWith(")", StringComparison.Ordinal)) stringArgs = stringArgs.Substring(0, stringArgs.Length - 1); diff --git a/de4dot.code/Utils.cs b/de4dot.code/Utils.cs index dff2d724..65f7967d 100644 --- a/de4dot.code/Utils.cs +++ b/de4dot.code/Utils.cs @@ -183,5 +183,13 @@ namespace de4dot { Log.log(logLevel, line); Log.log(logLevel, "\n\nStack trace:\n{0}", ex.StackTrace); } + + // This fixes a mono (tested 2.10.5) String.StartsWith() bug. NB: stringComparison must be + // Ordinal or OrdinalIgnoreCase! + public static bool StartsWith(string left, string right, StringComparison stringComparison) { + if (left.Length < right.Length) + return false; + return left.Substring(0, right.Length).Equals(right, stringComparison); + } } } diff --git a/de4dot.code/deobfuscators/DeobfuscatorBase.cs b/de4dot.code/deobfuscators/DeobfuscatorBase.cs index 478d717c..87959fee 100644 --- a/de4dot.code/deobfuscators/DeobfuscatorBase.cs +++ b/de4dot.code/deobfuscators/DeobfuscatorBase.cs @@ -398,7 +398,7 @@ namespace de4dot.deobfuscators { foreach (var name in namesToPossiblyRemove) { foreach (var moduleRef in module.ModuleReferences) { - if (moduleRef.Name.StartsWith(name, StringComparison.OrdinalIgnoreCase)) + if (Utils.StartsWith(moduleRef.Name, name, StringComparison.OrdinalIgnoreCase)) addModuleReferenceToBeRemoved(moduleRef, reason); } } diff --git a/de4dot.code/deobfuscators/SmartAssembly/Deobfuscator.cs b/de4dot.code/deobfuscators/SmartAssembly/Deobfuscator.cs index cc23f29a..d38e60f9 100644 --- a/de4dot.code/deobfuscators/SmartAssembly/Deobfuscator.cs +++ b/de4dot.code/deobfuscators/SmartAssembly/Deobfuscator.cs @@ -142,7 +142,7 @@ namespace de4dot.deobfuscators.SmartAssembly { void findSmartAssemblyAttributes() { foreach (var type in module.Types) { - if (type.FullName.StartsWith("SmartAssembly.Attributes.PoweredByAttribute", StringComparison.Ordinal)) { + if (Utils.StartsWith(type.FullName, "SmartAssembly.Attributes.PoweredByAttribute", StringComparison.Ordinal)) { foundSmartAssemblyAttribute = true; addAttributeToBeRemoved(type, "Obfuscator attribute"); initializeVersion(type); diff --git a/de4dot.code/renamer/Module.cs b/de4dot.code/renamer/Module.cs index 369df002..daa184d4 100644 --- a/de4dot.code/renamer/Module.cs +++ b/de4dot.code/renamer/Module.cs @@ -78,7 +78,7 @@ namespace de4dot.renamer { } static string renameResourceString(string s, string oldTypeName, string newTypeName) { - if (!s.StartsWith(oldTypeName, StringComparison.Ordinal)) + if (!Utils.StartsWith(s, oldTypeName, StringComparison.Ordinal)) return s; if (s.Length == oldTypeName.Length) return newTypeName; @@ -152,7 +152,7 @@ namespace de4dot.renamer { bool isValid = false; foreach (var validName in validResourceNames) { - if (validName.StartsWith(oldName, StringComparison.Ordinal)) { + if (Utils.StartsWith(validName, oldName, StringComparison.Ordinal)) { isValid = true; break; }