From 14d27c7941bfedf5a6e64843f4a11c2120d75687 Mon Sep 17 00:00:00 2001 From: de4dot Date: Thu, 1 Nov 2012 09:32:42 +0100 Subject: [PATCH] Add DumpedMethod/DumpedMethods to blocks for now --- blocks/DotNetUtils.cs | 6 +++- blocks/DumpedMethod.cs | 43 ++++++++++++++++++++++++++ blocks/DumpedMethods.cs | 68 +++++++++++++++++++++++++++++++++++++++++ blocks/blocks.csproj | 2 ++ 4 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 blocks/DumpedMethod.cs create mode 100644 blocks/DumpedMethods.cs diff --git a/blocks/DotNetUtils.cs b/blocks/DotNetUtils.cs index 005eeee5..30ff667d 100644 --- a/blocks/DotNetUtils.cs +++ b/blocks/DotNetUtils.cs @@ -149,7 +149,11 @@ namespace de4dot.blocks { return module.GlobalType; } - public static MethodDefinition getModuleTypeCctor(ModuleDefinition module) { + public static DN.MethodDef getModuleTypeCctor(DN.ModuleDef module) { + foreach (var m in module.GlobalType.Methods) { + if (m.Name == ".cctor") + return m; + } return null; } diff --git a/blocks/DumpedMethod.cs b/blocks/DumpedMethod.cs new file mode 100644 index 00000000..3d768859 --- /dev/null +++ b/blocks/DumpedMethod.cs @@ -0,0 +1,43 @@ +/* + Copyright (C) 2011-2012 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 . +*/ + +//TODO: DumpedMethods and DumpedMethod should be moved to dot10 + +using System; + +namespace dot10.DotNet { + [Serializable] + public class DumpedMethod { + public ushort mhFlags; // method header Flags + public ushort mhMaxStack; // method header MaxStack + public uint mhCodeSize; // method header CodeSize + public uint mhLocalVarSigTok; // method header LocalVarSigTok + + public ushort mdImplFlags; // methodDef ImplFlags + public ushort mdFlags; // methodDef Flags + public uint mdName; // methodDef Name (index into #String) + public uint mdSignature; // methodDef Signature (index into #Blob) + public uint mdParamList; // methodDef ParamList (index into Param table) + + public uint token; // metadata token + + public byte[] code; + public byte[] extraSections; + } +} diff --git a/blocks/DumpedMethods.cs b/blocks/DumpedMethods.cs new file mode 100644 index 00000000..fe70ccf8 --- /dev/null +++ b/blocks/DumpedMethods.cs @@ -0,0 +1,68 @@ +/* + Copyright (C) 2011-2012 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 . +*/ + +//TODO: DumpedMethods and DumpedMethod should be moved to dot10 + +using System; +using System.Collections.Generic; +using dot10.DotNet.MD; + +namespace dot10.DotNet { + public interface IStringDecrypter { + string decrypt(uint token); + } + + [Serializable] + public class DumpedMethods { + Dictionary methods = new Dictionary(); + IStringDecrypter stringDecrypter = new NoStringDecrypter(); + + [Serializable] + class NoStringDecrypter : IStringDecrypter { + public string decrypt(uint token) { + return null; + } + } + + public IStringDecrypter StringDecrypter { + get { return stringDecrypter; } + set { stringDecrypter = value; } + } + + public void add(uint token, DumpedMethod info) { + methods[token] = info; + } + + public DumpedMethod get(MethodDef method) { + return get(method.MDToken.ToUInt32()); + } + + public DumpedMethod get(uint token) { + DumpedMethod dm; + methods.TryGetValue(token, out dm); + return dm; + } + + public void add(DumpedMethod dm) { + if (MDToken.ToTable(dm.token) != Table.Method || MDToken.ToRID(dm.token) == 0) + throw new ArgumentException("Invalid token"); + methods[dm.token] = dm; + } + } +} diff --git a/blocks/blocks.csproj b/blocks/blocks.csproj index 7d7a2f48..4cd1f791 100644 --- a/blocks/blocks.csproj +++ b/blocks/blocks.csproj @@ -63,6 +63,8 @@ + +