ฉันจะดู MSIL / CIL ที่สร้างโดยคอมไพเลอร์ C # ได้อย่างไร ทำไมจึงเรียกว่าการชุมนุม?


130

ฉันยังใหม่กับการเขียนโปรแกรม. NET C # ฉันกำลังติดตามหนังสือสองสามเล่ม ว่ากันว่าแทนที่จะรวบรวมโดยตรงกับรหัสไบนารี (Native code) รหัสระดับสูงจะถูกแปลงเป็นภาษากลาง (เรียกว่า MSIL หรือที่เรียกว่า CIL) แต่เมื่อฉันรวบรวมฉันได้รับไฟล์ exe / Dll

  1. MSIL / CIL นี้มีอยู่ในไฟล์ exe / dll หรือไม่
  2. ฉันต้องการเห็นรหัสภาษากลางนั้น เพียงเพื่อให้รู้สึกถึงการมีอยู่ของมัน วิธีดู?
  3. พวกเขากำลังเรียกไฟล์ exe / dll นี้ว่าไฟล์assembly. พวกเขาใช้ "คำแฟนซี" เพียงเพื่อแยกความแตกต่างจากไฟล์ exe / dll ที่มีรหัสไบนารี (โค้ดเนทีฟ) หรือไม่?

คำตอบ:


95
  1. ใช่แล้วใน.textส่วนของไฟล์ PE (portable executable = * .exe หรือ * .dll) ข้อมูลเพิ่มเติมสามารถพบได้ที่นี่
  2. ทางเลือกที่ดีที่สุดคือใช้ILSpy (ตัวสะท้อนแสงไม่ฟรีอีกต่อไป) เป็นตัวถอดแยกชิ้นส่วนฟรีที่สามารถแยกชิ้นส่วนของคุณออกเป็น MSIL แต่ยังรวมถึง C #, VB (ในบางส่วน) .NET Framework SDK มี ILDasm ซึ่งเป็น MSIL dissasembler อย่างเป็นทางการ
  3. โดยทั่วไปใช่ แอสเซมบลีคือไฟล์ที่มีรหัส MSIL และข้อมูลเมตาที่เกี่ยวข้อง สิ่งนี้ไม่ได้ จำกัด เฉพาะไฟล์ PE ต่อ se แต่การใช้งาน CLR ปัจจุบันทั้งหมดใช้ไฟล์เหล่านี้

ถ้าฉันจะแนะนำหนังสือดีๆเกี่ยวกับเรื่องนั้นก็คือ Expert .NET 2.0 IL Assembler โดย Serge Lidin เขาเป็นคนออกแบบ MSIL


รอ! ไม่ได้อยู่ใน.textsextion? ถ้าไม่.textประกอบด้วยอะไรบ้าง? และอะไรขึ้นกับผมคิดว่าส่วนที่มีชื่อขึ้นต้นด้วย# .ไม่น่าจะเป็นเช่นนั้น.strings

ฉันสงสัยทำไมไม่แนะนำให้ใช้ILDasm รวมอยู่ใน Visual Studio (บางเวอร์ชัน) หรือไม่
สินจัย

2
ทั้งสองมีสถานที่ของพวกเขา แต่สำหรับผู้ใช้ส่วนใหญ่ (> 99.99%) ILSpy เป็นตัวเลือกที่เหมาะสม ความสามารถในการถอดรหัสรหัส IL กลับไปเป็น C # นั้นมีค่ามากสำหรับการนำทางอย่างรวดเร็วและการประกอบวิศวกรรมย้อนกลับ หากคุณกำลังทำอะไรก็ตามที่ปล่อย IL ดิบออกมา (เช่นคุณกำลังเขียนคอมไพเลอร์หรือเขียนแอสเซมบลี IL ใหม่เช่นด้วย Mono.Cecil) ILDasm จะมีประโยชน์เพราะสามารถแสดงโครงสร้างดิบของ IL ตารางโทเค็นและอื่น ๆ อีกครั้ง ผู้เชี่ยวชาญที่ไม่ใช่ IL ส่วนใหญ่จะสับสนดังนั้น ILSpy อาจเป็นทั้งหมดที่คุณต้องการและจำเป็น
Johannes Rudolph

3
ว้าวตอบกลับอย่างรวดเร็ว 7 ปีต่อมา! ฉันไม่ได้ยุ่งกับ IL มากนักหรือเปรียบเทียบตัวเลือกทั้งหมด (ซึ่งเป็นสาเหตุที่ฉันถามตั้งแต่แรก) แต่ LINQPad ไม่มีคุณสมบัติการแยกส่วนนี้หรือไม่?
สินจัย

ฉันติดตั้งใน VS 2017 ไม่มีอะไรเกิดขึ้นเมื่อฉันคลิกดูรหัสใน ILSPY
Anirudha Gupta

46

