VS2017 中 ILDASM的使用

IL是微軟平臺(tái)上的一門(mén)中間語(yǔ)言帘睦,我們常寫(xiě)的C#代碼在編譯器中都會(huì)自動(dòng)轉(zhuǎn)換成IL竣付,然后在由即時(shí)編譯器(JIT Compiler)轉(zhuǎn)化機(jī)器碼古胆,最后被CPU執(zhí)行逸绎。ildasm.exe反編譯工具將IL匯編成可跨平臺(tái)可執(zhí)行的(pe)文件桶良≡煞可供我們了解別人代碼和修改。有了他我們看待問(wèn)題可以不用停留在編輯器層面疲牵,可深入中間層承二。

  1. 第一步 安裝

首先安裝完VS2017之后,在我們的系統(tǒng)中找到我們的ildasm.exe程序的地址纲爸,一般在系統(tǒng)中的地址為:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe

  1. 第二步 添加
圖片.png

在VS2017頂部操作欄目的工具里面亥鸠,我們找到外部工具點(diǎn)擊打開(kāi)


圖片.png

我們?cè)诿畹牟糠州斎胛覀冋f(shuō)的ildasm.exe的地址,其他按照我們圖中所示的填寫(xiě)识啦,點(diǎn)擊確定负蚊,保存為自定義外部工具颓哮。

  1. 第三步 使用


    圖片.png

我們返回外面的工具中家妆,可以看到出現(xiàn)了我們剛才添加的外部工具。


圖片.png

我們點(diǎn)擊查看IL


我們已經(jīng)可以查看自己程序的IL了

  1. 第四步 讀懂
    我們嘗試讀懂IL冕茅,當(dāng)我們遇到一些在編輯層無(wú)法看透的問(wèn)題時(shí)候伤极,我們可以嘗試通過(guò)IL里面來(lái)查看程序的問(wèn)題。下面我提供一份IL類(lèi)型圖:


    圖片.png

如下面這段IL


圖片.png
MANIFEST:是一個(gè)附加信息列表姨伤,主要包含程序集的一些屬性哨坪,如程序集名稱(chēng)、版本號(hào)乍楚、哈希算法等当编;
Democode:項(xiàng)目名稱(chēng)
Democodeing.Common:命名空間
Democodeing.ICar:接口
Democodeing.Program:類(lèi),主要查看存類(lèi)下面的內(nèi)容炊豪。
如這段代碼中
.class private auto ansi beforefieldinit DemoCoding.Program
       extends [mscorlib]System.Object
{
} // end of class DemoCoding.Program
1).class凌箕,表示Program是一個(gè)類(lèi)。并且它繼承自程序集—mscorlib的System.Object類(lèi)词渤;
2)private牵舱,表示訪(fǎng)問(wèn)權(quán)限;
3)auto缺虐,表示程序的內(nèi)存加載全部由CLR來(lái)控制芜壁;
4)ansi,是為了在沒(méi)有托管代碼與托管代碼之間實(shí)現(xiàn)無(wú)縫轉(zhuǎn)換高氮。這里主要指C慧妄、C++代碼等;
5)beforefieldinit剪芍,是用來(lái)標(biāo)記運(yùn)行庫(kù)(CLR)可以在靜態(tài)字段方法生成后的任意時(shí)刻塞淹,來(lái)加載構(gòu)造器(構(gòu)造函數(shù));

.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期間的評(píng)估堆棧(Evaluation Stack) ;
3)  IL_0000:標(biāo)記代碼行開(kāi)頭饱普;
4)ldarg.0:表示轉(zhuǎn)載第一個(gè)成員參數(shù)运挫,在實(shí)例方法中指的是當(dāng)前實(shí)例的引用;
5)call:call一般用于調(diào)用靜態(tài)方法套耕,因?yàn)殪o態(tài)方法是在編譯期就確定的谁帕。而這里的構(gòu)造函數(shù).otor()也是在編譯期就制定的。而另一指令callvirt則表示調(diào)用實(shí)例方法冯袍, 它是在運(yùn)行時(shí)確定的匈挖,因?yàn)槿缜笆觯?dāng)調(diào)用方法的繼承關(guān)系時(shí)康愤,就要比較基類(lèi)與派生類(lèi)的同名函數(shù)的實(shí)現(xiàn)方法(virtual和new)儡循,以確定調(diào)用的函數(shù)所屬的Method Table;
6)ret:表示執(zhí)行完畢翘瓮,返回贮折;
.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)把此類(lèi)作為基類(lèi),存在派生類(lèi)時(shí)资盅,此方法不被繼承调榄,同上構(gòu)造函數(shù);
2).entrypoint:指令表示CLR加載程序時(shí)呵扛,是首先從.entrypoint開(kāi)始的每庆,即從Main方法作為程序的入口函數(shù);
3)nop:為空該指令今穿,主要給外部設(shè)備或者指令間隙準(zhǔn)備時(shí)間缤灵;
4)ldstr:創(chuàng)建String對(duì)象變量"Hello World." ;
5)pop:取出棧頂?shù)闹道渡埂.?dāng)我們不需要把值存入變量時(shí)使用腮出;
  1. 第五步 修改

