国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

C#ILDASM使用

2019-11-14 13:50:49
字體:
供稿:網(wǎng)友

IL DASM反編譯工具

  使用C#的猿人或多或少都會對微軟的IL反編譯工具(ildasm.exe)有所認(rèn)識。我最早接觸到這工具是公司同事使用他反編譯exe程序,進行研讀和修改。感覺他還是很強大。
  IL是微軟平臺上的一門中間語言,我們常寫的C#代碼在編譯器中都會自動轉(zhuǎn)換成IL,然后在由即時編譯器(JIT Compiler)轉(zhuǎn)化機器碼,最后被CPU執(zhí)行。ildasm.exe反編譯工具將IL匯編成可跨平臺可執(zhí)行的(pe)文件。可供我們了解別人代碼和修改。有了他我們看待問題可以不用停留在編輯器層面,可深入中間層。

VS中增加IL DASM工具

我們在安裝VS同時都會自動安裝ildasm工具,無需另行安裝。ildasm工具打開方法如下圖:

我們也可以直接wind+R.輸入:C:/PRogram Files (x86)/Microsoft SDKs/Windows/v7.0A/bin/ildasm.exe (window 7 64位 操作系統(tǒng)安裝目錄) 同樣可以打開ildasm。
我們也可以把ildasm工具增加到我們常用的VS中。
1.工具(Tools)-->外部工具(External Tools..)

2.添加內(nèi)容填寫對應(yīng)信息。命令:C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/bin/ildasm.exe
(window 7 64位 操作系統(tǒng)安裝目錄) 。

已上信息填寫完成后,在“工具”選擇卡中能找到我們剛增加的外部工具名稱(IL_DASM)。增加完成后可以小試一把。
國際慣例來段"Hello World"。代碼編寫完后直接F6生成exe文件,然后工具-->IL_DASM-->確認(rèn)(無需修改任何參數(shù),默認(rèn)目標(biāo)文件路徑)。系統(tǒng)會彈出IL工具,我們雙擊Main方法。

這時可以看到Main方法在IL中編譯的代碼。感覺有點陌生不易看懂。 還有IL編譯出現(xiàn)的三角型,正方型都是啥!

IL DASM 基礎(chǔ)

1.圖標(biāo)含義

使用IL反編譯出項目代碼

MANIFEST:是一個附加信息列表,主要包含程序集的一些屬性,如程序集名稱、版本號、哈希算法等;
Democode:項目名稱
Democodeing.Common:命名空間
Democodeing.ICar:接口
Democodeing.Program:類,主要查看存類下面的內(nèi)容。

.class 類信息項代碼:

.class private auto ansi beforefieldinit DemoCoding.Program       extends [mscorlib]System.Object{} // end of class DemoCoding.Program

1).class,表示Program是一個類。并且它繼承自程序集—mscorlib的System.Object類;
2)private,表示訪問權(quán)限;
3)auto,表示程序的內(nèi)存加載全部由CLR來控制;
4)ansi,是為了在沒有托管代碼與托管代碼之間實現(xiàn)無縫轉(zhuǎn)換。這里主要指C、C++代碼等;
5)beforefieldinit,是用來標(biāo)記運行庫(CLR)可以在靜態(tài)字段方法生成后的任意時刻,來加載構(gòu)造器(構(gòu)造函數(shù));

.ctor 方法代碼:

.method public hidebysig specialname rtspecialname         instance void  .ctor() cil managed{  // 代碼大小       7 (0x7)  .maxstack  8  IL_0000:  ldarg.0  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()  IL_0006:  ret} // end of method Program::.ctor

1)cil managed:表示其中為IL代碼,指示編譯器編譯為托管代碼;
2).maxstack:表示調(diào)用構(gòu)造函數(shù).otor期間的評估堆棧(Evaluation Stack) ;
3)  IL_0000:標(biāo)記代碼行開頭;
4)ldarg.0:表示轉(zhuǎn)載第一個成員參數(shù),在實例方法中指的是當(dāng)前實例的引用;
5)call:call一般用于調(diào)用靜態(tài)方法,因為靜態(tài)方法是在編譯期就確定的。而這里的構(gòu)造函數(shù).otor()也是在編譯期就制定的。而另一指令callvirt則表示調(diào)用實例方法, 它是在運行時確定的,因為如前述,當(dāng)調(diào)用方法的繼承關(guān)系時,就要比較基類與派生類的同名函數(shù)的實現(xiàn)方法(virtual和new),以確定調(diào)用的函數(shù)所屬的Method Table;
6)ret:表示執(zhí)行完畢,返回;

Main() 靜態(tài)方法代碼:

.method private hidebysig static void  Main(string[] args) cil managed{  .entrypoint  // 代碼大小       19 (0x13)  .maxstack  8  IL_0000:  nop  IL_0001:  ldstr      "Hello World"  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)  IL_000b:  nop  IL_000c:  call       string [mscorlib]System.Console::ReadLine()  IL_0011:  pop  IL_0012:  ret} // end of method Program::Main

1) hidebysig:表示當(dāng)把此類作為基類,存在派生類時,此方法不被繼承,同上構(gòu)造函數(shù);
2).entrypoint:指令表示CLR加載程序時,是首先從.entrypoint開始的,即從Main方法作為程序的入口函數(shù);
3)nop:為空該指令,主要給外部設(shè)備或者指令間隙準(zhǔn)備時間;
4)ldstr:創(chuàng)建String對象變量"Hello World." ;
5)pop:取出棧頂?shù)闹怠.?dāng)我們不需要把值存入變量時使用;

使用IL DASM 修改EXE程序代碼

1.打開IL工具,選擇所要修改的EXE程序。

2.文件-->轉(zhuǎn)儲。確定后選擇另存路徑,會生成二個文件:*.il 和 *.res

3.用記事本打開*.il修改里面的內(nèi)容:

 .method private hidebysig static void  Main(string[] args) cil managed  {    .entrypoint    // 代碼大小       19 (0x13)    .maxstack  8    IL_0000:  nop    IL_0001:  ldstr      "Hello World-[已使用il工具修改過...]"    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)    IL_000b:  nop    IL_000c:  call       string [mscorlib]System.Console::ReadLine()    IL_0011:  pop    IL_0012:  ret  } // end of method Program::Main

4.把修改后的代碼編譯成EXE程序。

ilasm /exe /output=C:/CK.exe /Resource=C:/Users/Ck/Desktop/coding.res C:/Users/Ck/Desktop/coding.il

修改就這么簡單。運行修改后的EXE程序,值已修改。

 


上一篇:委托

下一篇:001TheHelloWorldInCsharp

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 乡宁县| 河源市| 红安县| 保山市| 偏关县| 迭部县| 庆安县| 赤城县| 阿合奇县| 敖汉旗| 七台河市| 都昌县| 上高县| 左云县| 泽库县| 定结县| 雷波县| 乌鲁木齐县| 龙胜| 江安县| 普宁市| 诏安县| 来宾市| 如东县| 旬阳县| 南通市| 合川市| 杂多县| 长治县| 观塘区| 灵台县| 家居| 海淀区| 张掖市| 永胜县| 肇庆市| 柘城县| 成安县| 吉安市| 盱眙县| 都安|