这是一篇旧文档
最近有一点迷上MSIL动态反汇编了,所有有了下面的代码。
该代码可以获取一个类型的方法,从方法获取指针,再从指针还原到方法。
可用用在MSIL动态反汇编指令还原中。
Imports System.Reflection
Public Class frmMain
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' 获取方法所在类型的类型
Dim t As Type = Me.GetType
' 获取该方法信息
Dim m1 As MethodInfo = t.GetMethod("MySub", BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance)
Dim i As Integer = m1.MetadataToken '获取方法的原数据指针
' 获取类型所在的模块句柄
Dim mdt As ModuleHandle = t.Module.ModuleHandle
' 从模块句柄中返回方法句柄,并利用方法句柄重新构建方法信息
Dim mth As RuntimeMethodHandle = mdt.ResolveMethodHandle(i)
Dim m2 As MethodInfo = MethodInfo.GetMethodFromHandle(mth)
' 测试该方法
m2.Invoke(Me, Nothing)
End Sub
Private Sub MySub()
MsgBox("Hello???")
End Sub
End Class
利用反射我们可以动态地载入一个程序集,并能通过Type来分析程序集类型内部的元素。我们可以从MethodInfo.GetMethodBody.GetILAsByteArray
方法获取一个方法内部的IL指令数据,通过分析每一个字节来重新还原IL代码!当然,因为是IL字节数据,所以所有的方法、字段、类型等等元素都被映射为了运行时指针,我们可以通过上面的代码来还原这些指针的原始信息!!!
另外,除了用上面的代码获取原方法信息之外,也可以使用 Me.GetType.Module.Resolve****
来获得同样的效果,可以获得模块内字段、方法、字符、类型等等成员信息,使用上也比上面要简单一些。