private int DecryptStrings(ModuleDef moduleDef, IMDTokenProvider decryptionMethod, IFullName declaringType) { var assembly = Assembly.LoadFile(moduleDef.Location); var decryptCount = 0; foreach (var type in moduleDef.Types) { foreach (var method in type.Methods) { if (!method.HasBody || !method.Body.HasInstructions) continue; var instructions = method.Body.Instructions; for (var i = 0; i < instructions.Count; i++) { if (instructions[i].OpCode != OpCodes.Ldstr) continue; if (instructions[i + 1].OpCode != OpCodes.Ldstr) continue; if (!instructions[i + 2].Operand.ToString(). Equals(decryptionMethod.ToString())) continue; var param1 = instructions[i].Operand.ToString(); var param2 = instructions[i + 1].Operand.ToString(); var methodType = assembly.GetType(declaringType.Name); if (methodType == null) continue; var metaData = decryptionMethod.MDToken.ToInt32(); var methodBase = methodType.Module.ResolveMethod(metaData); if (methodBase == null) continue; var parameters = methodBase.GetParameters(); if (parameters.Length == 0) continue; var result = methodBase.Invoke(null, new object[] { param1, param2 }); var body = method.Body; body.Instructions[i].OpCode = OpCodes.Ldstr; body.Instructions[i].Operand = result.ToString(); body.Instructions.RemoveAt(i + 1); body.Instructions.RemoveAt(i + 1); decryptCount++; } } } return decryptCount; }
private int DecryptStrings(ModuleDef moduleDef, IMDTokenProvider decryptionMethod, IFullName declaringType) { var assembly = Assembly.LoadFile(moduleDef.Location); var decryptCount = 0; foreach (var type in moduleDef.Types) { foreach (var method in type.Methods) { if (!method.HasBody || !method.Body.HasInstructions) { continue; } var instructions = method.Body.Instructions; for (var i = 0; i < instructions.Count; i++) { if (instructions[i].OpCode != OpCodes.Ldstr) { continue; } if (instructions[i + 1].OpCode != OpCodes.Ldstr) { continue; } if (!instructions[i + 2].Operand.ToString(). Equals(decryptionMethod.ToString())) { continue; } var param1 = instructions[i].Operand.ToString(); var param2 = instructions[i + 1].Operand.ToString(); var methodType = assembly.GetType(declaringType.Name); if (methodType == null) { continue; } var metaData = decryptionMethod.MDToken.ToInt32(); var methodBase = methodType.Module.ResolveMethod(metaData); if (methodBase == null) { continue; } var parameters = methodBase.GetParameters(); if (parameters.Length == 0) { continue; } var result = methodBase.Invoke(null, new object[] { param1, param2 }); var body = method.Body; body.Instructions[i].OpCode = OpCodes.Ldstr; body.Instructions[i].Operand = result.ToString(); body.Instructions.RemoveAt(i + 1); body.Instructions.RemoveAt(i + 1); decryptCount++; } } } return(decryptCount); }