อีกวิธีหนึ่งที่ชื่นชอบการดู IL สำหรับข้อมูลโค้ดของ C # คือการใช้ฟรีเครื่องมือ LinqPad หลังจากป้อนรหัสบางส่วนและเลือก "คำสั่ง C #" ที่ด้านบนสุด (หรือ "โปรแกรม C #" แล้วแต่ความเหมาะสม) ให้คลิกปุ่ม "IL" ใต้พื้นที่ป้อนรหัสและคุณจะเห็น IL ที่สร้างขึ้น

ใช้ LinqPad สำหรับเรื่องนี้คือมากสะดวกสบายกว่าโหลดขึ้น Visual Studio หรือวิ่งคอมไพเลอร์จากบรรทัดคำสั่งแล้วโหลดขึ้น ILDASM และการเปิดไฟล์ .il ด้วยโปรแกรมแก้ไขข้อความ


เครื่องมือที่ดีอีกอย่างหนึ่งคือส่วนเสริม Snippy สำหรับ Reflector: jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx
Thomas Levesque

ทำได้ดีนี่! ฉันโหวตแล้ว แต่จะซับซ้อนกว่าเล็กน้อยหากคุณต้องรวมคลาสที่กำหนดเองใด ๆ ยังฉันชอบอันนี้มาก!
Andrew Steitz

28

หากคุณต้องการออนไลน์. NET Fiddleนั้นยอดเยี่ยมมาก เพียงแค่วางรหัสของคุณแล้วคลิกView ILตัวเลือกที่ด้านขวาบน


2
ดูเหมือนจะแตกแล้ว
Luke Maurer

@nawfal ยากจนที่นี่ด้วย ผมเคยใช้มัน
aloisdg ย้ายไปที่ codidact.com

มีอีกวิธีที่ออนไลน์ก็คือ: sharplab.io ตรวจสอบคำตอบนี้สำหรับข้อมูลเพิ่มเติม: stackoverflow.com/a/51457583/1248177
aloisdg ย้ายไปที่ codidact.com

ไม่แน่ใจว่าปัญหาคืออะไรใช้ได้ดีกับฉัน .. @ aloisdgmovingtocodidact.com ที่บอกว่า sharplab.io ดูเนียนขอบคุณที่ชี้ให้เห็น :)
nawfal

16

อีกทางเลือกหนึ่ง: ใช้ReSharper

ป้อนคำอธิบายภาพที่นี่ มุมมองที่ซิงค์ Source / IL: เส้นพื้นหลังสีน้ำเงินด้านซ้ายสอดคล้องกับ IL Block ด้านขวา

ใน Visual Studio:

  • เลือก ReSharper | Windows | โปรแกรมดู IL
  • หรือเมนูบริบท: นำทาง | รหัส IL

รองรับมุมมองที่ซิงค์ของซอร์สโค้ดและ IL - เมื่อคุณคลิกที่คำสั่งในแหล่งที่มาบล็อกที่เกี่ยวข้องใน IL จะถูกไฮไลต์ (และในทางกลับกัน) แสดงคำอธิบายสำหรับ IL จาก Microsoft Developer Network และชุดคำสั่ง "Common Intermediate Language (CIL)" จากข้อกำหนดมาตรฐาน ECMA

โปรดดูการดูภาษาระดับกลาง (IL)ในวิธีใช้ Resharper รูปภาพด้านบนมาจาก Resharper Help

ตัวเลือกฟรีคือใช้Jetbrains dotPeek

โปรดดู: "Exploring Intermediate Language (IL) with ReSharper and dotPeek" โดย Maarten Balliauw 19 มกราคม 2017 - Jetbrains Blog


ลงคะแนนคำตอบของคุณผิดพลาด แก้ไขเพื่อให้ฉัน
โหวตเพิ่ม

IL Viewer ใน ReSharper นั้นยอดเยี่ยมมาก หากคุณวางเมาส์ไว้เหนือไวยากรณ์ IL จะแสดงคำแนะนำเครื่องมือที่อธิบายได้ค่อนข้างชัดเจนซึ่งอธิบายว่าคำหลักแต่ละคำกำลังทำอะไรอยู่ เหมาะสำหรับผู้ที่เพิ่งเริ่มใช้ IL!
InvalidBrainException

12
  1. ใช่มันอยู่ในการประกอบ
  2. คุณต้อง.NET สะท้อนหรือILDASM
  3. รายละเอียดเพิ่มเติมเกี่ยวกับการประกอบการตรวจสอบที่นี่

PS ขณะที่คุณกำลังต่อไปนี้หนังสือบางเล่มผมขอแนะนำให้คุณจะCLR ผ่าน C #


11

ฉันเชื่อว่าสิ่งเหล่านี้เรียกว่า "แอสเซมบลี" เนื่องจากแอสเซมบลีคือชุดของโมดูลที่ประกอบเข้าด้วยกันโดยรายการ

การประกอบหลายไฟล์
(ที่มา: microsoft.com )

ดูเนื้อหาการประกอบสำหรับรายละเอียด


9

