ด้วยภาษาที่ใช้เครื่องเสมือนของ bytecode เช่น Java, VB.NET, C #, ActionScript 3.0 เป็นต้นบางครั้งคุณได้ยินเกี่ยวกับความง่ายในการดาวน์โหลดตัวแยกข้อมูลออกจากอินเทอร์เน็ตเรียกใช้ bytecode ในช่วงเวลาที่ดีและ บ่อยครั้งเกิดขึ้นกับสิ่งที่ไม่ไกลจากซอร์สโค้ดต้นฉบับในไม่กี่วินาที สมมุติว่าภาษาแบบนี้มีความเสี่ยงเป็นพิเศษ
ฉันเพิ่งเริ่มสงสัยว่าทำไมคุณไม่ได้ยินเพิ่มเติมเกี่ยวกับเรื่องนี้เกี่ยวกับรหัสไบนารี่พื้นเมืองเมื่ออย่างน้อยคุณก็รู้ว่าภาษานั้นถูกเขียนเป็นภาษาดั้งเดิม (และภาษาใดที่จะพยายามถอดรหัส) เป็นเวลานานฉันคิดว่ามันเป็นเพียงเพราะภาษาเครื่องพื้นเมืองบ้าคลั่งมากและซับซ้อนกว่า bytecode ทั่วไป
แต่โค้ดไบต์มีลักษณะอย่างไร ดูเหมือนว่านี้:
1000: 2A 40 F0 14
1001: 2A 50 F1 27
1002: 4F 00 F0 F1
1003: C9 00 00 F2
และรหัสเครื่องดั้งเดิมมีลักษณะอย่างไร (เป็นเลขฐานสิบหก) แน่นอนมันมีลักษณะเช่นนี้:
1000: 2A 40 F0 14
1001: 2A 50 F1 27
1002: 4F 00 F0 F1
1003: C9 00 00 F2
และคำแนะนำนั้นมาจากกรอบความคิดที่ค่อนข้างคล้ายกัน:
1000: mov EAX, 20
1001: mov EBX, loc1
1002: mul EAX, EBX
1003: push ECX
ดังนั้นเมื่อภาษาพยายามถอดรหัสไบนารีพื้นเมืองบางตัวให้พูด C ++ มันยากอะไรกับมันบ้าง ความคิดเพียงสองอย่างที่นึกขึ้นมาในทันทีคือ 1) จริงๆแล้วมันมีความซับซ้อนมากกว่า bytecode หรือ 2) บางอย่างเกี่ยวกับความจริงที่ว่าระบบปฏิบัติการมักจะแบ่งหน้าโปรแกรมและกระจายส่วนที่ทำให้เกิดปัญหามากเกินไป หากหนึ่งในความเป็นไปได้เหล่านั้นถูกต้องโปรดอธิบาย แต่อย่างใดทำไมคุณไม่เคยได้ยินเรื่องนี้มาก่อน
บันทึก
ฉันกำลังจะยอมรับคำตอบอย่างใดอย่างหนึ่ง แต่ฉันต้องการพูดถึงบางสิ่งบางอย่างก่อน เกือบทุกคนอ้างถึงความจริงที่ว่าซอร์สโค้ดต้นฉบับที่ต่างกันอาจแมปกับรหัสเครื่องเดียวกัน ชื่อตัวแปรโลคอลหายไปคุณไม่ทราบว่าใช้ลูปประเภทใดเป็นต้น
อย่างไรก็ตามตัวอย่างเช่นสองที่ถูกกล่าวถึงเป็นเพียงเล็กน้อยในสายตาของฉัน คำตอบบางส่วนมีแนวโน้มที่จะระบุว่าความแตกต่างระหว่างรหัสเครื่องและแหล่งที่มาดั้งเดิมนั้นมีความสำคัญมากกว่าสิ่งที่น่าสนใจเล็กน้อย
แต่ตัวอย่างเช่นเมื่อพูดถึงสิ่งต่าง ๆ เช่นชื่อตัวแปรโลคอลและประเภทลูป bytecode จะสูญเสียข้อมูลนี้เช่นกัน (อย่างน้อยสำหรับ ActionScript 3.0) ผมเคยดึงสิ่งที่กลับผ่าน Decompiler ก่อนและฉันไม่ได้สนใจจริงๆไม่ว่าจะเป็นตัวแปรที่ถูกเรียกหรือstrMyLocalString:String
loc1
ฉันยังสามารถดูในขอบเขตขนาดเล็กท้องถิ่นและดูว่ามันถูกใช้โดยไม่มีปัญหามาก และfor
ลูปก็เหมือนกันมากกับwhile
วนรอบถ้าคุณคิดเกี่ยวกับมัน นอกจากนี้แม้ว่าฉันจะเรียกใช้ซอร์สผ่าน irrFuscator (ซึ่งต่างจาก secureSWF ไม่ได้ทำอะไรมากไปกว่าแค่การสุ่มตัวแปรสมาชิกและชื่อฟังก์ชั่น) มันยังดูเหมือนว่าคุณสามารถแยกตัวแปรและฟังก์ชั่นบางอย่างในคลาสที่เล็กลง ดูวิธีการใช้งานกำหนดชื่อของคุณเองให้พวกเขาและทำงานจากที่นั่น
เพื่อให้เรื่องนี้เป็นเรื่องใหญ่รหัสเครื่องจะต้องสูญเสียข้อมูลมากไปกว่านั้นและคำตอบบางส่วนอาจเป็นไปได้