修改.NET程式或DLL的幾種方法
本文目的是回答一個朋友關於修改程式集的留言,都是比較簡單的修改方式,不涉及脫殼等。
1: 利用ILASM和ILDASM
我們先建立如下測試程式:
namespace Test
{
class Program
{
static void Main(string[] args)
{
string s = "hello world!";
Console.WriteLine(s);
Console.ReadKey();
}
}
}
編譯之後得到Test.exe
開啟Visual studio提供的命令列工具,它已經預設的設定好了相關的環境變數,輸入如下命令:
ildasm test.exe /OUT=test.il
將得到兩個檔案:test.il和test.res,用記事本開啟test.il,將看到如下IL程式碼:
IL_0000: ldstr "hello world!"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: call void [mscorlib]System.Console::WriteLine(string)
IL_000c: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
IL_0011: pop
IL_0012: ret
我們將第一行修改為:
IL_0000: ldstr "hello world! --has been modified"
當然也可以增加一些函式的呼叫和刪除我們不想要的函式,如果對IL不熟悉,可以先在VS中寫好想要的程式碼,反編譯為IL,然後直接拷貝過來。修改完後,點儲存,在命令列執行如下命令:
ilasm /OUT=test2.exe test.il
如果語法沒有錯誤,將看到如下提示
Source file is ANSI
Assembled method Test.Program::Ma
Assembled method Test.Program::.c
Creating PE file
Emitting classes:
Class 1: Test.Program
Emitting fields and methods:
Global
Class 1 Methods: 2;
Emitting events and properties:
Global
Class 1
Writing PE file
Operation completed successfully
證明已經修改成功,我們可以直接執行test2.exe,發現程式已經按我們修改的輸出了:
hello world! -- has been modified.
2.利用Reflector的外掛Reflexil
直接用IL修改比較麻煩,不小心很容易出錯,幸好我們有Jb Evain編寫的Reflexil。
Reflexil基於Mono.Cecil,是一個強大的程式集編輯器。
下載完後開啟Reflector --> View --> Add-Ins --> Add --> 選擇Reflexil.dll,
以後就可以直接用Reflector的Tools打開了。
開始正式的修改,用Reflector開啟test.exe,開啟Reflexil,選擇Main函式,可以發現IL程式碼顯示在下方了,可以點選右鍵Edit,Delete,Create等操作,沒錯,你還發現了Replace all with code,通過這個可以直接用C#程式碼直接修改。其它的功能多試試就明白了,另外點選類的時候,還可以修改類的訪問許可權等,比如將private改成public。我們選中第0行,直接選擇Edit,將Operand後面的文字修改為:hello world! -- modified by reflexil.點選Update,在Reflector中選中Test.exe module,Save as test3.exe。執行test3.exe,就看到我們的修改生效了。
相關推薦
修改.NET程式或DLL的幾種方法
http://hi.baidu.com/expertsearch/blog/item/3763489498ffe9027bf48092.html本文目的是回答一個朋友關於修改程式集的留言,都是比較簡單的修改方式,不涉及脫殼等。1: 利用ILASM和ILDASM我們先建立如下測試程式:namespace
[轉] 用javascript修改css偽類的幾種方法
with pseudo com styles javascrip nts lan css偽類 pos 用javascript修改css偽類的幾種方法: Modify pseudo element styles with JavaScript http://pankajpar
asp.net分割字串的幾種方法
在編寫程式中,經常要用到分割的方法來處理一些字串。這裡總結了幾種常用的分割方法: 下面一一介紹一下: 1、最簡單最常用的方法,以一個指定的字元進行的分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split
ASP.NET 重定向的幾種方法小結
一、Transfer Execute Redirect重定向方法介紹 1.Server.Transfer方法: Server.Transfer("m2.aspx");//頁面轉向(伺服器上執行)。伺服器停止解析本頁,儲存此頁轉向前的資料後,再使頁面轉向到m2.aspx,
修改kafka topic的offset幾種方法
查詢topic的offset的範圍 用下面命令可以查詢到topic:test broker:suna:9092的offset的最小值: bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list suna
.Net 程序在自定義位置查找托管/非托管 dll 的幾種方法
bsp aps assembly ntp nba ddd lex += directory 原文:.Net 程序在自定義位置查找托管/非托管 dll 的幾種方法一、自定義托管 dll 程序集的查找位置 目前(.Net4.7)能用的有2種: 1 #define
windows下.bat程式開機自啟動的幾種方法
以下兩種方法,親測能夠執行的1、編寫VBS指令碼新建指令碼script.vbs,指令碼內容如下:set ws=WScript.CreateObject("WScript.Shell")ws.Run "C:\Users\Administrator\Desktop\aa.bat /start",0 //bat的存
Linux獲取網頁原始碼的幾種方法 linux爬蟲程式
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
centos7 修改網絡卡名的集中幾種方法
centos 7系列預設安裝時 網絡卡名都是隨即的,像ens33 而且每次都有可能不一樣…給我們自動化運維工作帶來了很大的不方面。 現在我測試過 推薦兩種方法給大家 1 .我們在安裝系統時進行 設定核心引數 這種方法最簡單直接。 移動上下方向按鍵 到第一個 然後按 Tab 鍵 輸入 ne
C#獲取程式執行路徑的幾種方法
通過控制檯程式打印出每種方法的結果 static void Main(string[] args) { Console.WriteLine("typeof(Program).Assembly.Location:\r\n{0}",
IP代理或日常使用過程中解決ip被封鎖IP限制的幾種方法
方法1 使用多IP: 1.IP必須需要,比如ADSL。如果有條件,其實可以跟機房多申請外網IP。 2.在有外網IP的機器上,部署代理伺服器。 3.你的程式,使用輪訓替換代理伺服器來訪問想要採集的網站。 好處: 1.程式邏輯變化小,只需要代理功能。 2.根據對方網
微信小程式___返回上一頁攜帶引數的幾種方法
方法一 把引數資料放入本地快取( wx.setStorage(wx.setStorageSync)) 上一個頁面再從快取中取出(wx.getStorage(wx.getStorageSync)) 同時退出登入時要清除快取(wx.clearStorage(wx.clea
scrapy修改user-agent的幾種方法
方法1: 修改setting.py中的User-Agent # Crawl responsibly by identifying yourself (and your website) on the user-agent USER_AGENT = ‘Hello
微信小程式解析富文字的幾種方法
工作中有遇到過在小程式中需要解析後臺管理系統設定的富文字內容, 一,可以使用wxParse外掛解析html 使用方法 1.在github中下載 下載地址 https://github.com/icindy/wxParse/tree/master/wxParse 2.
字元陣列或字串逆轉的幾種方法
public class Test { public static void main(String[] args) { //字元逆轉 char[] ss=new char[]{'a','b','c'}; // char[] temp = new cha
ASP.NET-GridView資料繫結的幾種方法
前提:頁面需要顯示多個表中的欄位,幾個表之間通過欄位保持聯絡 方法一:直接進行級聯查詢,並將結果集通過SqlDataAdapter填充DataSet,之後將DataTable的DataView繫結到GridView的資料來源,: //連線資料庫,並獲得返回結果; public dataset GetR
微信小程式 傳值取值的幾種方法總結,百分百會用到
微信小程式 傳值取值 小程式裡常見的取值有以下幾種,一個完整的專案寫下來,用到的概率幾乎是100%。 列表index下標取值 頁面傳值 form表單取值 列表index下標取值 實現方式是:data-index=”{{index}}”挖坑及e.cu
64位win7禁用驅動程式簽名強制 幾種常用方法
Driver Signature Enforcement Overrider 其實想要在64位win7中使用未有簽名的驅動程式還是有很多方法的,如上圖中,開機之後在登入等待介面按下F8鍵,進入Windows系統的高階啟動項,我們會發現與原有的XP系統多了一些不同的地
C#/.NET中刪除指定資料夾下所有檔案和資料夾的幾種方法彙總
我們知道,在C#/.NET中的System.IO名稱空間下,都是關於檔案和資料夾資訊操作的類。如果在開發中有刪除指定資料夾下所有檔案和資料夾這樣的需要,應該如何使用C#/.NET來實現這個需求呢?方法一:直接刪除整個指定資料夾使用使用Directory.Delete("資料
【原創】展開二層巢狀列表(或pd.Series)的幾種方法效率對比
轉載請註明出處:https://www.cnblogs.com/oceanicstar/p/10248763.html ★二層巢狀列表(或以列表為元素的pd.Series)有以下幾種展開方式 (1)列表生成式 (2)用np.sum方法(將外層列表中各個子列表相加)