diff --git a/AssemblyData/AssemblyData.csproj b/AssemblyData/AssemblyData.csproj index 919753d1..10fd66a4 100644 --- a/AssemblyData/AssemblyData.csproj +++ b/AssemblyData/AssemblyData.csproj @@ -37,6 +37,7 @@ + @@ -46,6 +47,16 @@ + + + {045B96F2-AF80-4C4C-8D27-E38635AC705E} + blocks + + + {D68133BD-1E63-496E-9EDE-4FBDBF77B486} + Mono.Cecil + + + \ No newline at end of file diff --git a/de4dot.code/CommandLineParser.cs b/de4dot.code/CommandLineParser.cs index 2b87d905..bb7b4ec1 100644 --- a/de4dot.code/CommandLineParser.cs +++ b/de4dot.code/CommandLineParser.cs @@ -78,6 +78,7 @@ namespace de4dot { stringDecrypterTypes.add(DecrypterType.None, "none", "Don't decrypt strings"); stringDecrypterTypes.add(DecrypterType.Static, "static", "Use static string decrypter if available"); stringDecrypterTypes.add(DecrypterType.Delegate, "delegate", "Use a delegate to call the real string decrypter"); + stringDecrypterTypes.add(DecrypterType.Emulate, "emulate", "Call real string decrypter and emulate certain instructions"); } public CommandLineParser(IList deobfuscatorInfos, FilesDeobfuscator.Options filesOptions) { diff --git a/de4dot.code/IObfuscatedFile.cs b/de4dot.code/IObfuscatedFile.cs index dcb0272e..5a854c6a 100644 --- a/de4dot.code/IObfuscatedFile.cs +++ b/de4dot.code/IObfuscatedFile.cs @@ -26,6 +26,7 @@ namespace de4dot { None, Static, Delegate, + Emulate, } interface IObfuscatedFile { diff --git a/de4dot.code/ObfuscatedFile.cs b/de4dot.code/ObfuscatedFile.cs index 5e4831c1..30adf84b 100644 --- a/de4dot.code/ObfuscatedFile.cs +++ b/de4dot.code/ObfuscatedFile.cs @@ -239,6 +239,7 @@ namespace de4dot { break; case DecrypterType.Delegate: + case DecrypterType.Emulate: checkSupportedStringDecrypter(StringFeatures.AllowDynamicDecryption); assemblyClient = assemblyClientFactory.create(); assemblyClient.connect(); @@ -272,6 +273,8 @@ namespace de4dot { if (options.StringDecrypterType == DecrypterType.Delegate) assemblyClient.Service.setStringDecrypterType(AssemblyData.StringDecrypterType.Delegate); + else if (options.StringDecrypterType == DecrypterType.Emulate) + assemblyClient.Service.setStringDecrypterType(AssemblyData.StringDecrypterType.Emulate); else throw new ApplicationException(string.Format("Invalid string decrypter type '{0}'", options.StringDecrypterType)); @@ -415,8 +418,11 @@ namespace de4dot { var blocks = new Blocks(method); deob.deobfuscateMethodBegin(blocks); - if (options.ControlFlowDeobfuscation) - blocks.deobfuscate(); + if (options.ControlFlowDeobfuscation) { + int numDeadBlocks = blocks.deobfuscate(); + if (numDeadBlocks > 0) + Log.v("Removed {0} dead block(s)", numDeadBlocks); + } deobfuscateStrings(blocks); deob.deobfuscateMethodEnd(blocks); if (options.ControlFlowDeobfuscation) @@ -444,6 +450,7 @@ namespace de4dot { break; case DecrypterType.Delegate: + case DecrypterType.Emulate: dynamicStringDecrypter.decrypt(blocks); break; diff --git a/de4dot.code/Utils.cs b/de4dot.code/Utils.cs index fcb90647..6645b65f 100644 --- a/de4dot.code/Utils.cs +++ b/de4dot.code/Utils.cs @@ -173,19 +173,5 @@ namespace de4dot { public static string getPathOfOurFile(string filename) { return Path.Combine(getOurBaseDir(), filename); } - - public static IDictionary createObjectToIndexDictionary(IList objs) { - var dict = new Dictionary(); - for (int i = 0; i < objs.Count; i++) - dict[objs[i]] = i; - return dict; - } - - public static List convert(IEnumerable list) where TIn : TOut { - var olist = new List(); - foreach (var l in list) - olist.Add(l); - return olist; - } } } diff --git a/de4dot.code/de4dot.code.csproj b/de4dot.code/de4dot.code.csproj index 53b5c787..f170e897 100644 --- a/de4dot.code/de4dot.code.csproj +++ b/de4dot.code/de4dot.code.csproj @@ -54,27 +54,12 @@ - - - - - - - - - - - - - - - - + @@ -102,11 +87,9 @@ - - @@ -134,6 +117,10 @@ {FBD84077-9D35-41FE-89DF-8D79EFE0B595} AssemblyData + + {045B96F2-AF80-4C4C-8D27-E38635AC705E} + blocks + {D68133BD-1E63-496E-9EDE-4FBDBF77B486} Mono.Cecil diff --git a/de4dot.code/deobfuscators/CliSecure/Deobfuscator.cs b/de4dot.code/deobfuscators/CliSecure/Deobfuscator.cs index c129a193..7dfae7d5 100644 --- a/de4dot.code/deobfuscators/CliSecure/Deobfuscator.cs +++ b/de4dot.code/deobfuscators/CliSecure/Deobfuscator.cs @@ -264,7 +264,7 @@ namespace de4dot.deobfuscators.CliSecure { if (resource == null) return; - DotNetUtils.decryptAndAddResources(module, resource.Name, () => decryptResource(resource)); + DeobUtils.decryptAndAddResources(module, resource.Name, () => decryptResource(resource)); addResourceToBeRemoved(resource, "Encrypted resource"); if (rsrcDecryptMethod != null) diff --git a/de4dot.code/deobfuscators/DeobUtils.cs b/de4dot.code/deobfuscators/DeobUtils.cs new file mode 100644 index 00000000..f326ab94 --- /dev/null +++ b/de4dot.code/deobfuscators/DeobUtils.cs @@ -0,0 +1,22 @@ +using System; +using System.IO; +using Mono.Cecil; + +namespace de4dot.deobfuscators { + static class DeobUtils { + public static void decryptAndAddResources(ModuleDefinition module, string encryptedName, Func decryptResource) { + Log.v("Decrypting resources, name: {0}", Utils.toCsharpString(encryptedName)); + var decryptedResourceData = decryptResource(); + if (decryptedResourceData == null) + throw new ApplicationException("decryptedResourceData is null"); + var resourceModule = ModuleDefinition.ReadModule(new MemoryStream(decryptedResourceData)); + + Log.indent(); + foreach (var rsrc in resourceModule.Resources) { + Log.v("Adding decrypted resource {0}", Utils.toCsharpString(rsrc.Name)); + module.Resources.Add(rsrc); + } + Log.deIndent(); + } + } +} diff --git a/de4dot.code/deobfuscators/Eazfuscator/Deobfuscator.cs b/de4dot.code/deobfuscators/Eazfuscator/Deobfuscator.cs index 4c5b1589..cd83320c 100644 --- a/de4dot.code/deobfuscators/Eazfuscator/Deobfuscator.cs +++ b/de4dot.code/deobfuscators/Eazfuscator/Deobfuscator.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using Mono.Cecil; using Mono.Cecil.Cil; +using de4dot.blocks; namespace de4dot.deobfuscators.Eazfuscator { class DeobfuscatorInfo : DeobfuscatorInfoBase { diff --git a/de4dot.code/deobfuscators/SmartAssembly/AssemblyResolverInfo.cs b/de4dot.code/deobfuscators/SmartAssembly/AssemblyResolverInfo.cs index 2833daf4..bf9b8934 100644 --- a/de4dot.code/deobfuscators/SmartAssembly/AssemblyResolverInfo.cs +++ b/de4dot.code/deobfuscators/SmartAssembly/AssemblyResolverInfo.cs @@ -22,6 +22,7 @@ using System.Collections.Generic; using System.Text; using Mono.Cecil; using Mono.Cecil.Cil; +using de4dot.blocks; namespace de4dot.deobfuscators.SmartAssembly { class AssemblyResolverInfo : ResolverInfoBase { diff --git a/de4dot.code/deobfuscators/SmartAssembly/AutomatedErrorReportingFinder.cs b/de4dot.code/deobfuscators/SmartAssembly/AutomatedErrorReportingFinder.cs index 3150c29e..8b000f24 100644 --- a/de4dot.code/deobfuscators/SmartAssembly/AutomatedErrorReportingFinder.cs +++ b/de4dot.code/deobfuscators/SmartAssembly/AutomatedErrorReportingFinder.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using Mono.Cecil; using Mono.Cecil.Cil; +using de4dot.blocks; namespace de4dot.deobfuscators.SmartAssembly { class AutomatedErrorReportingFinder { diff --git a/de4dot.code/deobfuscators/SmartAssembly/MemoryManagerInfo.cs b/de4dot.code/deobfuscators/SmartAssembly/MemoryManagerInfo.cs index f36df1b2..8a523011 100644 --- a/de4dot.code/deobfuscators/SmartAssembly/MemoryManagerInfo.cs +++ b/de4dot.code/deobfuscators/SmartAssembly/MemoryManagerInfo.cs @@ -18,6 +18,7 @@ */ using Mono.Cecil; +using de4dot.blocks; namespace de4dot.deobfuscators.SmartAssembly { class MemoryManagerInfo { diff --git a/de4dot.code/deobfuscators/SmartAssembly/ProxyDelegateFinder.cs b/de4dot.code/deobfuscators/SmartAssembly/ProxyDelegateFinder.cs index c7b8be5b..8ecdd6a2 100644 --- a/de4dot.code/deobfuscators/SmartAssembly/ProxyDelegateFinder.cs +++ b/de4dot.code/deobfuscators/SmartAssembly/ProxyDelegateFinder.cs @@ -19,6 +19,7 @@ using System.Collections.Generic; using Mono.Cecil; +using de4dot.blocks; namespace de4dot.deobfuscators.SmartAssembly { class ProxyDelegateFinder : ProxyDelegateFinderBase { diff --git a/de4dot.code/deobfuscators/SmartAssembly/ResolverInfoBase.cs b/de4dot.code/deobfuscators/SmartAssembly/ResolverInfoBase.cs index 0f091602..cdd4a8bd 100644 --- a/de4dot.code/deobfuscators/SmartAssembly/ResolverInfoBase.cs +++ b/de4dot.code/deobfuscators/SmartAssembly/ResolverInfoBase.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using Mono.Cecil; using Mono.Cecil.Cil; +using de4dot.blocks; namespace de4dot.deobfuscators.SmartAssembly { abstract class ResolverInfoBase { diff --git a/de4dot.code/deobfuscators/SmartAssembly/ResourceDecrypterInfo.cs b/de4dot.code/deobfuscators/SmartAssembly/ResourceDecrypterInfo.cs index c76f7090..c58b86b7 100644 --- a/de4dot.code/deobfuscators/SmartAssembly/ResourceDecrypterInfo.cs +++ b/de4dot.code/deobfuscators/SmartAssembly/ResourceDecrypterInfo.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using Mono.Cecil; using Mono.Cecil.Cil; +using de4dot.blocks; namespace de4dot.deobfuscators.SmartAssembly { class ResourceDecrypterInfo { diff --git a/de4dot.code/deobfuscators/SmartAssembly/ResourceResolver.cs b/de4dot.code/deobfuscators/SmartAssembly/ResourceResolver.cs index 4c23e326..28aac825 100644 --- a/de4dot.code/deobfuscators/SmartAssembly/ResourceResolver.cs +++ b/de4dot.code/deobfuscators/SmartAssembly/ResourceResolver.cs @@ -20,6 +20,7 @@ using System; using System.IO; using Mono.Cecil; +using de4dot.blocks; namespace de4dot.deobfuscators.SmartAssembly { class ResourceResolver { @@ -46,7 +47,7 @@ namespace de4dot.deobfuscators.SmartAssembly { if (resource == null) return null; - DotNetUtils.decryptAndAddResources(module, resource.Name, () => assemblyResolver.removeDecryptedResource(resource)); + DeobUtils.decryptAndAddResources(module, resource.Name, () => assemblyResolver.removeDecryptedResource(resource)); mergedIt = true; return resource; } diff --git a/de4dot.code/deobfuscators/SmartAssembly/ResourceResolverInfo.cs b/de4dot.code/deobfuscators/SmartAssembly/ResourceResolverInfo.cs index 7c50b8a4..98d94338 100644 --- a/de4dot.code/deobfuscators/SmartAssembly/ResourceResolverInfo.cs +++ b/de4dot.code/deobfuscators/SmartAssembly/ResourceResolverInfo.cs @@ -19,6 +19,7 @@ using Mono.Cecil; using Mono.Cecil.Cil; +using de4dot.blocks; namespace de4dot.deobfuscators.SmartAssembly { class ResourceResolverInfo : ResolverInfoBase { diff --git a/de4dot.code/deobfuscators/SmartAssembly/SimpleZipInfo.cs b/de4dot.code/deobfuscators/SmartAssembly/SimpleZipInfo.cs index b02b9bf0..4a90afa4 100644 --- a/de4dot.code/deobfuscators/SmartAssembly/SimpleZipInfo.cs +++ b/de4dot.code/deobfuscators/SmartAssembly/SimpleZipInfo.cs @@ -18,6 +18,7 @@ */ using Mono.Cecil; +using de4dot.blocks; namespace de4dot.deobfuscators.SmartAssembly { class SimpleZipInfo { diff --git a/de4dot.code/deobfuscators/SmartAssembly/StringEncoderClassFinder.cs b/de4dot.code/deobfuscators/SmartAssembly/StringEncoderClassFinder.cs index 6c36763f..f3a10234 100644 --- a/de4dot.code/deobfuscators/SmartAssembly/StringEncoderClassFinder.cs +++ b/de4dot.code/deobfuscators/SmartAssembly/StringEncoderClassFinder.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using Mono.Cecil; using Mono.Cecil.Cil; +using de4dot.blocks; namespace de4dot.deobfuscators.SmartAssembly { class StringsEncoderInfo { diff --git a/de4dot.code/renamer/DefinitionsRenamer.cs b/de4dot.code/renamer/DefinitionsRenamer.cs index 0a02d124..ed534101 100644 --- a/de4dot.code/renamer/DefinitionsRenamer.cs +++ b/de4dot.code/renamer/DefinitionsRenamer.cs @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using Mono.Cecil; +using de4dot.blocks; namespace de4dot.renamer { // Renames all typedefs, methoddefs, eventdefs, fielddefs, and propdefs diff --git a/de4dot.code/renamer/MemberRefFinder.cs b/de4dot.code/renamer/MemberRefFinder.cs index ca6d94f4..ddb65a9d 100644 --- a/de4dot.code/renamer/MemberRefFinder.cs +++ b/de4dot.code/renamer/MemberRefFinder.cs @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; using Mono.Cecil; using Mono.Cecil.Cil; +using de4dot.blocks; namespace de4dot { // If it's a non-generic memberref, you could use GetMemberReference() to get a cached diff --git a/de4dot.code/renamer/MemberReferenceExpander.cs b/de4dot.code/renamer/MemberReferenceExpander.cs index e8f6dcd3..4b7ddd10 100644 --- a/de4dot.code/renamer/MemberReferenceExpander.cs +++ b/de4dot.code/renamer/MemberReferenceExpander.cs @@ -19,6 +19,7 @@ using System; using Mono.Cecil; +using de4dot.blocks; namespace de4dot.renamer { abstract class Expander { diff --git a/de4dot.code/renamer/MemberRefs.cs b/de4dot.code/renamer/MemberRefs.cs index a6314543..f2f16bff 100644 --- a/de4dot.code/renamer/MemberRefs.cs +++ b/de4dot.code/renamer/MemberRefs.cs @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; using System.Text.RegularExpressions; using Mono.Cecil; +using de4dot.blocks; using de4dot.deobfuscators; namespace de4dot.renamer { diff --git a/de4dot.code/renamer/MemberRenameState.cs b/de4dot.code/renamer/MemberRenameState.cs index 091294d9..820b3108 100644 --- a/de4dot.code/renamer/MemberRenameState.cs +++ b/de4dot.code/renamer/MemberRenameState.cs @@ -18,6 +18,7 @@ */ using System.Collections.Generic; +using de4dot.blocks; namespace de4dot.renamer { class MemberRenameState { diff --git a/de4dot.code/renamer/NameCreators.cs b/de4dot.code/renamer/NameCreators.cs index 9face138..438c6498 100644 --- a/de4dot.code/renamer/NameCreators.cs +++ b/de4dot.code/renamer/NameCreators.cs @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using Mono.Cecil; +using de4dot.blocks; namespace de4dot.renamer { interface INameCreator { diff --git a/de4dot.sln b/de4dot.sln index 518a99fb..706278e7 100644 --- a/de4dot.sln +++ b/de4dot.sln @@ -30,6 +30,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssemblyServer-x64", "Assem EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dumpMethodsN", "dumpMethodsN\dumpMethodsN.vcxproj", "{3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "blocks", "blocks\blocks.csproj", "{045B96F2-AF80-4C4C-8D27-E38635AC705E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1018,6 +1020,78 @@ Global {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Release|Win32.ActiveCfg = Release|Win32 {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Release|Win32.Build.0 = Release|Win32 {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Release|x86.ActiveCfg = Release|Win32 + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|Win32.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|x86.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|Any CPU.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|Win32.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|x86.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|Any CPU.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|Any CPU.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|Mixed Platforms.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|Win32.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|x86.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|Win32.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|x86.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|Any CPU.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|Any CPU.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|Mixed Platforms.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|Win32.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|x86.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|Any CPU.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|Win32.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|x86.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|Any CPU.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|Any CPU.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|Mixed Platforms.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|Win32.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|x86.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|Any CPU.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|Win32.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|x86.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|Any CPU.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|Win32.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|x86.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|Any CPU.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|Any CPU.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|Mixed Platforms.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|Win32.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|x86.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|Any CPU.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|Win32.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|x86.ActiveCfg = Debug|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|Any CPU.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|Any CPU.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|Mixed Platforms.Build.0 = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|Win32.ActiveCfg = Release|Any CPU + {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE