มันเป็นสิ่งสำคัญที่ทำให้งงงวยรหัสแอปพลิเคชัน C ++?


11

ในโลก Java ดูเหมือนว่าบางครั้งจะมีปัญหา แต่สิ่งที่เกี่ยวกับ C ++? มีวิธีแก้ไขปัญหาต่าง ๆ หรือไม่?

ฉันคิดเกี่ยวกับความจริงที่ว่าบางคนสามารถแทนที่ไลบรารี C ++ ของระบบปฏิบัติการที่เฉพาะเจาะจงด้วยเวอร์ชันเดียวกันของไลบรารีเดียวกัน แต่เต็มไปด้วยสัญลักษณ์การดีบักเพื่อทำความเข้าใจว่าโค้ดของฉันทำอะไร การใช้ไลบรารีมาตรฐานหรือห้องสมุดยอดนิยมเป็นสิ่งที่ดีหรือไม่?

สิ่งนี้สามารถเกิดขึ้นได้กับไลบรารี่ dll บางตัวใน Windows แทนที่ด้วย "debug version" ของไลบรารี่นั้น มันจะดีกว่าที่จะรวบรวมแบบคงที่? ในแอพพลิเคชั่นเชิงพาณิชย์ฉันเห็นว่าแกนหลักของแอพของพวกเขารวบรวมทุกอย่างในแบบสแตติกและส่วนใหญ่ dll (ไลบรารีไดนามิกทั่วไป) ใช้เพื่อเสนอเทคโนโลยีของบุคคลที่สามเช่นโซลูชั่นต่อต้านการละเมิดลิขสิทธิ์ (ฉันเห็นในเกมหลายเกม ), ไลบรารี GUI (เช่น Qt), ไลบรารี OS ฯลฯ

การรวบรวมแบบคงที่เทียบเท่ากับการทำให้งงงวยในโลก Java หรือไม่? ในแง่ที่ดีกว่าเป็นวิธีที่ดีที่สุดและประหยัดที่สุดในการปกป้องรหัสของคุณหรือไม่?


4
โปรดจำไว้ว่าสิ่งที่คุณทำใครบางคนที่มีเวลามากเกินไปจะสามารถ deobfuscate / decompile ได้
Zavior

13
คอมไพเลอร์จำนวนมากมาพร้อมกับ/Oสวิตช์ทำให้งงงวย บางคนมีหลายระดับของการทำให้งงงวยมากถึง/O3;)
MSalters

@MSalters ไม่, g ++ มี-O3;)
BЈовић

@ ผู้ช่วยให้รอดหรือเพียงแค่ทำวิศวกรรมย้อนกลับมันธรรมดาและเรียบง่าย ไม่จำเป็นต้องใช้ไบนารีเองเพียงแค่ทำการวิเคราะห์ซอฟต์แวร์อย่างละเอียด
John Weisz

คำตอบ:


27

อย่าเสียเวลาในการแพ้การรบ

ตามที่ระบุไว้ในหลาย ๆ คำตอบอื่น ๆ ที่คล้ายกันสำหรับ C ++ และภาษาอื่น ๆ นี้เป็นส่วนใหญ่ที่ไร้ประโยชน์

อ่านเพิ่มเติม

เลือกอ่านในหัวข้อ (ไม่ใช่ทั้งหมดเป็นเฉพาะ C ++ แต่ใช้หลักการทั่วไป):

คำตอบ StackExchange

เอกสาร

คำพูดที่มีชื่อเสียงเกี่ยวกับการทำให้งงงวย:

ในที่สุดก็มีคำถามของความเป็นส่วนตัวของรหัสว่า นี่คือสาเหตุที่หายไป ไม่มีการเปลี่ยนแปลงใดที่จะทำให้แฮ็กเกอร์ที่มุ่งมั่นไม่เข้าใจโปรแกรมของคุณ สิ่งนี้กลายเป็นจริงสำหรับทุกโปรแกรมในทุกภาษามันเป็นความจริงที่ชัดเจนมากขึ้นกับ JavaScript เพราะมันถูกส่งในรูปแบบต้นฉบับ ประโยชน์ความเป็นส่วนตัวที่ได้รับจากการทำให้งงงวยเป็นภาพลวงตา หากคุณไม่ต้องการให้คนอื่นเห็นโปรแกรมของคุณให้ถอดปลั๊กเซิร์ฟเวอร์ของคุณ - Douglas Crockford