Sharplab Sharplabเป็นเครื่องมือออนไลน์ที่เหมาะสำหรับการใช้งานทั่วไป พิมพ์รหัสของคุณทางด้านซ้าย IL จะปรากฏทางด้านขวา


เครื่องมือที่ดีที่สุดที่เคย +1
Emad

7

ในหลาย ๆ ประการแอสเซมบลี. NET นั้นคล้ายกับแพ็คเกจ bytecode ของ Java

  1. ใช่. นอกจากนี้ยังมีรายการและข้อมูลอื่น ๆ แต่ CIL เป็นส่วนหนึ่งของ exe / dll
  2. ใช้ILDasmหรือตัวสะท้อนแสง - คนส่วนใหญ่มักจะพูดว่า Reflector เนื่องจากมีพลังมากกว่า ทั้งสองอย่างจะแสดงให้คุณเห็นว่า CIL ถูกผลิตขึ้นมาอย่างไร Wikipedia มีรายการคำสั่ง CILทั้งหมดเพื่อความรู้สึกที่ดีขึ้น (เป็นการประกอบเช่น)
  3. ฉันเดาว่ามันหมายถึงการประกอบโค้ด วิธีที่ดีในการแยกความแตกต่างจากของพื้นเมือง

7

ฉันใช้เวลาสองสามชั่วโมงในการค้นหาเครื่องมือที่ดีที่สุดที่สามารถให้ฉันดูรหัส IL ได้โดยตรงภายใน Visual Studio

ทางออกเดียวที่ฉันพบคือ Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

ใช้ได้ดีทีเดียว!

มิฉะนั้นทางออกที่ดีที่สุดอันดับสอง แต่ไม่มีการรวมสตูดิโอภาพคือ JetBrains dotPeek ซึ่งค่อนข้างน่ากลัวที่จะพูดตามตรง


5

ฉันรู้ว่านี่เป็นคำถามเก่าและฉันต้องการเครื่องมือใด ๆ ข้างต้น อย่างไรก็ตามในการบีบนิ้วมีโปรแกรมดู MSIL อยู่ในกล่องพร้อม Visual Studio ตั้งแต่เวอร์ชัน 2005 เป็นอย่างน้อย

เครื่องมือนี้มีชื่อildasm.exeและอยู่ในโฟลเดอร์ต่อไปนี้หลังจากการติดตั้ง Visual Studio เริ่มต้น:

Visual Studio 2005 "C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe"

Visual Studio 2008 " C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe"

Visual Studio 2010 " C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\ildasm.exe"

สำหรับข้อมูลเพิ่มเติมโปรดดู: " How to: View Assembly Contents " ใน MSDN Library


2

จากประสบการณ์ของฉันแหล่งความรู้ที่ดีที่สุดที่เกี่ยวข้องกับ IL คือ Andrew Troelsen“ Pro C # และ. NET Platform” ตั้งแต่ฉบับพิมพ์ครั้งที่ 3 เขามีบทที่โดดเด่นมาก (ประมาณ 50 หน้า) เกี่ยวกับวิธีทำความเข้าใจ IL และแม้แต่เขียนโค้ดของคุณเองและใช้ ILAsm ฉันใช้ข้อมูลดังกล่าวเพื่อตรวจสอบว่ามีการสืบทอดหลายรายการในโลก. NET หรือไม่ นอกจากนี้คุณสามารถลองใช้คุณสมบัติที่น่าสนใจบางอย่างใน IL (เช่นการกรองข้อยกเว้นซึ่งมีอยู่ใน VB เท่านั้น แต่ไม่มีใน C #)

ฉันขอแนะนำให้อ่านบทนั้น

ในที่สุด. NET Reflector เป็นมาตรฐานขององค์กรสำหรับการตรวจสอบรหัสของชุดประกอบ IL และหนังสือของ Richter เป็นสิ่งที่ "ต้องอ่าน" อย่างแน่นอน แต่จากหนังสือเล่มอื่น ๆ เช่นที่กล่าวมาข้างต้นคุณสามารถเปิดเผยสิ่งที่มีประโยชน์จริงๆ :)

ใช่แต่ละชุดประกอบในโลก. NET มีรหัส IL (พร้อมกับรายการ) ซึ่งสามารถดูได้จากตัวสะท้อนแสงหรือ ILDasm ยิ่งไปกว่านั้นตัวสะท้อนแสงสามารถแสดงรหัสที่ปรับให้เหมาะสมกับ C # และ VB ซึ่งหมายความว่าบุคคลใด ๆ สามารถดูซอร์สโค้ดของแอสเซมบลีได้และนั่นคือเหตุผลที่ใช้ในผลิตภัณฑ์เชิงพาณิชย์ obfuscators


2

ฉันต้องการดูภาษากลางลองดาวน์โหลดJustDecompile จาก Telerik (ซึ่งปัจจุบันให้บริการฟรีต้องสมัครใช้งาน)

ลากใน DLL ของคุณแล้วเลือกILจากช่องแบบเลื่อนลงที่ด้านบน!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.