Fix a problem with String.StartsWith() on mono

This commit is contained in:
de4dot 2011-10-09 13:19:26 +02:00
parent 8469b84cc2
commit 08f5b04675
6 changed files with 16 additions and 8 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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;
}