/// <summary> /// コンストラクタです。 /// </summary> public MethodData(PEData data, MemberRefTable m) { MethodData.Initialize(); this.Parse(data, m); }
private void Parse(PEData data, TableBase m) { this.data = data; this.table = m; this.Flags = this.Size = this.MaxStack = this.CodeSize = this.LocalVarSigTok = 0; this.ilCodes = null; this.ilAddr = 0; this.LocalVarSigTok = 0; this.LocalVarSig = null; this.LocalVars = null; this.ImplMap = null; this.Kind = this.DataSize = 0; this.EHTable = null; this.ReadSignature(); int ad = this.RVA; if (ad == 0) { return; } int h = this.data.data[ad]; if ((h & 3) == (int)CorILMethod.TinyFormat) { this.CodeSize = h >> 2; ad++; } else { h = Util.GetInt16(this.data.data, ad); this.Flags = h & 0xfff; this.Size = (h >> 12) * 4; ad += 2; this.MaxStack = Util.GetInt16(this.data.data, ad); ad += 2; this.CodeSize = Util.GetInt32(this.data.data, ad); ad += 4; this.LocalVarSigTok = Util.GetInt32(this.data.data, ad); ad += 4; this.ReadLocalVars(); } this.ilAddr = ad; ad += this.CodeSize; if ((this.Flags & (int)CorILMethod.MoreSects) == 0) { return; } /// More Sections int pad = 4 - (ad & 3); if (pad < 4) { ad += pad; } int end = ad; this.Kind = this.data.data[ad++]; bool isFat = (this.Kind & (int)CorILMethod_Sect.FatFormat) != 0; if (!isFat) { this.DataSize = this.data.data[ad]; } else { this.DataSize = Util.GetInt24(this.data.data, ad); } ad += 3; end += this.DataSize; this.EHTable = new ArrayList(); while (ad < end) { ExceptionHandlingClauses ex = new ExceptionHandlingClauses(); if (!isFat) { ex.Flags = Util.GetInt16(data.data, ad); ad += 2; ex.TryOffset = Util.GetInt16(data.data, ad); ad += 2; ex.TryLength = data.data[ad++]; ex.HandlerOffset = Util.GetInt16(data.data, ad); ad += 2; ex.HandlerLength = data.data[ad++]; } else { ex.Flags = Util.GetInt32(data.data, ad); ad += 4; ex.TryOffset = Util.GetInt32(data.data, ad); ad += 4; ex.TryLength = Util.GetInt32(data.data, ad); ad += 4; ex.HandlerOffset = Util.GetInt32(data.data, ad); ad += 4; ex.HandlerLength = Util.GetInt32(data.data, ad); ad += 4; } if (ex.Flags == (int)COR_ILEXCEPTION_CLAUSE.EXCEPTION) { ex.ClassToken = Util.GetInt32(data.data, ad); } else { ex.FilterOffset = Util.GetInt32(data.data, ad); } ad += 4; this.EHTable.Add(ex); } }
public void MakeTree(PEData data) { ArrayList listType = this.Tables[(int)MetadataTables.TypeDef]; int len = listType.Count; for (int i = 0; i < len; i++) { this.MakeTree(listType[i] as TypeDefTable, i + 1 < len ? listType[i + 1] as TypeDefTable : null); } foreach (object obj in this.Tables[(int)MetadataTables.AssemblyRef]) { (obj as TableBase).Children = new ArrayList[] { new ArrayList() } ; } foreach (object obj in this.Tables[(int)MetadataTables.TypeRef]) { (obj as TableBase).Children = new ArrayList[] { new ArrayList(), new ArrayList(), new ArrayList() } ; } foreach (object obj in this.Tables[(int)MetadataTables.TypeRef]) { TypeRefTable t = obj as TypeRefTable; if (t.ResolutionScope == 0) { continue; } t.ParentTable = this.GetTable(this.GetToken(CodedIndices.ResolutionScope, t.ResolutionScope)); t.ParentTable.Children[(int)Children.RefNested].Add(t); } foreach (object obj in this.Tables[(int)MetadataTables.MethodDef]) { MethodDefTable m = obj as MethodDefTable; m.Tag = new MethodData(data, m); } foreach (object obj in this.Tables[(int)MetadataTables.MemberRef]) { MemberRefTable m = obj as MemberRefTable; MethodData md = new MethodData(data, m); m.Tag = md; if (m.Class == 0) { continue; } m.ParentTable = this.GetTable(this.GetToken(CodedIndices.MemberRefParent, m.Class)); if (md.IsField) { m.ParentTable.Children[(int)Children.RefField].Add(m); } else { m.ParentTable.Children[(int)Children.RefMethod].Add(m); } } foreach (object obj in this.Tables[(int)MetadataTables.ImplMap]) { ImplMapTable im = obj as ImplMapTable; MethodDefTable m = this.GetTable(this.GetToken(CodedIndices.MemberForwarded, im.MemberForwarded)) as MethodDefTable; if (m != null) { (m.Tag as MethodData).ImplMap = im; } } foreach (object obj in this.Tables[(int)MetadataTables.NestedClass]) { NestedClassTable nc = obj as NestedClassTable; TypeDefTable nst = listType[nc.NestedClass - 1] as TypeDefTable; TypeDefTable enc = listType[nc.EnclosingClass - 1] as TypeDefTable; nst.ParentTable = enc; enc.Children[(int)Children.DefNested].Add(nst); } }
public bool ReadPE(string fn) { try { FileStream fs = new FileStream(fn, FileMode.Open); int len = (int)fs.Length; this.data = new byte[len]; fs.Read(this.data, 0, len); fs.Close(); } catch { System.Console.WriteLine("Can not open: {0}", fn); return false; } this.pedata = new PEData(this.data); if (this.pedata.cli == null) { System.Console.WriteLine("Not CIL assembly: {0}", fn); return false; } return true; }
public void MakeTree(PEData data) { ArrayList listType = this.Tables[(int) MetadataTables.TypeDef]; int len = listType.Count; for (int i = 0; i < len; i++) { this.MakeTree(listType[i] as TypeDefTable, i + 1 < len ? listType[i + 1] as TypeDefTable : null); } foreach (object obj in this.Tables[(int) MetadataTables.AssemblyRef]) { (obj as TableBase).Children = new ArrayList[] { new ArrayList() } ; } foreach (object obj in this.Tables[(int) MetadataTables.TypeRef]) { (obj as TableBase).Children = new ArrayList[] { new ArrayList(), new ArrayList(), new ArrayList() } ; } foreach (object obj in this.Tables[(int) MetadataTables.TypeRef]) { TypeRefTable t = obj as TypeRefTable; if (t.ResolutionScope == 0) continue; t.ParentTable = this.GetTable(this.GetToken(CodedIndices.ResolutionScope, t.ResolutionScope)); t.ParentTable.Children[(int) Children.RefNested].Add(t); } foreach (object obj in this.Tables[(int) MetadataTables.MethodDef]) { MethodDefTable m = obj as MethodDefTable; m.Tag = new MethodData(data, m); } foreach (object obj in this.Tables[(int) MetadataTables.MemberRef]) { MemberRefTable m = obj as MemberRefTable; MethodData md = new MethodData(data, m); m.Tag = md; if (m.Class == 0) continue; m.ParentTable = this.GetTable(this.GetToken(CodedIndices.MemberRefParent, m.Class)); if (md.IsField) { m.ParentTable.Children[(int) Children.RefField].Add(m); } else { m.ParentTable.Children[(int) Children.RefMethod].Add(m); } } foreach (object obj in this.Tables[(int) MetadataTables.ImplMap]) { ImplMapTable im = obj as ImplMapTable; MethodDefTable m = this.GetTable(this.GetToken(CodedIndices.MemberForwarded, im.MemberForwarded)) as MethodDefTable; if (m != null) (m.Tag as MethodData).ImplMap = im; } foreach (object obj in this.Tables[(int) MetadataTables.NestedClass]) { NestedClassTable nc = obj as NestedClassTable; TypeDefTable nst = listType[nc.NestedClass - 1] as TypeDefTable; TypeDefTable enc = listType[nc.EnclosingClass - 1] as TypeDefTable; nst.ParentTable = enc; enc.Children[(int) Children.DefNested].Add(nst); } }
private void Parse(PEData data, TableBase m) { this.data = data; this.table = m; this.Flags = this.Size = this.MaxStack = this.CodeSize = this.LocalVarSigTok = 0; this.ilCodes = null; this.ilAddr = 0; this.LocalVarSigTok = 0; this.LocalVarSig = null; this.LocalVars = null; this.ImplMap = null; this.Kind = this.DataSize = 0; this.EHTable = null; this.ReadSignature(); int ad = this.RVA; if (ad == 0) return; int h = this.data.data[ad]; if ((h & 3) ==(int) CorILMethod.TinyFormat) { this.CodeSize = h >> 2; ad++; } else { h = Util.GetInt16(this.data.data, ad); this.Flags = h & 0xfff; this.Size =(h >> 12) * 4; ad += 2; this.MaxStack = Util.GetInt16(this.data.data, ad); ad += 2; this.CodeSize = Util.GetInt32(this.data.data, ad); ad += 4; this.LocalVarSigTok = Util.GetInt32(this.data.data, ad); ad += 4; this.ReadLocalVars(); } this.ilAddr = ad; ad += this.CodeSize; if ((this.Flags &(int) CorILMethod.MoreSects) == 0) return; /// More Sections int pad = 4 -(ad & 3); if (pad < 4) ad += pad; int end = ad; this.Kind = this.data.data[ad++]; bool isFat =(this.Kind &(int) CorILMethod_Sect.FatFormat) != 0; if (!isFat) { this.DataSize = this.data.data[ad]; } else { this.DataSize = Util.GetInt24(this.data.data, ad); } ad += 3; end += this.DataSize; this.EHTable = new ArrayList(); while (ad < end) { ExceptionHandlingClauses ex = new ExceptionHandlingClauses(); if (!isFat) { ex.Flags = Util.GetInt16(data.data, ad); ad += 2; ex.TryOffset = Util.GetInt16(data.data, ad); ad += 2; ex.TryLength = data.data[ad++]; ex.HandlerOffset = Util.GetInt16(data.data, ad); ad += 2; ex.HandlerLength = data.data[ad++]; } else { ex.Flags = Util.GetInt32(data.data, ad); ad += 4; ex.TryOffset = Util.GetInt32(data.data, ad); ad += 4; ex.TryLength = Util.GetInt32(data.data, ad); ad += 4; ex.HandlerOffset = Util.GetInt32(data.data, ad); ad += 4; ex.HandlerLength = Util.GetInt32(data.data, ad); ad += 4; } if (ex.Flags ==(int) COR_ILEXCEPTION_CLAUSE.EXCEPTION) { ex.ClassToken = Util.GetInt32(data.data, ad); } else { ex.FilterOffset = Util.GetInt32(data.data, ad); } ad += 4; this.EHTable.Add(ex); } }