亲手焙制一个极其简单但却极其实用的Reflector插件

大家在使用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就可以了。

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值