รักษารหัสของคุณให้ปลอดภัยจาก ### ย้อนกลับ ### วิศวกรอย่างบอส: 5 ขั้นตอน

รักษารหัสของคุณให้ปลอดภัยจาก ### ย้อนกลับ ### วิศวกรอย่างบอส: 5 ขั้นตอน

สารบัญ:

Anonim

ในบทช่วยสอนนี้เราจะแสดงเทคนิคพื้นฐานบางอย่างที่ใช้ในการป้องกันโค้ดของคุณจากการออกแบบวิศวกรรมย้อนกลับ

หมายเหตุ: การสอนนี้ไม่ได้ให้การคุ้มครองเต็มรูปแบบกับวิศวกรรมย้อนกลับ แต่ช่วยให้ผู้เริ่มต้นบางอย่าง

Motivatives:

1- คุณใช้อัลกอริทึมและกลัวว่ามีคนขโมยรหัสของคุณหรือไม่

2- คุณต้องการที่จะทำให้มันยากสำหรับผู้ที่ต้องการประนีประนอมกรอบหรือเครื่องมือของคุณ?

3- คุณมีผลิตภัณฑ์เชิงพาณิชย์ที่ใช้ arduino หรือ AVR และต้องการเก็บรหัสต้นฉบับไว้เป็นความลับหรือไม่?

4- คุณเป็นนักเขียนมัลแวร์มือใหม่หรือเปล่า? (ฉันหวังว่าคุณจะไม่ได้)

5- บางทีคุณไม่ได้อยู่เหนือสิ่งใด แต่เพียงคุณต้องการทำให้เพื่อนของคุณลำบากด้วยเทคนิคใหม่ที่คุณจะได้เรียนรู้

บทช่วยสอนนี้มีไว้สำหรับผู้ใช้ linux ฉันจะสร้างอีกหนึ่งคำแนะนำสำหรับผู้ใช้ windows;) และลิงก์จะอยู่ที่นี่

ฉันต้องชี้ให้เห็นว่าฉันจะใช้ตัวอย่าง Hello World อย่างง่ายเพื่ออธิบายเทคนิคเหล่านี้ แต่มันสามารถใช้ในตัวอย่างที่ซับซ้อนมากขึ้น

วัสดุ:

ขั้นตอนที่ 1: ข้อกำหนด

คุณจะต้องการ:

เครื่อง linux 1-86 x สามารถใช้เทคนิคเดียวกันสำหรับสถาปัตยกรรมใด ๆ (x64, arm, …..) โดยมีการติดตั้ง gcc