ไม่เคย?

ฉันไม่ได้บอกว่าคุณไม่ควรทำให้งงงวยและไม่มีเหตุผลที่ดีสำหรับมัน แต่ฉันถามอย่างจริงจังถึงความจำเป็นในกรณีส่วนใหญ่และความคุ้มค่า

นอกจากนี้ยังมีสถานการณ์ที่ทำให้งงงวยเป็นข้อกำหนดโดยพฤตินัย ตัวอย่างเช่นหากคุณเขียนไวรัสการทำให้งงงวยอย่างเห็นได้ชัด (และไดนามิก) เป็นสิ่งที่ดีสำหรับการอยู่รอดของโปรแกรมของคุณเนื่องจากความสามารถในการทำซ้ำ อย่างไรก็ตามเรื่องนี้ถือเป็นกรณี "ทั่วไป" ...


ครั้งหนึ่งเราเคยใช้ดองเกิลฮาร์ดแวร์ที่มีข้อกำหนดสิทธิการใช้งานเพื่อทำให้การเรียกฟังก์ชันดองเกิลทั้งหมดหมดลงและพวกเขาก็จัดหาเครื่องมือให้ทำ ทำให้ฉันสงสัยเล็กน้อยเกี่ยวกับคุณภาพของ 'การป้องกัน' ของพวกเขาเสมอ!
Martin Beckett

@MartinBeckett: ตาดแปลกจริง ๆ
haylem

3

ไม่มันไม่คุ้มค่ากับความพยายามและฉันคิดว่ามันไม่จำเป็นเลย ฟังก์ชั่นที่คุณโทรอาจจะเดาได้จากฟังก์ชั่นที่คุณให้

เหตุผลที่ obfuscators มีอยู่สำหรับ Java เนื่องจากการแมประหว่างโค้ด Java byte และซอร์สโค้ด Java นั้นถูกกำหนดค่อนข้างดีและชื่อของฟังก์ชั่นและตัวแปรสมาชิกทั้งหมดจะถูกเก็บไว้ในรหัสไบต์ (ไม่ว่าจะเป็นสาธารณะส่วนตัวหรือได้รับการป้องกัน ) ดังนั้นล่ามโค้ด Java byte สามารถนำเสนอ Java ทั่วไปบางตัวซึ่งแสดงโครงสร้างของซอร์สดั้งเดิมค่อนข้างดีสำหรับซอร์สที่ไม่ได้ถูกทำให้ยุ่งเหยิง

C ++ รวบรวมโดยตรงกับภาษาเครื่อง มันสามารถถอดประกอบได้ แต่ภาษาแอสเซมบลีค่อนข้างน่าเบื่อที่จะจัดการ Decompilation นั้นมีเล่ห์เหลี่ยมมากเนื่องจากการเปลี่ยนแปลงทั้งหมดที่ optimizer ทำกับโค้ดระหว่างการรวบรวม


0

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

ความสับสนเล็กน้อย

การทำให้งงเล็กน้อยมีอยู่เพื่อป้องกันไม่ให้ผู้ใช้ที่ไม่เป็นทางการโผล่นิ้วเข้ามาและทำลายสิ่งต่างๆ มันไม่ได้ป้องกันแฮ็กเกอร์ที่ตั้งใจ แต่มันมีคุณค่าในการช่วยให้แน่ใจว่าสิ่งที่คุณได้รับการร้องขอให้สนับสนุนคือสิ่งที่คุณได้ส่งมอบจริง ระดับการป้องกันที่จำเป็นสำหรับสิ่งนี้ค่อนข้างต่ำ แพ็กเกจการนำส่งต้องไม่ดูอ่านง่ายและแก้ไขได้ (ไม่มีเครื่องมือผู้เชี่ยวชาญ) และนั่นก็ค่อนข้างดีพอ

การย่อขนาด Javascript เป็นตัวอย่างของสิ่งนี้แม้ว่าจะไม่ได้ทำการตลาดก็ตาม ไม่มีใครในใจที่ถูกต้องต้องการอ่านและแก้ไขไฟล์ JS ที่ย่อเล็กสุดแม้ว่าจะเป็นไปได้ในทางเทคนิคที่จะทำเช่นนั้นหากคุณตั้งใจแน่วแน่ / คงพอ

