From cbdcf1d8c1adf19171ef5329a7c9061f732cc6f1 Mon Sep 17 00:00:00 2001 From: de4dot Date: Sun, 6 Nov 2011 12:21:15 +0100 Subject: [PATCH] Dynamic methods decrypter code isn't needed anymore --- de4dot.sln | 151 ------ dumpMethods/App.config | 11 - dumpMethods/Log.cs | 76 --- dumpMethods/Program.cs | 215 -------- dumpMethods/Properties/AssemblyInfo.cs | 34 -- dumpMethods/dumpMethods.csproj | 53 -- dumpMethodsN/DllAlloc.h | 87 ---- dumpMethodsN/DotNetFile.cpp | 564 -------------------- dumpMethodsN/DotNetFile.h | 187 ------- dumpMethodsN/MakeWritable.h | 40 -- dumpMethodsN/common.cpp | 34 -- dumpMethodsN/common.h | 30 -- dumpMethodsN/dllmain.cpp | 31 -- dumpMethodsN/dumpMethodsN.cpp | 598 ---------------------- dumpMethodsN/dumpMethodsN.vcxproj | 111 ---- dumpMethodsN/dumpMethodsN.vcxproj.filters | 50 -- dumpMethodsN/log.cpp | 76 --- dumpMethodsN/log.h | 30 -- dumpMethodsN/strex.h | 34 -- 19 files changed, 2412 deletions(-) delete mode 100644 dumpMethods/App.config delete mode 100644 dumpMethods/Log.cs delete mode 100644 dumpMethods/Program.cs delete mode 100644 dumpMethods/Properties/AssemblyInfo.cs delete mode 100644 dumpMethods/dumpMethods.csproj delete mode 100644 dumpMethodsN/DllAlloc.h delete mode 100644 dumpMethodsN/DotNetFile.cpp delete mode 100644 dumpMethodsN/DotNetFile.h delete mode 100644 dumpMethodsN/MakeWritable.h delete mode 100644 dumpMethodsN/common.cpp delete mode 100644 dumpMethodsN/common.h delete mode 100644 dumpMethodsN/dllmain.cpp delete mode 100644 dumpMethodsN/dumpMethodsN.cpp delete mode 100644 dumpMethodsN/dumpMethodsN.vcxproj delete mode 100644 dumpMethodsN/dumpMethodsN.vcxproj.filters delete mode 100644 dumpMethodsN/log.cpp delete mode 100644 dumpMethodsN/log.h delete mode 100644 dumpMethodsN/strex.h diff --git a/de4dot.sln b/de4dot.sln index 706278e7..bd486375 100644 --- a/de4dot.sln +++ b/de4dot.sln @@ -1,11 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dumpMethods", "dumpMethods\dumpMethods.csproj", "{47E106B2-EF21-4AA4-9E99-AB1776254E21}" - ProjectSection(ProjectDependencies) = postProject - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9} = {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9} - EndProjectSection -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil", "cecil\Mono.Cecil.csproj", "{D68133BD-1E63-496E-9EDE-4FBDBF77B486}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "de4dot.code", "de4dot.code\de4dot.code.csproj", "{4D10B9EB-3BF1-4D61-A389-CB019E8C9622}" @@ -28,8 +23,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssemblyServer-x86", "Assem EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssemblyServer-x64", "AssemblyServer-x64\AssemblyServer-x64.csproj", "{F458A89A-AEAB-4965-AA4D-393C9F7411D0}" 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 @@ -84,78 +77,6 @@ Global winphone_Release|x86 = winphone_Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Debug|Any CPU.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Debug|Win32.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Debug|x86.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Debug|x86.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Debug|Any CPU.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Debug|Mixed Platforms.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Debug|Win32.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Debug|x86.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Debug|x86.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Release|Any CPU.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Release|Mixed Platforms.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Release|Mixed Platforms.Build.0 = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Release|Win32.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Release|x86.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_2_0_Release|x86.Build.0 = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Debug|Any CPU.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Debug|Mixed Platforms.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Debug|Win32.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Debug|x86.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Debug|x86.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Release|Any CPU.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Release|Mixed Platforms.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Release|Mixed Platforms.Build.0 = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Release|Win32.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Release|x86.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_3_5_Release|x86.Build.0 = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Debug|Any CPU.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Debug|Mixed Platforms.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Debug|Win32.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Debug|x86.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Debug|x86.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Release|Any CPU.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Release|Mixed Platforms.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Release|Mixed Platforms.Build.0 = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Release|Win32.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Release|x86.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.net_4_0_Release|x86.Build.0 = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Release|Any CPU.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Release|Mixed Platforms.Build.0 = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Release|Win32.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Release|x86.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.Release|x86.Build.0 = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Debug|Any CPU.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Debug|Mixed Platforms.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Debug|Win32.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Debug|x86.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Debug|x86.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Release|Any CPU.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Release|Mixed Platforms.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Release|Mixed Platforms.Build.0 = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Release|Win32.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Release|x86.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.silverlight_Release|x86.Build.0 = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Debug|Any CPU.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Debug|Mixed Platforms.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Debug|Win32.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Debug|x86.ActiveCfg = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Debug|x86.Build.0 = Debug|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Release|Any CPU.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Release|Mixed Platforms.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Release|Mixed Platforms.Build.0 = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Release|Win32.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Release|x86.ActiveCfg = Release|x86 - {47E106B2-EF21-4AA4-9E99-AB1776254E21}.winphone_Release|x86.Build.0 = Release|x86 {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Debug|Any CPU.ActiveCfg = winphone_Debug|Any CPU {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Debug|Any CPU.Build.0 = winphone_Debug|Any CPU {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.Debug|Mixed Platforms.ActiveCfg = net_2_0_Debug|Any CPU @@ -948,78 +869,6 @@ Global {F458A89A-AEAB-4965-AA4D-393C9F7411D0}.winphone_Release|Win32.ActiveCfg = Release|x86 {F458A89A-AEAB-4965-AA4D-393C9F7411D0}.winphone_Release|x86.ActiveCfg = Release|x86 {F458A89A-AEAB-4965-AA4D-393C9F7411D0}.winphone_Release|x86.Build.0 = Release|x86 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Debug|Win32.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Debug|Win32.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Debug|x86.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Debug|Any CPU.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Debug|Mixed Platforms.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Debug|Win32.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Debug|Win32.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Debug|x86.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Release|Any CPU.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Release|Mixed Platforms.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Release|Mixed Platforms.Build.0 = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Release|Win32.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Release|Win32.Build.0 = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_2_0_Release|x86.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Debug|Any CPU.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Debug|Mixed Platforms.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Debug|Win32.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Debug|Win32.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Debug|x86.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Release|Any CPU.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Release|Mixed Platforms.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Release|Mixed Platforms.Build.0 = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Release|Win32.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Release|Win32.Build.0 = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_3_5_Release|x86.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Debug|Any CPU.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Debug|Mixed Platforms.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Debug|Win32.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Debug|Win32.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Debug|x86.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Release|Any CPU.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Release|Mixed Platforms.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Release|Mixed Platforms.Build.0 = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Release|Win32.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Release|Win32.Build.0 = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.net_4_0_Release|x86.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Release|Any CPU.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Release|Mixed Platforms.Build.0 = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Release|Win32.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Release|Win32.Build.0 = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.Release|x86.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Debug|Any CPU.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Debug|Mixed Platforms.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Debug|Win32.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Debug|Win32.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Debug|x86.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Release|Any CPU.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Release|Mixed Platforms.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Release|Mixed Platforms.Build.0 = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Release|Win32.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Release|Win32.Build.0 = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.silverlight_Release|x86.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Debug|Any CPU.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Debug|Mixed Platforms.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Debug|Win32.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Debug|Win32.Build.0 = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Debug|x86.ActiveCfg = Debug|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Release|Any CPU.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Release|Mixed Platforms.ActiveCfg = Release|Win32 - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Release|Mixed Platforms.Build.0 = Release|Win32 - {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 diff --git a/dumpMethods/App.config b/dumpMethods/App.config deleted file mode 100644 index 01514aab..00000000 --- a/dumpMethods/App.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/dumpMethods/Log.cs b/dumpMethods/Log.cs deleted file mode 100644 index 832a390b..00000000 --- a/dumpMethods/Log.cs +++ /dev/null @@ -1,76 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -using System; -using System.Collections.Generic; - -namespace dumpMethods { - static class Log { - static int indentLevel = 0; - const int indentSize = 2; - - public enum LogLevel { - error, - warning, - normal, - verbose, - veryverbose, - } - public static LogLevel logLevel = LogLevel.normal; - - public static void indent() { - indentLevel++; - } - - public static void deIndent() { - if (indentLevel <= 0) - throw new ApplicationException("Can't de-indent!"); - indentLevel--; - } - - static void log(LogLevel l, string format, params object[] args) { - if (l > logLevel) - return; - string indent = new string(' ', indentLevel * indentSize); - if (l <= LogLevel.warning) - indent = ""; - Console.WriteLine(indent + format, args); - } - - public static void e(string format, params object[] args) { - log(LogLevel.error, format, args); - } - - public static void w(string format, params object[] args) { - log(LogLevel.warning, format, args); - } - - public static void n(string format, params object[] args) { - log(LogLevel.normal, format, args); - } - - public static void v(string format, params object[] args) { - log(LogLevel.verbose, format, args); - } - - public static void vv(string format, params object[] args) { - log(LogLevel.veryverbose, format, args); - } - } -} diff --git a/dumpMethods/Program.cs b/dumpMethods/Program.cs deleted file mode 100644 index 092f1d07..00000000 --- a/dumpMethods/Program.cs +++ /dev/null @@ -1,215 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -using System; -using System.IO; -using System.Collections.Generic; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Text; - -namespace dumpMethods { - class ProtectedFile { - string filename; - string methodsFilename; - - public string Filename { - get { return filename; } - } - - public string MethodsFilename { - get { return methodsFilename; } - set { methodsFilename = value; } - } - - public ProtectedFile(string filename, string methodsFilename = null) { - this.filename = filename; - this.methodsFilename = methodsFilename; - - if (this.methodsFilename == null) - this.methodsFilename = this.filename + ".methods"; - } - } - - class Program { - [DllImport(@"dumpMethodsN.dll", CallingConvention = CallingConvention.StdCall)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool initialize1(int logLevel, [MarshalAs(UnmanagedType.LPWStr)] string filename); - - [DllImport(@"dumpMethodsN.dll", CallingConvention = CallingConvention.StdCall)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool initialize2(); - - [DllImport(@"dumpMethodsN.dll", CallingConvention = CallingConvention.StdCall)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool foundAssembly(); - - [DllImport(@"dumpMethodsN.dll", CallingConvention = CallingConvention.StdCall)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool dumpCode([MarshalAs(UnmanagedType.LPWStr)] string methodsFilename); - - delegate void CallCctor(); - static int Main(string[] args) { - try { - if (Console.OutputEncoding.IsSingleByte) - Console.OutputEncoding = new UTF8Encoding(false); - - var files = parseCommandLine(args); - if (files.Count != 1) - exitError("Exactly one file must be given."); - - foreach (var file in files) { - Log.v("calling initialize1()"); - if (!initialize1((int)Log.logLevel, file.Filename)) - fatal("initialize1() failed"); - - Log.v("Loading assembly: {0}", file.Filename); - Assembly assembly = Assembly.LoadFrom(file.Filename); - - loadProtection(assembly); - if (!foundAssembly()) - fatal("Could not find the assembly in memory"); - - Log.v("calling initialize2()"); - if (!initialize2()) - fatal("initialize2() failed"); - - Log.n("Dumping all methods..."); - if (!dumpCode(file.MethodsFilename)) - fatal("dumpCode() failed"); - Log.n("Done"); - } - } - catch (Exception ex) { - var line = new string('-', 78); - Log.e("\n\nERROR: Caught an exception:\n\n"); - Log.e(line); - Log.e("Message: {0}", ex.Message); - Log.e("Type: {0}", ex.GetType()); - Log.e(line); - Log.e("\n\nStack trace:\n{0}", ex.StackTrace); - if (ex is ReflectionTypeLoadException) { - var rex = (ReflectionTypeLoadException)ex; - Log.e("\nReflectionTypeLoadException.LoaderExceptions ="); - foreach (var ex2 in rex.LoaderExceptions) - Log.e(" {0}", ex2.Message); - } - return 1; - } - - return 0; - } - - static void exit(int exitCode) { - Environment.Exit(exitCode); - } - - static void fatal(string msg) { - Log.e("{0}", msg); - exit(3); - } - - static void loadProtection(Assembly assembly) { - Log.n("Loading protection..."); - foreach (var type2 in assembly.GetTypes()) { - if (foundAssembly()) - return; - var cctor = type2.TypeInitializer; - if (cctor == null) - continue; - - // Tell the jitter to compile the method - RuntimeHelpers.PrepareMethod(cctor.MethodHandle); - } - } - - static IList parseCommandLine(string[] args) { - var files = new List(); - - ProtectedFile file = null; - for (int i = 0; i < args.Length; i++) { - var arg = args[i]; - var next = i + 1 < args.Length ? args[i + 1] : null; - - if (arg == "-h" || arg == "--help") { - usage(); - exit(0); - } - else if (arg == "-v" || arg == "--verbose") { - Log.logLevel = Log.LogLevel.verbose; - } - else if (arg == "-vv" || arg == "--veryverbose") { - Log.logLevel = Log.LogLevel.veryverbose; - } - else if (arg == "-m" || arg == "--methods") { - if (next == null) - exitError("Missing methods filename"); - if (file == null) - exitError("No input file given yet"); - file.MethodsFilename = next; - i++; - } - else { - if (arg == "-f" || arg == "--file") { - if (next == null) - exitError("Missing filename"); - i++; - arg = next; - } - - if (!new FileInfo(arg).Exists) - exitError(string.Format("File \"{0}\" does not exist.", arg)); - files.Add(file = new ProtectedFile(arg)); - } - } - - return files; - } - - static void exitError(string msg) { - usage(); - Log.e("\n\nERROR: {0}\n", msg); - exit(2); - } - - static void usage() { - string progName = getProgramBaseName(); - Log.n("Dumps encrypted .NET methods. This works only with the supported obfuscators."); - Log.n("{0} [options] file", progName); - Log.n("Options:"); - Log.n(" -v Verbose"); - Log.n(" -vv Very verbose"); - Log.n(" -f name Name of .NET file"); - Log.n(" -m name Name of .methods file"); - Log.n("Examples:"); - Log.n("{0} file1", progName); - Log.n("{0} -f file1", progName); - Log.n("{0} -f file1 -m file1.methods", progName); - } - - static string getProgramBaseName() { - var name = Environment.GetCommandLineArgs()[0]; - int index = name.LastIndexOf(Path.DirectorySeparatorChar); - if (index < 0) - return name; - return name.Substring(index + 1); - } - } -} diff --git a/dumpMethods/Properties/AssemblyInfo.cs b/dumpMethods/Properties/AssemblyInfo.cs deleted file mode 100644 index 1b4e4b9b..00000000 --- a/dumpMethods/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("dumpMethods")] -[assembly: AssemblyDescription("Dumps encrypted .NET methods")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("dumpMethods")] -[assembly: AssemblyCopyright("Copyright (C) 2011 de4dot@gmail.com")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: AssemblyVersion("1.1.3.3405")] -[assembly: AssemblyFileVersion("1.1.3.3405")] diff --git a/dumpMethods/dumpMethods.csproj b/dumpMethods/dumpMethods.csproj deleted file mode 100644 index c61caec8..00000000 --- a/dumpMethods/dumpMethods.csproj +++ /dev/null @@ -1,53 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {47E106B2-EF21-4AA4-9E99-AB1776254E21} - Exe - Properties - dumpMethods - dumpMethods - v2.0 - 512 - - - - x86 - true - full - false - ..\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - ..\Release\ - TRACE - prompt - 4 - true - - - - - - - - - - - - \ No newline at end of file diff --git a/dumpMethodsN/DllAlloc.h b/dumpMethodsN/DllAlloc.h deleted file mode 100644 index 1c8a503e..00000000 --- a/dumpMethodsN/DllAlloc.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -#ifndef DLL_ALLOC_H -#define DLL_ALLOC_H - -#include -#include "strex.h" -#include "common.h" - -// Alloc code/data from the end of sections in a loaded DLL -class DllAlloc { -public: - DllAlloc(HMODULE hMod) { - hDll = hMod; - if (!hDll) - throw strex("Invalid hDll"); - imageBase = (unsigned char*)hDll; - - idh = (IMAGE_DOS_HEADER*)imageBase; - unsigned char* p = imageBase + idh->e_lfanew; - p += 4; // Skip IMAGE_NT_SIGNATURE - ifh = (_IMAGE_FILE_HEADER*)p; - numSections = ifh->NumberOfSections; - p += sizeof(_IMAGE_FILE_HEADER); - ioh = (_IMAGE_OPTIONAL_HEADER*)p; - p += ifh->SizeOfOptionalHeader; - sections = (_IMAGE_SECTION_HEADER*)p; - - textEnd = findEndOfSection(".text\0\0\0"); - } - - void* alloc(size_t size) { - textEnd -= ALIGNIT(size, sizeof(void*)); - return textEnd; - } - -private: - static const size_t PAGE_SIZE = 0x1000; - - void* rvaToPtr(unsigned rva) const { - return imageBase + rva; - } - - _IMAGE_SECTION_HEADER* findSection(const char* name) const { - for (size_t i = 0; i < numSections; i++) { - if (!memcmp(sections[i].Name, name, 8)) - return §ions[i]; - } - return 0; - } - - unsigned char* findEndOfSection(const char* name) const { - _IMAGE_SECTION_HEADER* section = findSection(name); - if (!section) - throw strex("Could not find the section"); - - return (unsigned char*)rvaToPtr(ALIGNIT(section->VirtualAddress + section->SizeOfRawData, PAGE_SIZE)); - } - - HMODULE hDll; - unsigned char* imageBase; - size_t numSections; - IMAGE_DOS_HEADER* idh; - _IMAGE_FILE_HEADER* ifh; - _IMAGE_OPTIONAL_HEADER* ioh; - _IMAGE_SECTION_HEADER* sections; - unsigned char* textEnd; -}; - -#endif diff --git a/dumpMethodsN/DotNetFile.cpp b/dumpMethodsN/DotNetFile.cpp deleted file mode 100644 index 250afee6..00000000 --- a/dumpMethodsN/DotNetFile.cpp +++ /dev/null @@ -1,564 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -#include -#include -#include "DotNetFile.h" -#include "strex.h" -#include "common.h" - -void DotNetFile::fread(long offset, void* buf, size_t size) const { - if (fseek(file, offset, SEEK_SET)) - throw strex("Could not seek"); - fread(buf, size); -} - -void DotNetFile::fread(void* buf, size_t size) const { - if (::fread(buf, 1, size, file) != size) - throw strex("Could not read"); -} - -DotNetFile::DotNetFile(const wchar_t* filename) - : image(0), streams(0) -{ - memset(&metaDataTypes, 0, sizeof(metaDataTypes)); - - if ((file = _wfopen(filename, L"rb")) == 0) - throw strex("Could not open file"); - - _IMAGE_DOS_HEADER dosHeader; - fread(0, &dosHeader, sizeof(dosHeader)); - if (dosHeader.e_magic != IMAGE_DOS_SIGNATURE) - throw strex("Not a EXE file"); - DWORD peMagic; - fread(dosHeader.e_lfanew, &peMagic, sizeof(peMagic)); - if (peMagic != IMAGE_NT_SIGNATURE) - throw strex("Invalid PE magic"); - _IMAGE_FILE_HEADER fileHeader; - fread(&fileHeader, sizeof(fileHeader)); - if (fileHeader.Machine != IMAGE_FILE_MACHINE_I386) - throw strex("Machine is not i386"); - if (fileHeader.SizeOfOptionalHeader != sizeof(_IMAGE_OPTIONAL_HEADER)) - throw strex("Invalid size of optional header"); - _IMAGE_OPTIONAL_HEADER optionalHeader; - fread(&optionalHeader, sizeof(optionalHeader)); - if (optionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) - throw strex("Not a 32-bit optional header"); - sizeOfHeaders = optionalHeader.SizeOfHeaders; - loadImage(fileHeader, optionalHeader.SizeOfImage, optionalHeader.SizeOfHeaders); - cor20Header = (IMAGE_COR20_HEADER*)rvaToPtr(optionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_COMHEADER].VirtualAddress, sizeof(IMAGE_COR20_HEADER)); - if (cor20Header->cb < sizeof(IMAGE_COR20_HEADER)) - throw strex("Invalid IMAGE_COR20_HEADER size"); - metadata = (unsigned char*)rvaToPtr(cor20Header->MetaData.VirtualAddress, cor20Header->MetaData.Size); - if (*(DWORD*)metadata != 0x424A5342) - throw strex("Invalid metadata magic"); - initStreams(); -} - -DotNetFile::~DotNetFile() { - if (image) - delete[] image; - if (streams) - delete[] streams; - for (size_t i = 0; i < METADATA_TYPES; i++) { - if (metaDataTypes[i]) - delete metaDataTypes[i]; - } -} - -// file offset is at _IMAGE_SECTION_HEADER -void DotNetFile::loadImage(const _IMAGE_FILE_HEADER& fileHeader, DWORD _imageSize, DWORD headerSize) { - long sectionHeaderOffs = ftell(file); - - imageSize = _imageSize; - image = new unsigned char[imageSize]; - memset(image, 0, imageSize); - - loadImage(0, 0, headerSize); - - numSections = fileHeader.NumberOfSections; - sectionHeaders = (_IMAGE_SECTION_HEADER*)rvaToPtr(sectionHeaderOffs, sizeof(_IMAGE_SECTION_HEADER) * numSections); - for (size_t i = 0; i < numSections; i++) { - if (sectionHeaders[i].VirtualAddress == 0) - throw strex("Invalid section VirtualAddress"); - loadImage(sectionHeaders[i].VirtualAddress, sectionHeaders[i].PointerToRawData, sectionHeaders[i].SizeOfRawData); - } -} - -void DotNetFile::loadImage(DWORD rva, DWORD fileOffset, DWORD sizeRawData) { - if (rva + sizeRawData < rva || rva + sizeRawData > imageSize) - throw strex("rva + size too large"); - fread(fileOffset, image + rva, sizeRawData); -} - -void* DotNetFile::rvaToPtr(DWORD rva, size_t size) const { - if (rva + size < rva || rva + size > imageSize) - throw strex("RVA + size is too big"); - return image + rva; -} - -size_t DotNetFile::ptrToRva(void* addr) const { - size_t rva = (unsigned char*)addr - image; - if (rva < imageSize) - return rva; - throw strex("Addr is not a VA"); -} - - -void DotNetFile::initStreams() { - unsigned char* p = metadata + 4 + 2 + 2 + 4; // magic, major, minor, reserved - p += 4 + *(DWORD*)p; // Skip version string and string length - p += 2; // Skip Flags - numStreams = *(WORD*)p; - p += 2; - streams = new Stream[numStreams]; - for (size_t i = 0; i < numStreams; i++) { - DWORD offs = *(DWORD*)p; - DWORD size = *(DWORD*)(p+4); - streams[i].init((unsigned char*)metaOffsToAddr(offs, size), size, (const char*)(p+8)); - p += 8; - size_t len = strlen((const char*)p) + 1; - p += (len+3)/4 * 4; - } - - streamTilde = findStream("#~"); - streamBlob = findStream("#Blob"); - streamStrings = findStream("#Strings"); - if (!streamTilde) - throw strex("No #~ stream"); - if (!streamBlob) - throw strex("No #Blob stream"); - if (!streamStrings) - throw strex("No #Strings stream"); - - initMetadataTables(); -} - -void* DotNetFile::metaOffsToAddr(DWORD offs, DWORD size) const { - if (offs + size < offs || offs + size > cor20Header->MetaData.Size) - throw strex("Invalid metadata offset"); - return metadata + offs; -} - -Stream* DotNetFile::findStream(const char* name) const { - for (size_t i = 0; i < numStreams; i++) { - if (!strcmp(name, streams[i].name)) - return &streams[i]; - } - return 0; -} - -enum MetaDataVarType { - end, - stop, - byte1, - byte2, - byte4, - stringIndex, // index into #String heap - guidIndex, // index into #GUID heap - blobIndex, // index into #Blob heap - resolutionScope, - typeDefOrRef, - fieldIndex, - methodDefIndex, - paramIndex, - typeDefIndex, - eventIndex, - propertyIndex, - moduleRefIndex, - assemblyRefIndex, - genericParamIndex, - memberRefParent, - hasConstant, - hasCustomAttribute, - customAttributeType, - hasFieldMarshal, - hasDeclSecurity, - hasSemantics, - methodDefOrRef, - memberForwarded, - implementation, - typeOrMethodDef, -}; - -class MetaDataTypeBuilder { -public: - MetaDataTypeBuilder(int _heapOffsetSizes, const MetaDataTable* _metaDataTables) - : heapOffsetSizes(_heapOffsetSizes), metaDataTables(_metaDataTables), numFields(0), offset(0) { - } - - MetaDataTypeBuilder& field(MetaDataVarType type) { - if (numFields >= MAX_FIELDS) - throw strex("Too many fields"); - - unsigned short size; - switch (type) { - case byte1: - size = 1; - break; - case byte2: - size = 2; - break; - case byte4: - size = 4; - break; - case stringIndex: - size = heapOffsetSizes & 1 ? 4 : 2; - break; - case guidIndex: - size = heapOffsetSizes & 2 ? 4 : 2; - break; - case blobIndex: - size = heapOffsetSizes & 4 ? 4 : 2; - break; - case resolutionScope: { - static MetaDataIndex indexes[] = {iModule, iModuleRef, iAssemblyRef, iTypeRef}; - size = getSize(indexes, NUM_ELEMS(indexes), 14); - break; - } - case typeDefOrRef: { - static MetaDataIndex indexes[] = {iTypeDef, iTypeRef, iTypeSpec}; - size = getSize(indexes, NUM_ELEMS(indexes), 14); - break; - } - case memberRefParent: { - static MetaDataIndex indexes[] = {iTypeDef, iTypeRef, iModuleRef, iMethodDef, iTypeSpec}; - size = getSize(indexes, NUM_ELEMS(indexes), 13); - break; - } - case hasConstant: { - static MetaDataIndex indexes[] = {iField, iParam, iProperty}; - size = getSize(indexes, NUM_ELEMS(indexes), 14); - break; - } - case hasCustomAttribute: { - static MetaDataIndex indexes[] = { - iMethodDef, iField, iTypeRef, iTypeDef, iParam, iInterfaceImpl, - iMemberRef, iModule /*TODO:, iPermission*/, iProperty, - iEvent, iStandAloneSig, iModuleRef, iTypeSpec, iAssembly, - iAssemblyRef, iFile, iExportedType, iManifestResource, - }; - size = getSize(indexes, NUM_ELEMS(indexes), 11); - break; - } - case customAttributeType: { - static MetaDataIndex indexes[] = {iMethodDef, iMemberRef}; // others aren't used - size = getSize(indexes, NUM_ELEMS(indexes), 13); - break; - } - case hasFieldMarshal: { - static MetaDataIndex indexes[] = {iField, iParam}; - size = getSize(indexes, NUM_ELEMS(indexes), 15); - break; - } - case hasDeclSecurity: { - static MetaDataIndex indexes[] = {iTypeDef, iMethodDef, iAssembly}; - size = getSize(indexes, NUM_ELEMS(indexes), 14); - break; - } - case hasSemantics: { - static MetaDataIndex indexes[] = {iEvent, iProperty}; - size = getSize(indexes, NUM_ELEMS(indexes), 15); - break; - } - case methodDefOrRef: { - static MetaDataIndex indexes[] = {iMethodDef, iMemberRef}; - size = getSize(indexes, NUM_ELEMS(indexes), 15); - break; - } - case memberForwarded: { - static MetaDataIndex indexes[] = {iField, iMethodDef}; - size = getSize(indexes, NUM_ELEMS(indexes), 15); - break; - } - case implementation: { - static MetaDataIndex indexes[] = {iFile, iAssemblyRef, iExportedType}; - size = getSize(indexes, NUM_ELEMS(indexes), 14); - break; - } - case typeOrMethodDef: { - static MetaDataIndex indexes[] = {iTypeDef, iMethodDef}; - size = getSize(indexes, NUM_ELEMS(indexes), 15); - break; - } - case fieldIndex: - size = getSize(iField); - break; - case methodDefIndex: - size = getSize(iMethodDef); - break; - case paramIndex: - size = getSize(iParam); - break; - case typeDefIndex: - size = getSize(iTypeDef); - break; - case eventIndex: - size = getSize(iEvent); - break; - case propertyIndex: - size = getSize(iProperty); - break; - case moduleRefIndex: - size = getSize(iModuleRef); - break; - case assemblyRefIndex: - size = getSize(iAssemblyRef); - break; - case genericParamIndex: - size = getSize(iGenericParam); - break; - default: - throw strex("Unknown type"); - } - - fields[numFields].offset = offset; - fields[numFields].size = size; - numFields++; - offset += size; - - return *this; - } - - MetaDataType* create() { - MetaDataType* mdt = new MetaDataType(fields, numFields); - numFields = 0; - offset = 0; - return mdt; - } - -private: - MetaDataTypeBuilder(const MetaDataTypeBuilder&); - MetaDataTypeBuilder& operator=(const MetaDataTypeBuilder&); - - size_t getMaxRows(const MetaDataIndex* indexes, size_t num) const { - size_t maxRows = 0; - for (size_t i = 0; i < num; i++) { - if (metaDataTables[indexes[i]].rows > maxRows) - maxRows = metaDataTables[indexes[i]].rows; - } - return maxRows; - } - - unsigned short getSize(const MetaDataIndex* indexes, size_t num, int bits) const { - const size_t maxNum = 1 << bits; - const size_t maxRows = getMaxRows(indexes, num); - return maxRows <= maxNum ? 2 : 4; - } - - unsigned short getSize(MetaDataIndex index) const { - const MetaDataIndex indexes[1] = {index}; - return getSize(indexes, 1, 16); - } - - static const size_t MAX_FIELDS = 10; - const int heapOffsetSizes; - const MetaDataTable* metaDataTables; - size_t numFields; - MetaDataField fields[MAX_FIELDS]; - unsigned short offset; -}; - -void DotNetFile::initMetadataTables() { - unsigned char* p = streamTilde->addr; - - p += 4 + 1 + 1; // skip reserved, major, minor - unsigned char heapOffsetSizes = *p; - p += 1 + 1; // Skip HeapOffsetSizes and reserved - unsigned long long valid = *(unsigned long long*)p; - p += 8 + 8; // Skip Valid and Sorted - for (int i = 0; valid; i++, valid >>= 1) { - if (valid & 1) { - metaDataTables[i].rows = *(DWORD*)p; - p += 4; - } - } - - static MetaDataVarType types[] = { - byte2, stringIndex, guidIndex, guidIndex, guidIndex, end, // 0 - resolutionScope, stringIndex, stringIndex, end, // 1 - byte4, stringIndex, stringIndex, typeDefOrRef, fieldIndex, methodDefIndex, end, // 2 - end, // 3 - byte2, stringIndex, blobIndex, end, // 4 - end, // 5 - byte4, byte2, byte2, stringIndex, blobIndex, paramIndex, end, // 6 - end, // 7 - byte2, byte2, stringIndex, end, // 8 - typeDefIndex, typeDefOrRef, end, // 9 - memberRefParent, stringIndex, blobIndex, end, // 10 - byte1, byte1, hasConstant, blobIndex, end, // 11 - hasCustomAttribute, customAttributeType, blobIndex, end, // 12 - hasFieldMarshal, blobIndex, end, // 13 - byte2, hasDeclSecurity, blobIndex, end, // 14 - byte2, byte4, typeDefIndex, end, // 15 - byte4, fieldIndex, end, // 16 - blobIndex, end, // 17 - typeDefIndex, eventIndex, end, // 18 - end, // 19 - byte2, stringIndex, typeDefOrRef, end, // 20 - typeDefIndex, propertyIndex, end, // 21 - end, // 22 - byte2, stringIndex, blobIndex, end, // 23 - byte2, methodDefIndex, hasSemantics, end, // 24 - typeDefIndex, methodDefOrRef, methodDefOrRef, end, // 25 - stringIndex, end, // 26 - blobIndex, end, // 27 - byte2, memberForwarded, stringIndex, moduleRefIndex, end, // 28 - byte4, fieldIndex, end, // 29 - end, // 30 - end, // 31 - byte4, byte2, byte2, byte2, byte2, byte4, blobIndex, stringIndex, stringIndex, end, // 32 - byte4, end, // 33 - byte4, byte4, byte4, end, // 34 - byte2, byte2, byte2, byte2, byte4, blobIndex, stringIndex, stringIndex, blobIndex, end, // 35 - byte4, assemblyRefIndex, end, // 36 - byte4, byte4, byte4, assemblyRefIndex, end, // 37 - byte4, stringIndex, blobIndex, end, // 38 - byte4, byte4, stringIndex, stringIndex, implementation, end,// 39 - byte4, byte4, stringIndex, implementation, end, // 40 - typeDefIndex, typeDefIndex, end, // 41 - byte2, byte2, typeOrMethodDef, stringIndex, end, // 42 - end, // 43 - genericParamIndex, typeDefOrRef, end, // 44 - end, // 45 - end, // 46 - end, // 47 - end, // 48 - end, // 49 - end, // 50 - end, // 51 - end, // 52 - end, // 53 - end, // 54 - end, // 55 - end, // 56 - end, // 57 - end, // 58 - end, // 59 - end, // 60 - end, // 61 - end, // 62 - end, // 63 - - stop - }; - - MetaDataTypeBuilder builder(heapOffsetSizes, metaDataTables); - for (int i = 0, j = 0; ; i++) { - if (types[i] == end) - metaDataTypes[j++] = builder.create(); - else if (types[i] == stop) - break; - else - builder.field(types[i]); - } - - for (int i = 0; i < METADATA_TYPES; i++) { - metaDataTables[i].addr = p; - p += metaDataTables[i].rows * metaDataTypes[i]->size(); - } - - if (metaDataTables[iMethodDef].rows == 0) - throw strex("No MethodDef in #~ stream"); -} - -bool DotNetFile::isYourImageBase(void* addr) const { - __try { - unsigned char* p = (unsigned char*)addr; - size_t offs = 0; - - if (memcmp(image + offs, p + offs, sizeof(IMAGE_DOS_HEADER))) - return false; - offs = ((IMAGE_DOS_HEADER*)image)->e_lfanew; - - if (memcmp(image + offs, p + offs, sizeof(DWORD) + sizeof(_IMAGE_FILE_HEADER))) - return false; - offs += sizeof(DWORD); - size_t sizeOh = ((_IMAGE_FILE_HEADER*)(image+offs))->SizeOfOptionalHeader; - size_t numSections = ((_IMAGE_FILE_HEADER*)(image+offs))->NumberOfSections; - offs += sizeof(_IMAGE_FILE_HEADER); - - // Ignore ImageBase field which could be different - size_t lastSize = sizeOh + numSections * sizeof(_IMAGE_SECTION_HEADER); - void* tempMem = new unsigned char[lastSize]; - memcpy(tempMem, image + offs, lastSize); - ((_IMAGE_OPTIONAL_HEADER*)tempMem)->AddressOfEntryPoint = ((_IMAGE_OPTIONAL_HEADER*)(p + offs))->AddressOfEntryPoint; - ((_IMAGE_OPTIONAL_HEADER*)tempMem)->ImageBase = ((_IMAGE_OPTIONAL_HEADER*)(p + offs))->ImageBase; - if (memcmp(tempMem, p + offs, lastSize)) { - delete[] tempMem; - return false; - } - delete[] tempMem; - offs += sizeOh + numSections * sizeof(_IMAGE_SECTION_HEADER); - } - __except (EXCEPTION_EXECUTE_HANDLER) { - return false; - } - - return true; -} - -void* DotNetFile::getMetaDataTableElem(MetaDataIndex metaIndex, unsigned index, void* imageBase) const { - if (imageBase == 0) - imageBase = image; - index--; - if (index >= metaDataTables[metaIndex].rows) - throw strex("Invalid metatable index"); - - const MetaDataType* type = metaDataTypes[metaIndex]; - return metaDataTables[metaIndex].addr + type->size() * index; -} - -void* DotNetFile::getMethodDef(unsigned index, void* imageBase) const { - return getMetaDataTableElem(iMethodDef, index, imageBase); -} - -void* DotNetFile::getMethodHeader(unsigned index, void* imageBase) const { - void* methodDef = getMethodDef(index, imageBase); - const MetaDataType* type = metaDataTypes[iMethodDef]; - return (unsigned char*)imageBase + type->read(methodDef, 0); -} - -const char* DotNetFile::getMethodName(unsigned index, void* imageBase) const { - void* methodDef = getMethodDef(index, imageBase); - const MetaDataType* type = metaDataTypes[iMethodDef]; - return (const char*)imageBase + ptrToRva(streamStrings->addr + type->read(methodDef, 3)); -} - -size_t DotNetFile::getStandAloneSigBlobIndex(unsigned index, void* imageBase) const { - void* elem = getMetaDataTableElem(iStandAloneSig, index, imageBase); - const MetaDataType* type = metaDataTypes[iStandAloneSig]; - return type->read(elem, 0); -} - -size_t DotNetFile::getNumMethods() const { - return metaDataTables[iMethodDef].rows; -} - -size_t DotNetFile::rvaToOffset(DWORD rva) const { - if (rva < sizeOfHeaders) - return rva; - - for (size_t i = 0; i < numSections; i++) { - if (rva >= sectionHeaders[i].VirtualAddress && rva < sectionHeaders[i].VirtualAddress + sectionHeaders[i].SizeOfRawData) - return rva - sectionHeaders[i].VirtualAddress + sectionHeaders[i].PointerToRawData; - } - - throw strex("RVA is not part of file"); -} diff --git a/dumpMethodsN/DotNetFile.h b/dumpMethodsN/DotNetFile.h deleted file mode 100644 index c1a0e989..00000000 --- a/dumpMethodsN/DotNetFile.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - - -#ifndef DOTNETFILE_H -#define DOTNETFILE_H - -#include -#include -#include -#include -#include "strex.h" - -enum MetaDataIndex { - iModule = 0, - iTypeRef = 1, - iTypeDef = 2, - iField = 4, - iMethodDef = 6, - iParam = 8, - iInterfaceImpl = 9, - iMemberRef = 10, - iConstant = 11, - iCustomAttribute = 12, - iFieldMarshal = 13, - iDeclSecurity = 14, - iClassLayout = 15, - iFieldLayout = 16, - iStandAloneSig = 17, - iEventMap = 18, - iEvent = 20, - iPropertyMap = 21, - iProperty = 23, - iMethodSemantics = 24, - iMethodImpl = 25, - iModuleRef = 26, - iTypeSpec = 27, - iImplMap = 28, - iFieldRVA = 29, - iAssembly = 32, - iAssemblyProcessor = 33, - iAssemblyOS = 34, - iAssemblyRef = 35, - iAssemblyRefProcessor = 36, - iAssemblyRefOS = 37, - iFile = 38, - iExportedType = 39, - iManifestResource = 40, - iNestedClass = 41, - iGenericParam = 42, - iGenericParamConstraint = 44, -}; - -struct Stream { - Stream() : addr(0), size(0), name(0) {} - ~Stream() { - if (name) - free((void*)name); - } - - void init(unsigned char* addr, size_t size, const char* name) { - this->addr = addr; - this->size = size; - this->name = _strdup(name); - } - - unsigned char* addr; - size_t size; - const char* name; -}; - -struct MetaDataTable { - MetaDataTable() : addr(0), rows(0) {} - unsigned char* addr; - size_t rows; -}; - -struct MetaDataField { - unsigned short offset; - unsigned short size; -}; - -class MetaDataType { -public: - MetaDataType(const MetaDataField* _fields, size_t _numFields) - : totalSize(0), numFields(_numFields), fields(0) { - fields = new MetaDataField[numFields]; - for (size_t i = 0; i < numFields; i++) { - fields[i] = _fields[i]; - totalSize += fields[i].size; - } - } - - ~MetaDataType() { - if (fields) - delete[] fields; - } - - size_t size() const { return totalSize; } - - size_t read(void* addr, size_t field) const { - if (field >= numFields) - throw strex("Invalid field index"); - void* p = (unsigned char*)addr + fields[field].offset; - switch (fields[field].size) { - case 1: return *(unsigned char*)p; break; - case 2: return *(unsigned short*)p; break; - case 4: return *(unsigned int*)p; break; - default: throw strex("Invalid field size"); - } - } - -private: - MetaDataType(const MetaDataType&); - MetaDataType& operator=(const MetaDataType&); - - size_t totalSize; - size_t numFields; - MetaDataField* fields; -}; - -class DotNetFile { -public: - DotNetFile(const wchar_t* filename); - ~DotNetFile(); - - bool isYourImageBase(void* addr) const; - void* getMethodHeader(unsigned index, void* imageBase = 0) const; - const char* getMethodName(unsigned index, void* imageBase = 0) const; - void* getMethodDef(unsigned index, void* imageBase) const; - size_t getNumMethods() const; - const MetaDataType* getMethodType() const { return metaDataTypes[iMethodDef]; } - const MetaDataType* getType(MetaDataIndex t) const { return metaDataTypes[t]; } - size_t getStandAloneSigBlobIndex(unsigned index, void* imageBase) const; - -private: - static const size_t METADATA_TYPES = 64; - DotNetFile(const DotNetFile&); - DotNetFile& operator=(const DotNetFile&); - - void fread(long offset, void* buf, size_t size) const; - void fread(void* buf, size_t size) const; - void loadImage(const _IMAGE_FILE_HEADER& fileHeader, DWORD imageSize, DWORD headerSize); - void loadImage(DWORD rva, DWORD fileOffset, DWORD sizeRawData); - void* rvaToPtr(DWORD rva, size_t size) const; - size_t ptrToRva(void* addr) const; - size_t rvaToOffset(DWORD rva) const; - void* metaOffsToAddr(DWORD offs, DWORD size) const; - void initStreams(); - Stream* findStream(const char* name) const; - void initMetadataTables(); - void* getMetaDataTableElem(MetaDataIndex metaIndex, unsigned index, void* imageBase) const; - - FILE* file; - _IMAGE_SECTION_HEADER* sectionHeaders; - size_t numSections; - unsigned char* image; - size_t imageSize; - size_t sizeOfHeaders; - IMAGE_COR20_HEADER* cor20Header; - unsigned char* metadata; - Stream* streams; - size_t numStreams; - Stream* streamTilde; - Stream* streamBlob; - Stream* streamStrings; - MetaDataTable metaDataTables[METADATA_TYPES]; - MetaDataType* metaDataTypes[METADATA_TYPES]; -}; - -#endif diff --git a/dumpMethodsN/MakeWritable.h b/dumpMethodsN/MakeWritable.h deleted file mode 100644 index 8e6eb2ed..00000000 --- a/dumpMethodsN/MakeWritable.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -#ifndef MAKE_WRITABLE_H -#define MAKE_WRITABLE_H - -#include - -class MakeWritable { -public: - MakeWritable(void* _addr, size_t _size) : addr(_addr), size(_size) { - VirtualProtect(addr, size, PAGE_READWRITE, &oldProtect); - } - ~MakeWritable() { - VirtualProtect(addr, size, oldProtect, &oldProtect); - } - -private: - void* addr; - size_t size; - DWORD oldProtect; -}; - -#endif diff --git a/dumpMethodsN/common.cpp b/dumpMethodsN/common.cpp deleted file mode 100644 index 7d1b903b..00000000 --- a/dumpMethodsN/common.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -#include -#include "common.h" -#include "log.h" - -void dumpMem(void* mem, int size, const char* msg) { - unsigned char* p = (unsigned char*)mem; - - logvv("\nDUMP %08X (%d) - %s\n", p, size, msg); - while (size > 0) { - logvv("%08X", p); - for (int j = 0; j < 16 && size > 0; j++, size--) - logvv(" %02X", *p++); - logvv("\n"); - } -} diff --git a/dumpMethodsN/common.h b/dumpMethodsN/common.h deleted file mode 100644 index d41f3972..00000000 --- a/dumpMethodsN/common.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -#ifndef COMMON_H -#define COMMON_H - -#define ALIGNIT(v, a) (((v)+(a)-1)/(a)*(a)) -#define ALIGN_DOWN(a, v) ((a) & ~((v)-1)) -#define IS_ALIGNED(v, a) (((v) & ((a)-1)) == 0) -#define NUM_ELEMS(x) (sizeof(x)/sizeof(x[0])) - -extern void dumpMem(void* mem, int size, const char* msg = ""); - -#endif diff --git a/dumpMethodsN/dllmain.cpp b/dumpMethodsN/dllmain.cpp deleted file mode 100644 index baa6fd42..00000000 --- a/dumpMethodsN/dllmain.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -#include - -BOOL APIENTRY DllMain(HMODULE, DWORD ul_reason_for_call, LPVOID) { - switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} diff --git a/dumpMethodsN/dumpMethodsN.cpp b/dumpMethodsN/dumpMethodsN.cpp deleted file mode 100644 index b0ad6d86..00000000 --- a/dumpMethodsN/dumpMethodsN.cpp +++ /dev/null @@ -1,598 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -#include -#include -#include -#include -#include -#include -#include "DotNetFile.h" -#include "MakeWritable.h" -#include "DllAlloc.h" -#include "strex.h" -#include "log.h" -#include "common.h" - -#pragma pack(push) -#pragma pack(1) -struct CORINFO_METHOD_INFO { - void* ftn; - void* scope; - unsigned char* ILCode; - unsigned ILCodeSize; - unsigned short maxStack; - unsigned short EHcount; - char other[0x64]; -}; -#pragma pack(pop) - -struct ScopeInfo { - void* imageBase; - CORINFO_METHOD_INFO cmi; -}; - -static const unsigned int DUMPED_METHODS_HEADER_MAGIC = 0x12345678; - -#pragma pack(push) -#pragma pack(1) -struct DumpedMethodsHeader { - unsigned int magic; - unsigned int numMethods; -}; - -struct DumpedMethod { - // method header fields - unsigned short mhFlags; // method header Flags - unsigned short mhMaxStack; // method header MaxStack - unsigned int mhCodeSize; // method header CodeSize - unsigned int mhLocalVarSigTok; // method header LocalVarSigTok - - // methodDef fields - unsigned short mdImplFlags; // methodDef ImplFlags - unsigned short mdFlags; // methodDef Flags - unsigned int mdName; // methodDef Name (index into #String) - unsigned int mdSignature; // methodDef Signature (index into #Blob) - unsigned int mdParamList; // methodDef ParamList (index into Param table) - - // Misc - unsigned int token; // metadata token -}; -#pragma pack(pop) - -void hookCompileMethod(); -const ScopeInfo* findDotNetAssembly(const DotNetFile* dotNetFile); - -DotNetFile* dotNetFile = 0; -DllAlloc* dllAlloc = 0; -HMODULE hJitDll = 0; // eg. HMODULE of "clrjit.dll" -void* dotNetAssemblyBase = 0; // Image base of .NET assembly we should dump -CORINFO_METHOD_INFO defaultCmi; -std::wstring inputFilename; // Path of input file - -typedef void* (__stdcall *getJit_t)(void); -typedef int (__stdcall* compileMethod_t)(void* self, void* comp, - CORINFO_METHOD_INFO* info, unsigned flags, BYTE** nativeEntry, - ULONG* nativeSizeOfCode); -compileMethod_t original_compileMethod = 0; -compileMethod_t ourObfuscatedCompileMethod = 0; -getJit_t getJit_func = 0; - -struct MyCorinfoMethodInfo { - static const int SIG = 0xFA149C31; - - MyCorinfoMethodInfo(const CORINFO_METHOD_INFO& _cmi) - : cmi(_cmi), sig(SIG) { - } - - CORINFO_METHOD_INFO cmi; // Must be first field - void* data; - int sig; // Always SIG so we know when we're dumping methods -}; - -struct DumpMethodContext { - DumpMethodContext() : f(0), numMethods(0) {} - ~DumpMethodContext() { - if (f) - fclose(f); - } - FILE* f; - unsigned numMethods; - unsigned token; - const char* name; - size_t methodHeaderRva; - unsigned char* methodHeader; - size_t headerSize; - void* methodBody; - unsigned LocalVarSigTok; - unsigned short flags; - void* methodDef; - const MetaDataType* type; -}; - -getJit_t getGetJitFunc() { - getJit_t getJit_func = (getJit_t)GetProcAddress(hJitDll, "getJit"); - if (!getJit_func) - throw strex("Could not get address of getJit() function"); - return getJit_func; -} - -static const char* wtoa(const wchar_t* s) { - static char buf[8*1024]; - int i = 0; - do { - if (i >= sizeof(buf)) - throw strex("Buffer overflow in wtoa"); - buf[i] = (char)s[i]; - i++; - } while (s[i] != 0); - return buf; -} - -HMODULE getJitDllModule() { -#if 0 - ICLRMetaHost* mh; - if (CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&mh) != S_OK) - throw strex("Could not get ref to CLRMetaHost"); - ICLRRuntimeInfo* rtti; - // Version must match a version dir in %WINDIR%\Microsoft.NET\Framework - if (mh->GetRuntime(L"v4.0.30319", IID_ICLRRuntimeInfo, (LPVOID*)&rtti) != S_OK) - throw strex("Could not get ref to ICLRRuntimeInfo"); - HMODULE hClr; - if (rtti->LoadLibrary(L"clrjit.dll", &hClr) != S_OK) - throw strex("Could not load JIT dll file"); - return hClr; -#else - HMODULE hClr = LoadLibraryW(L"clrjit.dll"); - if (hClr != 0) { - logv("Loaded CLR JIT DLL %s\n", "clrjit.dll"); - return hClr; - } - wchar_t name[1024]; - DWORD size = sizeof(name); - DWORD len; - if (GetCORSystemDirectory(name, size, &len) != S_OK) - throw strex("Could not get CLR installation directory"); - wcscat(name, L"mscorjit.dll"); - hClr = LoadLibraryW(name); - if (hClr != 0) { - logv("Loaded CLR JIT DLL %s\n", wtoa(name)); - return hClr; - } - throw strex("Could not load JIT DLL"); -#endif -} - -// Returns base addr or NULL -void* findModule(void* addr) { - HANDLE hSnap; - for (;;) { - hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0); - if (hSnap != INVALID_HANDLE_VALUE) - break; - if (GetLastError() != ERROR_BAD_LENGTH) - break; - } - if (hSnap == INVALID_HANDLE_VALUE) - throw strex("Could not get module snapshot"); - - MODULEENTRY32 me32; - me32.dwSize = sizeof(me32); - void* baseAddr = 0; - for (BOOL res = Module32First(hSnap, &me32); res; res = Module32Next(hSnap, &me32)) { - if (me32.modBaseAddr <= addr && addr <= me32.modBaseAddr + me32.modBaseSize - 1) { - baseAddr = me32.modBaseAddr; - } - } - - CloseHandle(hSnap); - return baseAddr; -} - -bool hasProtectionHookedJit() { - compileMethod_t* jit_vtbl = *(compileMethod_t**)getJit_func(); - return *jit_vtbl != ourObfuscatedCompileMethod; -} - -// Used only by the following two methods -static const char* dump_methodName = 0; -static unsigned dump_token = 0; -const char* __stdcall returnNameOfMethod(void* arg1, void* arg2, void* arg3) { - (void)arg1; (void)arg2; (void)arg3; - return dump_methodName; -} - -unsigned __stdcall returnMethodToken(void* arg1, void* arg2) { - (void)arg1; (void)arg2; - return dump_token; -} - -bool dumpMethodIndex(unsigned index, DumpMethodContext* ctx) { - dump_token = 0x06000000 + index; - dump_methodName = dotNetFile->getMethodName(index, dotNetAssemblyBase); - logvv("\n========================================================\n"); - logvv("Method name: '%s' (%08X), token: %08X\n", dump_methodName, dump_methodName, dump_token); - - unsigned char* methodHeader = (unsigned char*)dotNetFile->getMethodHeader(index, dotNetAssemblyBase); - if (!methodHeader) - throw strex("Could not get method header"); - if (methodHeader != dotNetAssemblyBase) - dumpMem(methodHeader, 16, "methodHeader"); - - size_t headerSize, codeSize, LocalVarSigTok, methodHeaderRva; - unsigned short maxStack, flags; - void* methodBody; - if (methodHeader == dotNetAssemblyBase) { - headerSize = 0; - maxStack = 0; - codeSize = 0; - flags = 0; - LocalVarSigTok = 0; - methodBody = 0; - methodHeaderRva = 0; - } - else if ((*methodHeader & 3) == 2) { // Tiny header - headerSize = 1; - maxStack = 8; - codeSize = *methodHeader >> 2; - flags = 2; - LocalVarSigTok = 0; - methodBody = methodHeader + headerSize; - methodHeaderRva = methodHeader - (unsigned char*)dotNetAssemblyBase; - } - else { // Fat header - headerSize = (methodHeader[1] >> 4) * 4; - maxStack = *(unsigned short*)(methodHeader + 2); - codeSize = *(unsigned int*)(methodHeader + 4); - flags = *(WORD*)methodHeader; - LocalVarSigTok = *(DWORD*)(methodHeader + 8); - methodBody = methodHeader + headerSize; - methodHeaderRva = methodHeader - (unsigned char*)dotNetAssemblyBase; - } - - ctx->token = dump_token; - ctx->name = dump_methodName; - ctx->methodHeaderRva = methodHeaderRva; - ctx->methodHeader = methodHeader; - ctx->headerSize = headerSize; - ctx->methodBody = methodBody; - ctx->flags = flags; - ctx->LocalVarSigTok = LocalVarSigTok; - ctx->methodDef = dotNetFile->getMethodDef(index, dotNetAssemblyBase); - ctx->type = dotNetFile->getMethodType(); - - MyCorinfoMethodInfo info = defaultCmi; - info.data = ctx; - info.cmi.ILCode = (BYTE*)methodBody; - info.cmi.ILCodeSize = codeSize; - info.cmi.maxStack = maxStack; - - void* mem[0x10]; - memset(mem, 0, sizeof(mem)); - mem[1] = &mem[2]; - mem[3] = (void*)0x14; - mem[5] = (void*)0x1C; - mem[6] = &mem[7]; - mem[7] = returnNameOfMethod; - mem[8] = &mem[0]; - mem[13] = returnMethodToken; // Older .NET version - mem[14] = returnMethodToken; // Newer .NET version - - void* self = getJit_func(); - BYTE* nativeEntry = 0; - ULONG nativeSizeOfCode = 0; - void* comp = mem; - compileMethod_t compileMethod = **(compileMethod_t**)self; - logvv("Calling protection to decrypt code, scope: %08X, token: %08X\n", info.cmi.scope, dump_token); - compileMethod(self, comp, &info.cmi, 0, &nativeEntry, &nativeSizeOfCode); - logvv("Calling protection to decrypt code: DONE\n"); - - return true; -} - -extern "C" __declspec(dllexport) int __stdcall dumpCode(const wchar_t* methodsFilename) { - try { - if (!hasProtectionHookedJit()) { - // CliSecure sometimes fails to load for an unknown reason. It happens rarely, but - // it doesn't seem to happen when I use .NET 2.0, only 4.0. - loge("Protection hasn't hooked JIT yet! Try again or try .NET != 4.0!\n"); - return 0; - } - - std::wstring name(inputFilename + L".methods"); - if (methodsFilename != 0 && *methodsFilename != 0) - name = methodsFilename; - - DumpMethodContext ctx; - ctx.f = _wfopen(name.c_str(), L"wb"); - if (!ctx.f) - throw strex("Could not create methods file"); - - DumpedMethodsHeader header = {0}; - header.magic = DUMPED_METHODS_HEADER_MAGIC; - - if (fwrite(&header, 1, sizeof(header), ctx.f) != sizeof(header)) - throw strex("Could not write to dumped methods file"); - - const size_t numMethods = dotNetFile->getNumMethods(); (void)numMethods; - for (size_t i = 1; i <= numMethods; i++) - dumpMethodIndex(i, &ctx); - - if (fseek(ctx.f, 0, SEEK_SET)) - throw strex("Could not seek #3"); - header.numMethods = ctx.numMethods; - if (fwrite(&header, 1, sizeof(header), ctx.f) != sizeof(header)) - throw strex("Could not write to dumped methods file"); - } - catch (std::exception& ex) { - loge("EXCEPTION #3: %s\n", ex.what()); - return 0; - } - - return 1; -} - -#define PE_ALIGNMENT 0x10000 - -bool isPeImage(void* addr) { - __try { - if (!addr) - return false; - if (!IS_ALIGNED((size_t)addr, PE_ALIGNMENT)) - return false; - - unsigned char* p = (unsigned char*)addr; - IMAGE_DOS_HEADER* idh = (IMAGE_DOS_HEADER*)p; - if (idh->e_magic != IMAGE_DOS_SIGNATURE) - return false; - p += idh->e_lfanew; - if (*(DWORD*)p != IMAGE_NT_SIGNATURE) - return false; - } - __except (EXCEPTION_EXECUTE_HANDLER) { - return false; - } - - return true; -} - -static void* __getImagebase1(void* addr) { - HMODULE hMod; - if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)addr, &hMod) == 0) - return 0; - return (void*)hMod; -} - -static void* __getImagebase2(void* addr) { - MEMORY_BASIC_INFORMATION mbi; - if (VirtualQuery(addr, &mbi, sizeof(mbi)) == 0) - return 0; - return mbi.AllocationBase; -} - -static void* __getImagebase3(void* addr) { - size_t offs = ALIGN_DOWN((size_t)addr, PE_ALIGNMENT); - for ( ; offs; offs -= PE_ALIGNMENT) { - if (IsBadReadPtr((const void*)offs, 1)) - return 0; // A PE image shouldn't have empty holes >= PE_ALIGNMENT - if (isPeImage((void*)offs)) - return (void*)offs; - } - - return 0; -} - -void* filterImageBase(void* addr) { - if (isPeImage(addr)) - return addr; - return 0; -} - -void* findImageBase(void* addr) { - void* imageBase = 0; - if (imageBase == 0) - imageBase = filterImageBase(findModule(addr)); - if (imageBase == 0) - imageBase = filterImageBase(__getImagebase1(addr)); - if (imageBase == 0) - imageBase = filterImageBase(__getImagebase2(addr)); - if (imageBase == 0) - imageBase = filterImageBase(__getImagebase3(addr)); - return imageBase; -} - -std::vector imageBases; - -void addImageBase(void* imageBase, const CORINFO_METHOD_INFO* info) { - if (!imageBase) - return; - - for (size_t i = 0; i < imageBases.size(); i++) { - if (imageBases[i].imageBase == imageBase) { - if (imageBases[i].cmi.scope != info->scope) - logw("===WARNING=== new scope but same imageBase! %08X vs %08X\n", imageBases[i].cmi.scope, info->scope); - return; - } - } - - logv("%d. Added imageBase %08X\n", imageBases.size() + 1, imageBase); - ScopeInfo si; - si.cmi = *info; - si.imageBase = imageBase; - imageBases.push_back(si); -} - -const ScopeInfo* findDotNetAssembly(const DotNetFile* dotNetFile) { - for (size_t i = 0; i < imageBases.size(); i++) { - if (dotNetFile->isYourImageBase(imageBases[i].imageBase)) { - return &imageBases[i]; - } - } - - return 0; -} - -int __stdcall myCompileMethod(void* self, void* comp, - CORINFO_METHOD_INFO* info, unsigned flags, BYTE** nativeEntry, - ULONG* nativeSizeOfCode) { - - if (((MyCorinfoMethodInfo*)info)->sig == MyCorinfoMethodInfo::SIG) { - // We're dumping methods - - logvv("code: %08X, size: %08X, maxStack: %04X\n", info->ILCode, info->ILCodeSize, info->maxStack); - - DumpMethodContext* ctx = (DumpMethodContext*)((MyCorinfoMethodInfo*)info)->data; - dumpMem(info->ILCode, info->ILCodeSize, "ILCode"); - dumpMem(ctx->methodDef, ctx->type->size(), "methodDef table"); - if (ctx->methodHeader) - dumpMem(ctx->methodHeader, 16, "method header"); - - DumpedMethod dm; - - dm.mhFlags = ctx->flags; - dm.mhMaxStack = info->maxStack; - dm.mhCodeSize = info->ILCodeSize; - dm.mhLocalVarSigTok = ctx->LocalVarSigTok; - - dm.mdImplFlags = (unsigned short)ctx->type->read(ctx->methodDef, 1); - dm.mdFlags = (unsigned short)ctx->type->read(ctx->methodDef, 2); - dm.mdName = ctx->type->read(ctx->methodDef, 3); - dm.mdSignature = ctx->type->read(ctx->methodDef, 4); - dm.mdParamList = ctx->type->read(ctx->methodDef, 5); - - dm.token = ctx->token; - - dumpMem(&dm, sizeof(dm), "DumpedMethod"); - - if (fwrite(&dm, 1, sizeof(dm), ctx->f) != sizeof(dm)) - throw strex("Could not write DumpedMethod"); - if (fwrite(info->ILCode, 1, info->ILCodeSize, ctx->f) != info->ILCodeSize) - throw strex("Could not write ILCode"); - - ctx->numMethods++; - - return 0; - } - else { - void* imageBase = findImageBase(info->ILCode); - addImageBase(imageBase, info); - logvv("myCompileMethod: called. %08X (%3d), base: %08X, info: %08X, scope: %08X\n", info->ILCode, info->ILCodeSize, imageBase, info, info->scope); - - return original_compileMethod(self, comp, info, flags, nativeEntry, nativeSizeOfCode); - } -} - -// dest => memory to write to (start of method). Must be HOOK_METHOD_SIZE bytes. -// destFunc => the real func we should execute -void createHookMethod(void* dest, void* destFunc) { - /* - * Obfuscate the code a little bit just in case a protection checks - * for JMP XYZ. - * B8 xx xx xx xx mov eax, xxxxxxxx - * 2D xx xx xx xx sub eax, xxxxxxxx - * 50 push eax - * C3 retn - */ -#define HOOK_METHOD_SIZE 12 - - const size_t offs = (size_t)destFunc; - unsigned char* p = (unsigned char*)dest; - *p++ = 0xB8; - *(DWORD*)p = offs + 0xC0DEBEEF; - p += 4; - *p++ = 0x2D; - *(DWORD*)p = 0xC0DEBEEF; - p += 4; - *p++ = 0x50; - *p++ = 0xC3; -} - -void hookCompileMethod() { - ourObfuscatedCompileMethod = (compileMethod_t)dllAlloc->alloc(HOOK_METHOD_SIZE); - { - MakeWritable dummy(ourObfuscatedCompileMethod, HOOK_METHOD_SIZE); - createHookMethod(ourObfuscatedCompileMethod, myCompileMethod); - } - - getJit_func = getGetJitFunc(); - compileMethod_t* jit_vtbl = *(compileMethod_t**)getJit_func(); - original_compileMethod = *jit_vtbl; - { - MakeWritable dummy(jit_vtbl, sizeof(void*)); - *jit_vtbl = ourObfuscatedCompileMethod; - } - logv("Original compileMethod: %p\n", original_compileMethod); -} - -extern "C" __declspec(dllexport) int __stdcall initialize1(int logLevel, const wchar_t* filename) { - static bool initialized = false; - int ret = 1; - if (!initialized) { - try { - setLogLevel(logLevel); - - hJitDll = getJitDllModule(); - - dllAlloc = new DllAlloc(hJitDll); - hookCompileMethod(); - - inputFilename = filename; - dotNetFile = new DotNetFile(filename); - - initialized = true; - } - catch (std::exception& ex) { - loge("EXCEPTION #1: %s\n", ex.what()); - ret = 0; - } - } - - return ret; -} - -extern "C" __declspec(dllexport) int __stdcall initialize2() { - static bool initialized = false; - int ret = 1; - if (!initialized) { - try { - const ScopeInfo* si = findDotNetAssembly(dotNetFile); - if (!si) - throw strex("Could not find .NET assembly's image base"); - dotNetAssemblyBase = si->imageBase; - defaultCmi = si->cmi; - - initialized = true; - } - catch (std::exception& ex) { - loge("EXCEPTION #2: %s\n", ex.what()); - ret = 0; - } - } - - return ret; -} - -extern "C" __declspec(dllexport) int __stdcall foundAssembly() { - return findDotNetAssembly(dotNetFile) != 0; -} - -extern "C" __declspec(dllexport) void __stdcall debug_addImageBase(void* imageBase) { - CORINFO_METHOD_INFO info = {0}; - addImageBase(imageBase, &info); -} diff --git a/dumpMethodsN/dumpMethodsN.vcxproj b/dumpMethodsN/dumpMethodsN.vcxproj deleted file mode 100644 index b3f0f59f..00000000 --- a/dumpMethodsN/dumpMethodsN.vcxproj +++ /dev/null @@ -1,111 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9} - Win32Proj - dumpMethodsN - - - - DynamicLibrary - true - NotSet - - - DynamicLibrary - false - true - NotSet - - - - - - - - - - - - - true - - - false - - - - NotUsing - Level4 - Disabled - WIN32;_CRT_SECURE_NO_WARNINGS;USE_DEPRECATED_CLR_API_WITHOUT_WARNING;_DEBUG;_WINDOWS;_USRDLL;DOTNETDUMPER_EXPORTS;%(PreprocessorDefinitions) - true - - - - - - - Windows - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;MSCorEE.lib;%(AdditionalDependencies) - - - - - Level4 - NotUsing - MaxSpeed - true - true - WIN32;_CRT_SECURE_NO_WARNINGS;USE_DEPRECATED_CLR_API_WITHOUT_WARNING;NDEBUG;_WINDOWS;_USRDLL;DOTNETDUMPER_EXPORTS;%(PreprocessorDefinitions) - true - - - - - - - Windows - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;MSCorEE.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - false - - - false - - - - - - - - - - - \ No newline at end of file diff --git a/dumpMethodsN/dumpMethodsN.vcxproj.filters b/dumpMethodsN/dumpMethodsN.vcxproj.filters deleted file mode 100644 index e4775bc4..00000000 --- a/dumpMethodsN/dumpMethodsN.vcxproj.filters +++ /dev/null @@ -1,50 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/dumpMethodsN/log.cpp b/dumpMethodsN/log.cpp deleted file mode 100644 index 36eefa5d..00000000 --- a/dumpMethodsN/log.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -#include -#include -#include "log.h" - -enum { - error, - warning, - normal, - verbose, - veryverbose, -}; - -static int logLevel = normal; - -void setLogLevel(int level) { - logLevel = level; -} - -static void log(int level, const char* format, va_list valist) { - if (level <= logLevel) - vprintf(format, valist); -} - -void loge(const char* format, ...) { - va_list argptr; - va_start(argptr, format); - log(error, format, argptr); - va_end(argptr); -} - -void logw(const char* format, ...) { - va_list argptr; - va_start(argptr, format); - log(warning, format, argptr); - va_end(argptr); -} - -void logn(const char* format, ...) { - va_list argptr; - va_start(argptr, format); - log(normal, format, argptr); - va_end(argptr); -} - -void logv(const char* format, ...) { - va_list argptr; - va_start(argptr, format); - log(verbose, format, argptr); - va_end(argptr); -} - -void logvv(const char* format, ...) { - va_list argptr; - va_start(argptr, format); - log(veryverbose, format, argptr); - va_end(argptr); -} diff --git a/dumpMethodsN/log.h b/dumpMethodsN/log.h deleted file mode 100644 index 065fbc53..00000000 --- a/dumpMethodsN/log.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -#ifndef LOG_H -#define LOG_H - -void setLogLevel(int level); -void loge(const char* format, ...); -void logw(const char* format, ...); -void logn(const char* format, ...); -void logv(const char* format, ...); -void logvv(const char* format, ...); - -#endif diff --git a/dumpMethodsN/strex.h b/dumpMethodsN/strex.h deleted file mode 100644 index 7cd356f4..00000000 --- a/dumpMethodsN/strex.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - Copyright (C) 2011 de4dot@gmail.com - - This file is part of de4dot. - - de4dot is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - de4dot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with de4dot. If not, see . -*/ - -#ifndef STREX_H -#define STREX_H - -#include -#include - -class strex : public std::exception { -public: - strex(std::string str) : s(str) {} - const char* what() const throw() { return s.c_str(); } -private: - std::string s; -}; - -#endif