2- ภาษาที่รวบรวมบางประเภทเช่น C, C ++ หรือภาษาอื่น ๆ ที่รวบรวมเป็นภาษาเครื่องโดยตรง (Java จะไม่ทำงาน C # จะไม่ทำงาน)

3- ความรู้พื้นฐานของภาษาแอสเซมบลี (มันไม่ได้เป็นสิ่งจำเป็น แต่จะช่วยได้มาก)

ขั้นตอนที่ 2: แนวคิดพื้นฐาน

เราจะหารือเกี่ยวกับเทคนิคที่เราจะใช้ในการเลอะสิ่งต่าง ๆ:

1 ซ่อนข้อความทั้งหมด

2- ใส่ไบต์ขยะบางส่วนที่อยู่ตรงกลางของรหัส

3- ลบสัญลักษณ์ทั้งหมด

ขั้นตอนที่ 3: การเข้ารหัสข้อความ

การเก็บรักษาข้อความในรหัสตามที่มันทำให้มันง่ายสำหรับวิศวกรย้อนกลับไปหาที่จะเริ่มต้น และพวกเขาสามารถจัดการกับข้อความนี้ได้อย่างง่ายดายหรือพยายามที่จะทำโค้ดกลับใกล้กับสตริงเหล่านี้

ภาพแรกคือมุมมองฐานสิบหกสำหรับรหัสนี้

#include

int หลัก ()

{

printf ("สวัสดีโลก n");

}

ผู้ใช้ที่เป็นอันตรายและขุดเข้าไปในปฏิบัติการของคุณโดยใช้โปรแกรมแก้ไข hex ใด ๆ และเปลี่ยนข้อความสวัสดีโลกเป็นสิ่งอื่น

ดังนั้นเราจำเป็นต้องเข้ารหัสข้อความโดยใช้ฟังก์ชั่นพื้นฐานบางอย่าง

ฉันเขียนโค้ดง่าย ๆ เพื่อพยายามซ่อนโลกสวัสดี

#include

#define dec (x) x + 5

int หลัก ()

{printf ("% c% c% c% c% c% c% c% c% c% c% c% c% c", ธันวาคม (99), ธันวาคม (96), ธันวาคม (103), ธันวาคม (103), ธันวาคม (106) ธันวาคม (27) ธันวาคม (114) ธันวาคม (106) ธันวาคม (109) ธันวาคม (103) ธันวาคม (95) ธันวาคม (5));

}

รหัสนี้ดูน่ารังเกียจ แต่มันช่วยได้มากทุกอย่างที่ต้องทำคือนำตัวเลขแต่ละตัวและเพิ่ม 5 เข้าไปแล้วพิมพ์ออกมาเป็นตัวละคร

มันทำให้สตริงที่ซ่อนอยู่ลึกลงไปในไฟล์ไบนารีและมันก็เป็นเป้าหมายได้สำเร็จ

สตริงทั้งหมดจะถูกซ่อนไว้อย่างน้อยในมุมมอง hex: D

คุณสามารถตรวจสอบแต่ละโปรแกรมด้วยตนเองโดย:

1- ใส่แต่ละรหัสในไฟล์ชื่อ hello1.c และ hello2.c

2- จากประเภท termianal ของคุณ:

ทำ hello1

ทำ hello2

3- เพื่อเรียกใช้รหัสเหล่านี้ (ตรวจสอบการทำงาน) พิมพ์ "./hello1" แล้ว "./hello2"

4- ขั้นตอนสุดท้ายคือการดูดัมพ์ hex ของไฟล์เรียกทำงานเหล่านี้โดย "xxd hello1" และ "xxd hello2"

ขั้นตอนที่ 4: เพิ่มไบต์ขยะบางส่วน

ขั้นตอนต่อไปของเราคือการเพิ่มเรื่องไร้สาระลงในไฟล์ชุดประกอบของโลกสวัสดีของเราเพื่อให้เราสามารถซ่อนทุกแง่มุมของรหัสของเรา

ก่อนอื่นเราต้องสร้างไฟล์. s ของรหัสของเรา "gcc hello.c -S -masm = intel"

หลังจากนั้นเปิดไฟล์ hello.s และค้นหา main (สำหรับขั้นตอนนี้คุณต้องอ่านแอสเซมบลีและเข้าใจโฟลว์ของโปรแกรมเพื่อให้แน่ใจว่าคุณจะไม่ผิดรหัส)

ในบรรทัดใด ๆ ภายใน main (ดังที่ฉันบอกให้แน่ใจว่าคุณไม่ได้เปลี่ยนการไหลของโปรแกรม) พิมพ์ "ชื่อ jmp"

คุณสามารถเขียนสิ่งที่คุณต้องการในชื่อตามกฎตัวระบุแล้วในบรรทัดถัดไปเขียน "ชื่อ:"

โดยที่ name คือชื่อเดียวกับที่คุณใช้ก่อนหน้านี้หลังจากนั้นระหว่าง "jmp name" และ "name:" คุณสามารถเขียน junk bytes บางอัน (ควรเริ่มต้นด้วย ".byte 0x" มากกว่า 1 hex hex number)

สิ่งนี้จะเปลี่ยนคำแนะนำบางอย่างที่ใช้ แต่จะดำเนินการอย่างถูกต้อง: D

ตอนนี้เพื่อสร้างประเภทรหัสการประกอบ (gcc hello.s -o hello)

และตรวจสอบให้แน่ใจว่าทุกอย่างโอเค

ขั้นตอนที่ 5: ลบสัญลักษณ์ทั้งหมด

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

ลองเรียกใช้แถบสวัสดี

หลังจากขั้นตอนนี้ชื่อทั้งหมดในชื่อ "main" และ "home" และ "name" จะถูกลบออกดังนั้นจึงเป็นการยากที่จะติดตามรหัสที่คุณเขียน

นั่นคือคนทั้งหมด

โปรดบริจาคเราด้วยที่อยู่ bitcoins เพื่อสนับสนุนเราในการให้คำแนะนำที่มีคุณภาพสูง

17Ta5BnfJdCtXXmv9rJu3SSfMEPF2g7kpF