ในทำนองเดียวกันกับการส่งมอบแอปพลิเคชัน Java การบรรจุรหัสลงใน JAR ที่สามารถดำเนินการได้นั้นจะหยุดความโง่เขลาส่วนใหญ่แม้ว่าจะได้รับเครื่องหมาย“ Please Keep Off The Grass” ในสวนสาธารณะของเมือง

แม้ในขณะที่ส่งมอบรหัส C ++ การลอกสัญลักษณ์ที่ไม่จำเป็นออกจากไฟล์เรียกทำงานก็เพียงพอที่จะถือว่าเป็นความสับสนเล็กน้อยได้ กุญแจสำคัญคือมันอึดอัดใจที่จะอ่านผลลัพธ์ในฐานะผู้ใช้ แต่ไม่มีปัญหาในการเรียกใช้งานมันเป็นคอมพิวเตอร์

ความงงงวยที่สำคัญ

การทำให้งงงวยที่สำคัญคือการทำให้ผู้ใช้ที่ตั้งใจและมีความรู้ออกมา นอกจากนี้ยังเป็นเกมที่แพ้ทั้งหมด ถ้าคอมพิวเตอร์สามารถประมวลผลมันคนสามารถแยกมันออกมาและทำงานในสิ่งที่มันทำ สิ่งที่ใกล้เคียงที่สุดที่คุณจะได้รับคือการทำให้โปรแกรมถอดรหัสตัวเองอย่างต่อเนื่องเปลี่ยนสิ่งที่มันทำในครั้งเดียวให้กลายเป็นสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิงในเวลาอื่น การสร้างสิ่งนี้จะค่อนข้างยากและยังคงไม่แฮ็กเกอร์ที่ดีจริงๆ (แม้ว่าพวกเขาจะค่อนข้างข้ามกับคุณในตอนท้ายด้วยจำนวนของความพยายามที่จำเป็นในการถอดรหัสรหัสที่แก้ไขด้วยตนเองทั้งหมด)

จะดีกว่าที่จะคิดในแง่ของการแก้ปัญหาอื่น ๆ ตัวอย่างเช่นคุณสามารถเก็บ "crown jewels" ของรหัสบนเซิร์ฟเวอร์ที่คุณควบคุมและอนุญาตให้ใช้บริการโทรเท่านั้นทำให้ลูกค้าเป็นของแถมฟรีซึ่งเป็นส่วนหน้าของบิตที่มีค่า หรือคุณสามารถใช้เส้นทางสัญญา / กฎหมายเพิ่มเติมและมอบเฉพาะโปรแกรมปฏิบัติการให้กับองค์กรที่เห็นด้วยอย่างเป็นทางการที่จะไม่แหย่ในรหัสของคุณหรือชดเชยคุณหากพวกเขาทำเช่นนั้น (เพื่อให้เป็น NDA บางประเภท) เป้าหมายคือเพื่อสร้างแรงจูงใจที่แข็งแกร่งสำหรับแฮ็กเกอร์ที่จะไม่แฮ็กและสำหรับผู้ใช้ที่จะเก็บรหัสให้ห่างจากแฮ็กเกอร์ที่ไม่ผูกพันตามข้อตกลง

แต่คุณต้องไม่คิดว่ารหัสของคุณจะไม่มีวันแตกได้ ด้วย virtualisation สถานะโปรแกรมใด ๆ ของการดำเนินการสามารถตรวจสอบและติดตามได้และสิ่งใดก็ตามที่พยายามเอาชนะ (เช่นการติดตามนาฬิกาไปยังแหล่งเวลาภายนอก) จะทำให้เกิดปัญหากับผู้ใช้ที่ถูกกฎหมายมากกว่าแฮกเกอร์ (ดูประวัติความเป็นมาของ DRM ว่าผู้เผยแพร่ข้อมูลที่ตั้งใจแน่วแน่มากเพียงใดไม่สามารถรักษาความปลอดภัยของระบบได้เมื่อโค้ดอยู่ในมือของคู่แข่ง) มันดีกว่ามากที่จะมุ่งเน้นไปที่การทำให้ผู้ใช้ถูกกฎหมายมีความสุข การสูญเสียจากการแตกเป็นครั้งคราวจะไม่มีอะไรเทียบได้กับเงินพิเศษที่นำเข้ามาจากลูกค้าที่พอใจ

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