wiki.php 用Markdown写wiki是一种什么样的体验?

MSIL动态反编译.md

最后更新于 2019-10-06 15:00:41

这是一篇旧文档

最近有一点迷上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**** 来获得同样的效果,可以获得模块内字段、方法、字符、类型等等成员信息,使用上也比上面要简单一些。