大家在使用Reflector浏览,分析各种.Net Assembly的时候,尤其是在分析EXE文件的时候,面对成百上千个Class不知所措时,我们总希望尽快抓住主线,知道这个程序是怎样一步步执行的。这个时候,我们通常要“从头抓起”——找到程序的EntryPoint,也即入口函数(通常为Main函数)。
且不用说那些经过混淆,把Main函数改了名字的,就算是没有经过混淆,要从数十个Namespace,成百上千个Class当中找到Main函数也不是一件容易的事情。我们多么希望找到Main函数是Reflector本身带有的一项功能啊!可惜的是,我找了好久没有找到(其实,的确是有这项功能的……就在Assembly上点右键出现的菜单中)。
但是我突然想到,有找这个功能的时间,不如自己来做一个插件——做这个插件,只需要3分钟即可,远比翻来翻去轻松得多。
说做就做,下面就是本插件的焙制方法。
首先,对于不熟悉Reflector的插件的朋友需要知道的是,Reflector的插件就是一个实现了Reflector.IPackage接口的Assembly。首先我们把Reflector.exe加入Reference,然后使用下面的语句:
using Reflector;
using Reflector.CodeModel;
即可使用其提供的各种功能了。然后,通过ICommandBarManager在"Tools"下添加一个菜单项"Go to EntryPoint",以及设置好快捷键(Ctrl + E),最后再为该菜单项添加对应的EventHandler即可。(注意,必须先选择一个Assembly之后才能跳转到其EntryPoint,选择了Assembly下面的类型、成员等等则会报错)
完整代码如下:
且不用说那些经过混淆,把Main函数改了名字的,就算是没有经过混淆,要从数十个Namespace,成百上千个Class当中找到Main函数也不是一件容易的事情。我们多么希望找到Main函数是Reflector本身带有的一项功能啊!可惜的是,我找了好久没有找到(其实,的确是有这项功能的……就在Assembly上点右键出现的菜单中)。
但是我突然想到,有找这个功能的时间,不如自己来做一个插件——做这个插件,只需要3分钟即可,远比翻来翻去轻松得多。
说做就做,下面就是本插件的焙制方法。
首先,对于不熟悉Reflector的插件的朋友需要知道的是,Reflector的插件就是一个实现了Reflector.IPackage接口的Assembly。首先我们把Reflector.exe加入Reference,然后使用下面的语句:
using Reflector;
using Reflector.CodeModel;
即可使用其提供的各种功能了。然后,通过ICommandBarManager在"Tools"下添加一个菜单项"Go to EntryPoint",以及设置好快捷键(Ctrl + E),最后再为该菜单项添加对应的EventHandler即可。(注意,必须先选择一个Assembly之后才能跳转到其EntryPoint,选择了Assembly下面的类型、成员等等则会报错)
完整代码如下:
using System;
using System.Windows.Forms;
using Reflector;
using Reflector.CodeModel;
namespace EntryPointLookup
{
public class PluginPackage : IPackage
{
private IWindowManager m_WindowsManager;
private ICommandBarManager m_CommandBarManager;
private IAssemblyBrowser m_assemblyBrowser;
private ICommandBarButton m_gotoEntryPointBtn;
public void Load(IServiceProvider serviceProvider)
{
m_WindowsManager = (IWindowManager)serviceProvider.GetService(typeof(IWindowManager));
m_CommandBarManager = (ICommandBarManager)serviceProvider.GetService(typeof(ICommandBarManager));
m_assemblyBrowser = (IAssemblyBrowser)serviceProvider.GetService(typeof(IAssemblyBrowser));
foreach (ICommandBarMenu item in m_CommandBarManager.CommandBars["MenuBar"].Items)
{
if (item.Identifier == "Tools")
{
m_gotoEntryPointBtn = item.Items.AddButton("Go to EntryPoint", new EventHandler(MenuEntryPoint_Click), Keys.Control | Keys.E);
}
}
}
private void MenuEntryPoint_Click(object sender, EventArgs e)
{
if (m_assemblyBrowser != null && m_assemblyBrowser.ActiveItem != null)
{
IAssembly assembly = m_assemblyBrowser.ActiveItem as IAssembly;
if (assembly != null)
{
if (assembly.EntryPoint != null)
{
m_assemblyBrowser.ActiveItem = assembly.EntryPoint;
}
else
{
m_WindowsManager.ShowMessage("We cannot find an entrypoint inside the current assembly.");
}
}
else
{
m_WindowsManager.ShowMessage("Please click the top node of the assembly first.");
}
}
}
public void Unload()
{
if (m_gotoEntryPointBtn != null)
{
foreach (ICommandBarMenu item in m_CommandBarManager.CommandBars["MenuBar"].Items)
{
if (item.Identifier == "Tools")
{
item.Items.Remove(m_gotoEntryPointBtn);
}
}
}
}
}
}
using System.Windows.Forms;
using Reflector;
using Reflector.CodeModel;
namespace EntryPointLookup
{
public class PluginPackage : IPackage
{
private IWindowManager m_WindowsManager;
private ICommandBarManager m_CommandBarManager;
private IAssemblyBrowser m_assemblyBrowser;
private ICommandBarButton m_gotoEntryPointBtn;
public void Load(IServiceProvider serviceProvider)
{
m_WindowsManager = (IWindowManager)serviceProvider.GetService(typeof(IWindowManager));
m_CommandBarManager = (ICommandBarManager)serviceProvider.GetService(typeof(ICommandBarManager));
m_assemblyBrowser = (IAssemblyBrowser)serviceProvider.GetService(typeof(IAssemblyBrowser));
foreach (ICommandBarMenu item in m_CommandBarManager.CommandBars["MenuBar"].Items)
{
if (item.Identifier == "Tools")
{
m_gotoEntryPointBtn = item.Items.AddButton("Go to EntryPoint", new EventHandler(MenuEntryPoint_Click), Keys.Control | Keys.E);
}
}
}
private void MenuEntryPoint_Click(object sender, EventArgs e)
{
if (m_assemblyBrowser != null && m_assemblyBrowser.ActiveItem != null)
{
IAssembly assembly = m_assemblyBrowser.ActiveItem as IAssembly;
if (assembly != null)
{
if (assembly.EntryPoint != null)
{
m_assemblyBrowser.ActiveItem = assembly.EntryPoint;
}
else
{
m_WindowsManager.ShowMessage("We cannot find an entrypoint inside the current assembly.");
}
}
else
{
m_WindowsManager.ShowMessage("Please click the top node of the assembly first.");
}
}
}
public void Unload()
{
if (m_gotoEntryPointBtn != null)
{
foreach (ICommandBarMenu item in m_CommandBarManager.CommandBars["MenuBar"].Items)
{
if (item.Identifier == "Tools")
{
item.Items.Remove(m_gotoEntryPointBtn);
}
}
}
}
}
}