親手焙制一個極其簡單但卻極其實用的Reflector外掛程式 _assembly
最後更新:2018-08-22
來源:互聯網
上載者:User
大家在使用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下面的類型、成員等等則會報錯)
完整代碼如下:
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);
}
}
}
}
}
} 把Reflector.exe加入Reference,怎麼加。vs不支援.exe引用
在2003中是不支援,你把檔案名稱改成DLL就可以了。