Mengautomatikkan Pemulihan Struktur Data
Bangunkan skrip untuk mengenal pasti dan membina semula struktur data kompleks dalam binari yang dikaburkan secara automatik.
Mengautomatikkan Pemulihan Struktur Data ialah pelajaran Asas Kejuruteraan Balikan & Analisis Binari percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Asas Kejuruteraan Balikan & Analisis Binari, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Asas Kejuruteraan Balikan & Analisis Binari merangkumi sejumlah 4 pelajaran.
Apakah Struktur Data?
Dalam pengaturcaraan, struktur data ialah cara untuk menyusun dan menyimpan data dengan cekap. Anggaplah ia seperti kabinet fail yang tersusun rapi untuk maklumat yang berkaitan.
Dalam kejuruteraan songsang, kita sering berurusan dengan atur cara yang telah dikompil, iaitu kod sumber asalnya sudah tiada. Matlamat kita adalah untuk "melihat" kabinet fail tersembunyi ini dalam data binari mentah.
Sebab Pemulihan Data
Memulihkan struktur data amat penting untuk memahami logik sesuatu atur cara. Jika anda mengetahui susunan objek dalam memori, anda boleh:
- Memahami hubungan antara bahagian data yang berbeza.
- Mengenal pasti pemboleh ubah atur cara yang penting.
- Menentukan lokasi kerentanan yang berpotensi dengan lebih mudah.
Proses ini menukarkan himpunan bait yang bercelaru menjadi maklumat yang bermakna!
Mencari Struktur Tersembunyi
Apabila atur cara dikompil, pengkompil sering membuang maklumat penyahpepijatan dan mengoptimumkan kod. Hal ini menyukarkan pengenalpastian struktur secara automatik kerana:
- Nama asal hilang.
- Medan mungkin disusun semula atau ditambah pelapik.
- Struktur yang kompleks mungkin tersebar di beberapa lokasi.
Ia seperti cuba membina semula teka-teki tanpa gambar atau kepingan tepi!
Jenis Mudah dalam Binari
Sebelum menangani struktur yang kompleks, mari kita ingat semula rupa jenis data asas dalam bait mentah. Struktur hanyalah himpunan jenis yang lebih mudah ini.
Contohnya, integer mungkin berukuran 4 bait, manakala aksara berukuran 1 bait. Susunan dan saiznya penting!
import struct
# Simulate a small piece of binary data
binary_data = b'\x01\x00\x00\x00' + b'\x41' + b'\x02\x00\x00\x00'
print("Raw bytes:", binary_data)
# Interpret bytes 0-3 as a 32-bit integer (little-endian)
# '<I' means little-endian unsigned int
int_val = struct.unpack('<I', binary_data[0:4])[0]
print(f"Integer (offset 0): {int_val}")
# Interpret byte 4 as a character
char_val = chr(binary_data[4])
print(f"Character (offset 4): {char_val}")
# Interpret bytes 5-8 as another 32-bit integer
int_val2 = struct.unpack('<I', binary_data[5:9])[0]
print(f"Integer (offset 5): {int_val2}")Apakah 'Struktur'?
Dalam bahasa seperti C, struct ialah jenis data takrifan pengguna yang mengumpulkan pemboleh ubah berkaitan ke dalam satu unit. Bayangkan struktur "User" yang menyimpan ID pengguna (integer), nama (rentetan) dan umur (integer).
Apabila dikompil, struktur ini memenuhi blok memori bersebelahan, dengan setiap medan berada pada ofset tertentu dari permulaan blok tersebut.
Mengesan Struktur Secara Manual
Apabila melakukan kejuruteraan songsang secara manual, anda boleh mencari petunjuk seperti:
- Corak Capaian Berulang: Kod yang sentiasa membaca/menulis pada
[reg + 0],[reg + 4],[reg + 8]. - Argumen Fungsi: Blok memori besar yang dihantar sebagai satu argumen kepada fungsi.
- Penuding: Medan yang menunjuk kepada struktur atau jenis data lain yang diketahui.
Corak ini menunjukkan kewujudan blok data yang berstruktur.
Mengautomatikkan Carian Corak
Mencari struktur secara manual memang memenatkan! Di sinilah penskripan sangat berguna. Kita boleh menulis skrip untuk mengimbas data binari secara automatik bagi mencari corak umum yang mungkin menunjukkan kewujudan struktur.
Contohnya, skrip boleh mencari dua integer yang diikuti oleh rentetan yang ditamatkan aksara nol, iaitu corak yang sangat biasa bagi objek mudah.
def find_pattern(data_bytes: bytes, pattern_bytes: bytes):
"""Searches for a byte pattern within a larger byte string."""
indices = []
for i in range(len(data_bytes) - len(pattern_bytes) + 1):
if data_bytes[i:i+len(pattern_bytes)] == pattern_bytes:
indices.append(i)
return indices
# Simulate a binary's data section
simulated_binary_data = (
b'\xDE\xAD\xBE\xEF' + # random bytes
b'\x01\x00\x00\x00' + # int 1 (little-endian)
b'\x0A\x00\x00\x00' + # int 10
b'NAME\x00' + # string "NAME"
b'\x00\x00\x00\x00' + # padding
b'\x02\x00\x00\x00' + # int 2
b'\x0B\x00\x00\x00' + # int 11
b'ITEM\x00' # string "ITEM"
)
# Define a pattern to search for: int(1), int(10), string("NAME")
pattern_to_find = (
b'\x01\x00\x00\x00' +
b'\x0A\x00\x00\x00' +
b'NAME\x00'
)
found_at_offsets = find_pattern(simulated_binary_data, pattern_to_find)
if found_at_offsets:
print(f"Pattern found at offsets: {found_at_offsets}")
else:
print("Pattern not found.")Rujukan Silang untuk Petunjuk Struktur
Dalam alat kejuruteraan songsang, rujukan silang (xref) menunjukkan lokasi alamat atau data tertentu digunakan dalam kod.
Jika banyak fungsi mengakses data secara konsisten bermula pada alamat tertentu, kemudian pada +0x4, +0x8, +0xC, xref ini menunjukkan dengan kuat bahawa struktur data sedang dimanipulasi pada lokasi memori tersebut.
Skrip boleh mengautomatikkan analisis xref ini!
Menskrip Takrif Struktur
Setelah anda mengenal pasti susun atur struktur data yang berpotensi (contohnya melalui corak atau xref), skrip anda boleh mentakrifkan struktur ini dalam alat kejuruteraan songsang itu sendiri.
Ini bermaksud memberitahu alat tersebut: "Pada alamat ini, terdapat struktur bernama 'MyObject' dengan integer 'ID' pada ofset 0, dan rentetan 'Name' pada ofset 4."
Hal ini menjadikan kod yang dinyahhimpun lebih mudah dibaca dengan menggantikan capaian memori mentah dengan nama medan yang bermakna!
import struct
# Reusing simulated_binary_data from previous example
simulated_binary_data = (
b'\xDE\xAD\xBE\xEF' + # random bytes
b'\x01\x00\x00\x00' + # int 1 (little-endian)
b'\x0A\x00\x00\x00' + # int 10
b'NAME\x00' + # string "NAME"
b'\x00\x00\x00\x00' + # padding
b'\x02\x00\x00\x00' + # int 2
b'\x0B\x00\x00\x00' + # int 11
b'ITEM\x00' # string "ITEM"
)
class ItemStruct:
def __init__(self, data_bytes, start_offset):
# We assume the struct starts at start_offset in data_bytes
# Field 1: 4-byte integer (ID) at offset 0 from struct start
self.item_id = struct.unpack('<I', data_bytes[start_offset:start_offset+4])[0]
# Field 2: 4-byte integer (Quantity) at offset 4 from struct start
self.quantity = struct.unpack('<I', data_bytes[start_offset+4:start_offset+8])[0]
# Field 3: Null-terminated string (Name) at offset 8 from struct start
name_start = start_offset + 8
name_end = data_bytes.find(b'\x00', name_start)
if name_end == -1: # No null terminator, read until end
self.name = data_bytes[name_start:].decode('ascii', errors='ignore')
else:
self.name = data_bytes[name_start:name_end].decode('ascii', errors='ignore')
def __str__(self):
return (f"ItemStruct:\n"
f" ID: {self.item_id}\n"
f" Quantity: {self.quantity}\n"
f" Name: '{self.name}'")
# The "ITEM" pattern starts at offset 24 in simulated_binary_data
second_struct_offset = 24
found_item = ItemStruct(simulated_binary_data, second_struct_offset)
print(found_item)
# Let's also parse the first one to show it works
first_struct_offset = 4
found_name = ItemStruct(simulated_binary_data, first_struct_offset)
print("\n--- Another instance ---")
print(found_name)Petunjuk Struktur Lain
Selain corak mudah dan xref, skrip boleh mencari:
- Penjajaran: Jenis data sering dijajarkan pada sempadan bait tertentu (contohnya, integer 4 bait dijajarkan pada alamat yang boleh dibahagi dengan 4).
- Jadual Maya: Dalam C++, objek sering bermula dengan penuding kepada "jadual kaedah maya" (vtable), yang merupakan petunjuk kukuh bagi kewujudan objek.
- Argumen Fungsi Lazim: Jika fungsi pustaka menjangkakan struktur tertentu sebagai input, skrip boleh mengenal pasti panggilan kepada fungsi tersebut dan membuat kesimpulan tentang struktur argumennya.
Cabaran Struktur Data
Mengautomatikkan pemulihan struktur data bermaksud mencari corak yang bermakna dalam data binari mentah.
Antara berikut, yang manakah BUKAN sebab utama penskripan penting untuk mengenal pasti struktur data dalam binari yang dikaburkan?
Imbas Kembali: Pemulihan Struktur Automatik
Kita telah mempelajari bahawa pemulihan struktur data penting untuk memahami atur cara yang dikompil. Pengenalpastian secara manual sukar dilakukan kerana maklumat sumber telah hilang dan pengoptimuman telah dijalankan.
Penskripan membantu dengan:
- Mengimbas corak bait yang menunjukkan jenis data.
- Menganalisis rujukan silang ke lokasi memori.
- Mentakrifkan struktur secara teratur dalam alat RE.
Proses ini menukarkan bait mentah menjadi logik atur cara yang mudah difahami, sekali gus memudahkan analisis kompleks!
Pelajari Assembly dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 12
- Pelajaran
- 48
Soalan Lazim
Adakah pelajaran “Mengautomatikkan Pemulihan Struktur Data” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Asas Kejuruteraan Balikan & Analisis Binari, termasuk “Mengautomatikkan Pemulihan Struktur Data”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Asas Kejuruteraan Balikan & Analisis Binari merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mengautomatikkan Pemulihan Struktur Data”?
Bangunkan skrip untuk mengenal pasti dan membina semula struktur data kompleks dalam binari yang dikaburkan secara automatik. Anda berlatih Asas Kejuruteraan Balikan & Analisis Binari menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Asas Kejuruteraan Balikan & Analisis Binari?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Asas Kejuruteraan Balikan & Analisis Binari di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Mengautomatikkan Pemulihan Struktur Data” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Asas Kejuruteraan Balikan & Analisis Binari ini?
Ya. Setiap pelajaran Asas Kejuruteraan Balikan & Analisis Binari menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Penskripan IDAPython dan Ghidra
- Mengautomatikkan Pemulihan Struktur Data
- Teknik Menampal Binari
- Tandatangan FLIRT dan Pengenalpastian Fungsi Pustaka