親手焙制一個極其簡單但卻極其實用的Reflector外掛程式 _assembly

來源:互聯網
上載者: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就可以了。    

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.