ดังที่ Oli ชี้ให้เห็นแล้วในคำตอบของเขาคุณไม่สามารถรับซอร์สโค้ดที่เป็นต้นฉบับของการปฏิบัติการได้
ระหว่างการคอมไพล์ซอร์สโค้ด (การคอมไพล์มีจุดประสงค์เหมือนกับการยอมรับทั่วไปที่กว้างขึ้นดังนั้นในขณะที่กระบวนการทั้งหมดที่ "แปลง" ซอร์สโค้ดไปสู่การปฏิบัติการ) ข้อมูลจำนวนมากจะหายไป
ตัวประมวลผลล่วงหน้า C สำหรับตัวใดตัวหนึ่งจะทำสิ่งต่อไปนี้ (เหนือสิ่งอื่นใด):
- ตีความดำเนินการและลบคำสั่งของโปรเซสเซอร์ล่วงหน้า (
#
คำสั่ง)
- ลบความคิดเห็น
- ลบช่องว่างที่ไม่จำเป็นออก
ในทางกลับกันสิ่งที่ไม่ได้หายไปในระหว่างการรวบรวมซอร์สโค้ดนั้นสามารถนำกลับมาใช้ใหม่ได้ในทางเทคนิคเป็นซอร์สโค้ดที่เทียบเท่ากับการใช้งาน
นี้เป็นเพราะ:
- คำแนะนำแบบไบนารีมีความสัมพันธ์แบบ 1: 1 พร้อมคำแนะนำการประกอบ การประกอบของซอร์สโค้ดแอสเซมบลีเป็นเพียงการแปลงของคำสั่งแอสเซมบลีเป็นคำสั่งแบบไบนารีที่ยึดตามตารางของ corrispondencies เท่านั้น คำสั่งไบนารีเดียวสามารถระบุได้เสมอและเปลี่ยนกลับเป็นคำสั่งชุดประกอบเดี่ยวได้ ;
- แอสเซมบลีคำแนะนำไม่มี 1: 1 corrispondency ด้วยคำแนะนำ C การคอมไพล์ของซอร์สโค้ด C มักไม่ใช่แค่การแปลงคำสั่ง C เป็นคำสั่งแอสเซมบลีตามตารางความสัมพันธ์ในความเป็นจริงมันมักจะเป็นตรงกันข้าม โดยปกติคำสั่ง C จะถูกแปลงเป็นคำสั่งชุดประกอบหลายชุด (มักแตกต่างกันไปตามคอมไพเลอร์) แต่รูปแบบของคำแนะนำการชุมนุมหลายมักจะระบุตัวและแก้ไขกลับคืนเพื่อการเรียนการสอน C เดียว ;
มีเครื่องมือที่เรียกว่า decompilers ซึ่งมีจุดประสงค์เพื่อพยายามที่จะย้อนกลับการปฏิบัติการให้เป็นซอร์สโค้ดที่เทียบเท่ากับการใช้งานได้ อย่างไรก็ตามผลลัพธ์มักจะอยู่ห่างจากซอร์สโค้ดดั้งเดิมมาก (และมักจะไม่สามารถใช้งานได้)
พิจารณาโปรแกรมนี้:
#include <stdio.h>
#define MESSAGE "Literal strings will be recovered" // This preprocessor directive won't be recovered
/*
This comment and the comment above won't be recovered
*/
int main(int argc, char* argv[]) {
printf(MESSAGE);
return 0;
}
ด้วยการคอมไพล์มันลงในไฟล์ที่เรียกใช้งานได้และทำการคอมไพล์มันลงในซอร์สโค้ดอีกครั้งนี่คือสิ่งที่คุณมักจะได้รับกลับมามากขึ้นหรือน้อยลง (ในกรณีนี้ที่ฉันใช้gcc
/ บูมเมอแรง ):
// address: 0x80483fb
int main(int argc, char **argv, char **envp) {
printf("Literal strings will be recovered");
return 0;
}
ตามที่คาดการณ์ไว้:
- คำสั่งของตัวประมวลผลล่วงหน้าหายไป
- ความคิดเห็นขาดหายไป (นอกเหนือจาก
// address: 0x80483fb
ซึ่งเพิ่มโดยตัวถอดรหัส)
- ช่องว่างที่ไม่จำเป็นขาดหายไป (นอกเหนือจาก newlines และ tabulations ซึ่งเพิ่มโดยตัวถอดรหัส)
นี่ก็เป็นผลลัพธ์ที่ดีเช่นกัน ไม่ยากที่จะรับคำแนะนำในการประกอบแบบอินไลน์เข้าไปในรหัส:
asm("assembly_instruction");
__asm__("assembly_instruction");
บรรทัดล่างคือ (ตามที่ระบุไว้แล้วในคำตอบอื่น ๆ ): คุณไม่สามารถรับซอร์สที่เป็นต้นฉบับของไฟล์ปฏิบัติการได้ *
* อย่างไรก็ตามขึ้นอยู่กับความสามารถในการใช้งานและโชคของคุณคุณอาจได้รับบางอย่างโดยใช้ตัวถอดรหัส
strings
โปรแกรมตัวกรองนั้นมีประโยชน์อย่างมากในการระบุว่าโปรแกรมไบนารีตัวใดเป็นหรือทำเพราะมันจะพิมพ์สตริงข้อความแบบฝังทั้งหมดยาวกว่าความยาวที่ระบุ ไฟล์ไบนารีและการดูข้อความในโปรแกรมบางครั้งบอกคุณมากเกี่ยวกับมันคืออะไรและทำอะไร