สารบัญ:
- วัสดุ:
- ขั้นตอนที่ 1: ข้อกำหนด
- ขั้นตอนที่ 2: แนวคิดพื้นฐาน
- ขั้นตอนที่ 3: การเข้ารหัสข้อความ
- ขั้นตอนที่ 4: เพิ่มไบต์ขยะบางส่วน
- ขั้นตอนที่ 5: ลบสัญลักษณ์ทั้งหมด
ในบทช่วยสอนนี้เราจะแสดงเทคนิคพื้นฐานบางอย่างที่ใช้ในการป้องกันโค้ดของคุณจากการออกแบบวิศวกรรมย้อนกลับ
หมายเหตุ: การสอนนี้ไม่ได้ให้การคุ้มครองเต็มรูปแบบกับวิศวกรรมย้อนกลับ แต่ช่วยให้ผู้เริ่มต้นบางอย่าง
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