我們先寫(xiě)一個(gè)最簡(jiǎn)單的


圖片.png

這一段比較簡(jiǎn)單也比較容易理解,編譯之后IL為


圖片.png

我們利用工具雙擊打開(kāi)Main方法

圖片.png

我們修改代碼
文件-->轉(zhuǎn)儲(chǔ)芝薇。確定后選擇另存路徑,會(huì)生成二個(gè)文件:*.il 和 *.res

圖片.png
圖片.png

打開(kāi).il文件


圖片.png

找到我們剛才寫(xiě)的輸出hello word的代碼塊


圖片.png

修改輸出


圖片.png
  1. 第六步 編譯

我們先打開(kāi)VS 2017的開(kāi)發(fā)人員命令提示符

圖片.png

然后輸入
ilasm /exe /output=C:\Demo.exe /Resource=D:\5\1.res D:\5\1.il

圖片.png

我們看到完成信息之后
在C盤(pán)找到了我們編譯的EXE文件胚嘲,執(zhí)行

圖片.png
  1. 第七步 從IL理解裝箱拆箱
    我們先寫(xiě)一段最簡(jiǎn)單的裝箱拆箱代碼如下


    圖片.png

用我之前教你的方法查看程序的IL


圖片.png

打開(kāi)我們的main方法


圖片.png

我們看到IL里面表示裝箱拆箱兩個(gè)命令是用box和unbox,非常好理解吧

END

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市洛二,隨后出現(xiàn)的幾起案子馋劈,更是在濱河造成了極大的恐慌,老刑警劉巖晾嘶,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妓雾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡垒迂,警方通過(guò)查閱死者的電腦和手機(jī)械姻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)机断,“玉大人楷拳,你說(shuō)我怎么就攤上這事材部。” “怎么了唯竹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)苦丁。 經(jīng)常有香客問(wèn)我浸颓,道長(zhǎng),這世上最難降的妖魔是什么旺拉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任产上,我火速辦了婚禮,結(jié)果婚禮上蛾狗,老公的妹妹穿的比我還像新娘晋涣。我一直安慰自己,他們只是感情好沉桌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布谢鹊。 她就那樣靜靜地躺著,像睡著了一般留凭。 火紅的嫁衣襯著肌膚如雪佃扼。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天蔼夜,我揣著相機(jī)與錄音兼耀,去河邊找鬼。 笑死求冷,一個(gè)胖子當(dāng)著我的面吹牛瘤运,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匠题,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拯坟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了梧躺?” 一聲冷哼從身側(cè)響起似谁,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掠哥,沒(méi)想到半個(gè)月后巩踏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡续搀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年塞琼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禁舷。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彪杉,死狀恐怖毅往,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情派近,我是刑警寧澤攀唯,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站渴丸,受9級(jí)特大地震影響侯嘀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谱轨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一戒幔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧土童,春花似錦诗茎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至雀瓢,卻和暖如春枢析,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刃麸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工醒叁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泊业。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓把沼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親吁伺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饮睬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡(jiǎn)單分配策略的問(wèn)題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 7,808評(píng)論 0 27
  • 上次我們翻譯了由Unity開(kāi)發(fā)人員JOSH PETERSON所寫(xiě)的篮奄、IL2CPP深入講解系列的第一期捆愁,現(xiàn)在第二期的...
    IndieACE閱讀 9,511評(píng)論 0 11
  • 背景: 一同事提到某客戶(hù)要求修改產(chǎn)品程序中的一段文字,正常情況下這是很簡(jiǎn)單的事情窟却,不需要我這業(yè)余人員參與昼丑,但問(wèn)題在...
    山東大蔥哥閱讀 1,363評(píng)論 6 25
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)夸赫。 注意:講述HT...
    kismetajun閱讀 27,485評(píng)論 1 45
  • 第一章:編譯和安裝SCons第二章:簡(jiǎn)單編譯第三章:編譯相關(guān)的一些事情第四章:編譯和鏈接庫(kù)文件第五章:節(jié)點(diǎn)對(duì)象第六...
    仙靈兒閱讀 11,799評(píng)論 0 3