
![]() | Binlex - Kerangka Lexer Sifat Genetik Biner Jika Maldevs berpikir biner mereka adalah FUD, mereka akan mengalami krisis eksistensial. |
Binlex adalah alat untuk analis malware dan peneliti yang mengekstraksi instruksi , blok dasar , dan fungsi dari file biner dan mengaturnya menjadi hierarki genom , kromosom , pasangan alel , dan gen yang terstruktur. ??
Kerusakan hierarkis ini memungkinkan Binlex untuk menganalisis dan membandingkan biner malware dengan memperlakukan struktur kode mereka seperti "sidik jari DNA," membuatnya lebih mudah untuk mendeteksi pola, kesamaan, dan variasi di seluruh sampel.
Tidak seperti alat yang mengandalkan python murni , yang bisa lambat?, Binlex dirancang untuk kecepatan, kesederhanaan, dan fleksibilitas. Antarmuka baris perintahnya membantu analis mencari pola di ratusan atau ribuan sampel malware , menghemat waktu ⏳ dan sumber daya ?
Untuk pengembang, Binlex menawarkan binding Rust API dan Python untuk membangun alat deteksi khusus dengan batasan lisensi minimal. ?
Sebagai bagian dari pertarungan melawan malware, Binlex bebas digunakan - hanya mengunduh binari dari halaman rilis. ?
Versi terbaru dari Binlex menyediakan fitur luar biasa berikut!
| Fitur | Keterangan |
|---|---|
| Platform | - Windows? - MacOS? - Linux? |
| Format | - PE - Macho - peri |
| Arsitektur | - AMD64 - I386 - cil |
| ? Multi-threading | - Antrian Disassembler yang aman -? Perkakas multi-threaded untuk efisiensi maksimal |
| Kinerja yang dapat disesuaikan | Fitur Sakelar On/Off Untuk Mengoptimalkan Kasing Penggunaan Anda |
| ? Kompresi string JSON | Simpan memori dengan kompresi JSON |
| ? Kesamaan hashing | -? Minhash - tlsh -? Sha256 |
| ? Simbol fungsi | - Lulus simbol fungsi ke binlex sebagai input standar menggunakan BLPDB , BlelfSyM atau Blmachosim atau alat Anda sendiri |
| ? ️ Tagging | Tagging untuk organisasi yang mudah |
| Wardcarding | Sempurna untuk menghasilkan aturan yara dan sekarang dengan resolusi nibbles! |
| API | -? API karat -Python API |
| ? Fitur Pembelajaran Mesin | - Fitur yang dinormalisasi untuk konsistensi -? Fitur Utilitas Scaler -? Penyaringan sifat - Pelatihan sampel ONNX -? Klasifikasi Sampel |
| Pencitraan virtual | - Cache pemetaan yang efisien untuk gambar virtual -? ️ Kompatibel dengan ZFS / BTRFS - mempercepat tugas dan penyaringan berulang - Kecepatan kilat ⚡ |
Dengan caching gambar virtual, Binlex dapat melakukan dengan kecepatan yang lebih baik, membuat pengulangan berjalan lebih cepat dan lebih efisien.
Untuk membangun binlex, Anda membutuhkan karat.
Instalasi langsung di Linux dan MacOS.
cargo build --release cd src/bindings/python/
virtualenv -p python3 venv/
source venv/bin/activate
pip install maturin[patchelf]
maturin develop
python
>> import binlex Untuk membangun paket untuk berbagai platform, gunakan Makefile .
make zst # Make Arch Linux Package
make deb # Make Debian Package
make wheel # Make Python Wheel Paket yang dihasilkan akan berada di target/ direktori.
Menginstal plugin IDA mudah diinstal, pastikan Anda memasang binding python di lingkungan Python untuk IDA.
Sekarang salin direktori untuk plugin binlex ke direktori plugin Anda.
mkdir -p ~ /.idapro/plugins/
cp -r scripts/plugins/ida/binlex/ ~ /.idapro/plugins/Setelah Anda membuka Ida, Anda harus disambut dengan pesan sambutan Binlex .

Menggunakan plugin IDA Anda memiliki berbagai fitur yang disediakan untuk membantu Anda dengan penulisan aturan Yara dan analisis kesamaan.
Menu utama:
Menu Konteks Disassembler:
Pola salinan dan fitur copy hex dimaksudkan untuk membantu dengan aturan Yara dan penyalinan hash dan pemindaian kesamaan adalah untuk berburu data yang sama.
Untuk membandingkan satu database dengan yang lain, gunakan fitur Ekspor untuk mengekspor file JSON, lalu klik Compare Functions , yang akan mengisi tabel setelah selesai.
cargo docAnda juga dapat membuka dokumen.
cargo doc --openDalam binlex , hierarki istilah yang terinspirasi oleh genetik digunakan untuk menggambarkan dan melambangkan struktur dan sifat kode biner. Terminologi ini mencerminkan hubungan antara abstraksi yang berbeda dan analogi genetiknya:
Genome : mewakili setiap objek yang dianalisis, seperti fungsi atau blok. Ini merangkum semua informasi, termasuk metadata, kromosom, dan atribut lainnya.
Kromosom : mewakili pola atau urutan inti yang diekstraksi dari blok atau fungsi. Sebuah kromosom bertindak sebagai cetak biru untuk mengidentifikasi karakteristik kunci dari biner tanpa pengalamatan memori seperti yang ditunjukkan oleh wildcard seperti ? , di mana satu wildcard mewakili satu gen.
Allelepair : Unit dalam kromosom yang terdiri dari dua gen . Pasangan alel adalah blok bangunan kromosom, menggabungkan gen menjadi pasangan yang bermakna.
Gen : Unit terkecil dari informasi genetik, mewakili satu gigitan data (setengah byte).
Hubungan antara abstraksi ini dapat divisualisasikan sebagai berikut:
Genome (function / block)
└── Chromosome (pattern / sequence)
└── AllelePair (two genes / single byte / two nibbles)
└── Gene (single nibble)
{
"type" : " block " ,
"architecture" : " amd64 " ,
"address" : 6442934577 ,
"next" : null ,
"to" : [],
"edges" : 0 ,
"prologue" : false ,
"conditional" : false ,
"chromosome" : {
"pattern" : " 4c8b47??498bc0 " ,
"feature" : [ 4 , 12 , 8 , 11 , 4 , 7 , 4 , 9 , 8 , 11 , 12 , 0 ],
"entropy" : 2.2516291673878226 ,
"sha256" : " 1f227bf409b0d9fbc576e747de70139a48e42edec60a18fe1e6efdacb598f551 " ,
"minhash" : " 09b8b1ad1142924519f601854444c6c904a3063942cda4da445721dd0703f290208f3e32451bf5d52741e381a13f12f9142b5de21828a00b2cf90cf77948aac4138443c60bf77ec31199247042694ebb2e4e14a41369eddc7d9f84351be34bcf61458425383a03a55f80cbad420bb6e638550c15876fd0c6208da7b50816847e62d72b2c13a896f4849aa6a36188be1d4a5333865eab570e3939fab1359cbd16758f36fa290164d0259f83c07333df535b2e38f148298db255ac05612cae04d60bb0dd810a91b80a7df9615381e9dc242969dd052691d044287ac2992f9092fa0a75d970100d48362f62b58f7f1d9ec594babdf52f58180c30f4cfca142e76bf " ,
"tlsh" : null
},
"size" : 7 ,
"bytes" : " 4c8b4708498bc0 " ,
"functions" : {},
"number_of_instructions" : 3 ,
"entropy" : 2.5216406363433186 ,
"sha256" : " 84d4485bfd833565fdf41be46c1a499c859f0a5f04c8c99ea9c34404729fd999 " ,
"minhash" : " 20c995de6a15c8a524fa7e325a6e42b217b636ab03b00812732f877f4739eeee41d7dde92ceac73525e541f9091d8dc928f6425b84a6f44b3f01d17912ec6e8c6f913a760229f685088d2528447e40c768c06d680afe63cb219a1b77a097f679122804dd5a1b9d990aa2579e75f8ef201eeb20d5650da5660efa3a281983a37f28004f9f2a57af8f81728c7d1b02949609c7ad5a30125ff836d8cc3106f2531f306e679a11cabf992556802a3cb2a75a7fe3773e37e3d5ab107a23bf22754aee15a5f41056859b06120f86cb5d39071425855ec90628687741aa0402030d73e04bc60adb0bd2430560442c4309ae258517fc1605438c95485ac4c8621026a1bb " ,
"tlsh" : null ,
"contiguous" : true ,
"attributes" : [
{
"type" : " tag " ,
"value" : " corpus:malware "
},
{
"type" : " tag " ,
"value" : " malware:lummastealer "
},
{
"entropy" : 6.55061550644311 ,
"sha256" : " ec1426109420445df8e9799ac21a4c13364dc12229fb16197e428803bece1140 " ,
"size" : 725696 ,
"tlsh" : " T17AF48C12AF990595E9BBC23DD1974637FAB2B445232047CF426489BD0E1BBE4B73E381 " ,
"type" : " file "
}
]
}Mengingat contoh genom JSON ini.
"4c8b47??498bc0""4c" atau "8b""4" atau "c"Menggunakan Binlex API adalah mungkin untuk bermutasi kromosom ini, pasangan alel dan gen mereka untuk memfasilitasi pemrograman genetik.
Pemrograman genetik dalam konteks ini dapat memiliki beberapa manfaat termasuk tetapi tidak terbatas pada:
Cara paling sederhana untuk memulai adalah dengan baris perintah, memanfaatkan alat penyaringan JSON seperti jq .
Perintah 16 jq sample.dll
Untuk melihat opsi apa yang tersedia saat menggunakan Binlex Command -line menggunakan -h atau --help .
A Binary Pattern Lexer
Version: 2.0.0
Usage: binlex [OPTIONS] --input < INPUT >
Options:
-i, --input < INPUT >
-o, --output < OUTPUT >
-a, --architecture < ARCHITECTURE > [amd64, i386, cil]
-c, --config < CONFIG >
-t, --threads < THREADS >
--tags < TAGS >
--minimal
-d, --debug
--enable-instructions
--enable-block-instructions
--disable-hashing
--disable-disassembler-sweep
--disable-heuristics
--enable-mmap-cache
--mmap-directory < MMAP_DIRECTORY >
-h, --help Print help
-V, --version Print version
Author: @c3rb3ru5d3d53cContoh sederhana menggunakan baris perintah disediakan di bawah ini.
binlex -i sample.dll --threads 16 | jq Harap dicatat bahwa Binlex akan mendeteksi format file Anda dan saat ini mendukung format biner PE , ELF dan MACHO .
Setelah eksekusi Binlex pertama Anda, ini akan menyimpan file konfigurasi di direktori konfigurasi Anda di binlex/binlex.toml .
Binlex ini menemukan direktori konfigurasi default berdasarkan sistem operasi Anda seperti yang ditunjukkan pada tabel di bawah ini untuk konfigurasinya.
| Os | Variabel Lingkungan | Contoh jalur konfigurasi binlex |
|---|---|---|
| Linux | $XDG_CONFIG_HOME atau $HOME/.config | /home/alice/.config/binlex/binlex.toml |
| MacOS | $HOME/Library/Application Support | /Users/Alice/Library/Application Support/binlex/binlex.toml |
| Windows | {FOLDERID_RoamingAppData} | C:UsersAliceAppDataRoamingbinlexbinlex.toml |
Nama konfigurasi default binlex.toml untuk binlex disediakan di bawah ini.
[ general ]
threads = 16
minimal = false
debug = false
[ formats . file . hashing . sha256 ]
enabled = true
[ formats . file . hashing . tlsh ]
enabled = true
minimum_byte_size = 50
threshold = 200
[ formats . file . hashing . minhash ]
enabled = true
number_of_hashes = 64
shingle_size = 4
maximum_byte_size_enabled = false
maximum_byte_size = 50
seed = 0
threshold = 0.75
[ formats . file . heuristics . features ]
enabled = true
[ formats . file . heuristics . entropy ]
enabled = true
[ instructions ]
enabled = false
[ instructions . hashing . sha256 ]
enabled = true
[ instructions . hashing . tlsh ]
enabled = true
minimum_byte_size = 50
threshold = 200
[ instructions . hashing . minhash ]
enabled = true
number_of_hashes = 64
shingle_size = 4
maximum_byte_size_enabled = false
maximum_byte_size = 50
seed = 0
threshold = 0.75
[ instructions . heuristics . features ]
enabled = true
[ instructions . heuristics . entropy ]
enabled = true
[ blocks ]
enabled = true
[ blocks . instructions ]
enabled = false
[ blocks . hashing . sha256 ]
enabled = true
[ blocks . hashing . tlsh ]
enabled = true
minimum_byte_size = 50
threshold = 200
[ blocks . hashing . minhash ]
enabled = true
number_of_hashes = 64
shingle_size = 4
maximum_byte_size_enabled = false
maximum_byte_size = 50
seed = 0
threshold = 0.75
[ blocks . heuristics . features ]
enabled = true
[ blocks . heuristics . entropy ]
enabled = true
[ functions ]
enabled = true
[ functions . blocks ]
enabled = true
[ functions . hashing . sha256 ]
enabled = true
[ functions . hashing . tlsh ]
enabled = true
minimum_byte_size = 50
threshold = 200
[ functions . hashing . minhash ]
enabled = true
number_of_hashes = 64
shingle_size = 4
maximum_byte_size_enabled = false
maximum_byte_size = 50
seed = 0
threshold = 0.75
[ functions . heuristics . features ]
enabled = true
[ functions . heuristics . entropy ]
enabled = true
[ chromosomes . hashing . sha256 ]
enabled = true
[ chromosomes . hashing . tlsh ]
enabled = true
minimum_byte_size = 50
threshold = 200
[ chromosomes . hashing . minhash ]
enabled = true
number_of_hashes = 64
shingle_size = 4
maximum_byte_size_enabled = false
maximum_byte_size = 50
seed = 0
threshold = 0.75
[ chromosomes . heuristics . features ]
enabled = true
[ chromosomes . heuristics . entropy ]
enabled = true
[ chromosomes . homologues ]
enabled = true
maximum = 4
[ mmap ]
directory = " /tmp/binlex "
[ mmap . cache ]
enabled = false
[ disassembler . sweep ]
enabled = trueJika opsi baris perintah tidak cukup, file konfigurasi menyediakan kontrol yang paling granular dari semua opsi.
Jika Anda ingin mengganti file konfigurasi default dan menentukan file konfigurasi lain, gunakan parameter baris perintah.
binlex -c config.toml -i sample.dllSaat Anda menjalankan Binlex , ia menggunakan file konfigurasi dan mengesampingkan pengaturan apa pun ketika parameter baris perintah masing-masing digunakan.
Berikut ini adalah alur kerja umum yang memulai dengan membuat aturan Yara, di mana kami mendapatkan 10 string Yara hex Wildcarded yang unik dari sampel yang diberikan.
binlex -i sample.dll --threads 16 | jq -r ' select(.size >= 16 and .size <= 32 and .chromosome.pattern != null) | .chromosome.pattern ' | sort | uniq | head -10
016b ?? 8b4b ?? 8bc74c6bd858433b4c0b2c0f83c5 ??????
01835404 ???? c6836a0400 ???? 837e04 ??
03c04c8d05 ???????? 4863c8420fb60401460fb64401018942 ?? 85c074 ??
03c38bf0488d140033c9ff15 ???????? 488bd84885c075 ??
03c6488d55 ?? 41ffc58945a ? 41b804000000418bcce8b8fd01 ?? eb ??
03c6488d55 ?? 41ffc58945a ? 41b804000000418bcce8e3fb01 ?? eb ??
03f7488d05 ???????? 4883c310483bd87c ??
03fb4c8bc6498bd7498bcc448d0c7d04000000e89409 ???? 8bd84885f6
03fe448bc6488bd3418bcee8d8e501 ?? 85ed
03fe897c24 ?? 397c24 ?? 0f867301 ???? Untuk mengambil langkah ini lebih jauh, Anda dapat menjalankannya melalui alat blyara untuk membuat tanda tangan Yara yang cepat.
binlex -i sample.dll --threads 16 | jq -r ' select(.size >= 16 and .size <= 32 and .chromosome.pattern != null) | .chromosome.pattern ' | sort | uniq | head -10 | blyara -n example
rule example {
strings:
$trait_0 = {016b ?? 8b4b ?? 8bc74c6bd858433b4c0b2c0f83c5 ?????? }
$trait_1 = {01835404 ???? c6836a0400 ???? 837e04 ?? }
$trait_2 = {03c04c8d05 ???????? 4863c8420fb60401460fb64401018942 ?? 85c074 ?? }
$trait_3 = {03c38bf0488d140033c9ff15 ???????? 488bd84885c075 ?? }
$trait_4 = {03c6488d55 ?? 41ffc58945a ? 41b804000000418bcce8b8fd01 ?? eb ?? }
$trait_5 = {03c6488d55 ?? 41ffc58945a ? 41b804000000418bcce8e3fb01 ?? eb ?? }
$trait_6 = {03f7488d05 ???????? 4883c310483bd87c ?? }
$trait_7 = {03fb4c8bc6498bd7498bcc448d0c7d04000000e89409 ???? 8bd84885f6}
$trait_8 = {03fe448bc6488bd3418bcee8d8e501 ?? 85ed}
$trait_9 = {03fe897c24 ?? 397c24 ?? 0f867301 ???? }
condition:
1 of them Untuk hasil yang lebih baik jika Anda mengekspor genom menggunakan plugin Binlex IDA atau dengan cara lain Anda dapat memfilter untuk fungsi start awalan seperti mw:: , untuk malware , yang cukup umum.
cat dump.json | jq -r ' select(.type == "function" and .size > 32 and (.attributes[] | .type == "symbol" and (.name | startswith("mw::")))) | .blocks[] | select(.size > 32) | .chromosome.pattern ' | blyara -n example Untuk menggunakan binlex dengan ghidra gunakan skrip blghidra/blghidra.py di direktori skrip.
Untuk memanfaatkan nama fungsi dan alamat virtual dari proyek Ghidra Anda dan berikan mereka untuk Binlex Gunakan skrip analyzeHeadless di direktori instalasi Ghidra Anda.
./analyzeHeadless
< project-directory >
< project-name >
-process sample.dll
-noanalysis
-postscript blghidra.py 2> /dev/null | grep -P " ^{ " type " | binlex -i sample.dll Harap dicatat bahwa analyzeHeadless Cetak Pesan Log ke stdout dan output log lainnya ke stderr yang tidak ada gunanya interoperabilitas dengan utilitas baris perintah lainnya.
Dengan demikian, untuk mengumpulkan output skrip itu harus difilter dengan 2>/dev/null | grep -P "^{"type" .
Untuk memanfaatkan kekuatan deteksi fungsi rizin dan penamaan fungsi di binlex , jalankan rizin pada proyek Anda menggunakan aflj untuk mendaftar fungsi dalam format JSON.
Kemudian pipa output ini ke blrizin , yang mem -parsing rizin json ke format binlex undestands.
Selain itu, Anda dapat menggabungkan ini dengan alat lain seperti blpdb untuk menguraikan simbol PDB untuk mendapatkan alamat dan nama fungsi.
Anda kemudian dapat melakukan penguraian apa pun karena Anda biasanya menggunakan jq , dalam contoh ini kami menghitung fungsi yang diproses oleh Binlex untuk melihat apakah kami mendeteksi lebih banyak dari mereka.
rizin -c ' aaa;aflj; ' -q sample.dll |
blrizin |
blpdb -i sample.pdb |
binlex -i sample.dll |
jq ' select(.type == "function") | .address ' | wc -l Catatan : Saat ini blrizin juga dapat dikompatibel dengan output dari radare2 menggunakan blrizin .
Jika Anda ingin melakukan beberapa pembelajaran mesin, Anda bisa mendapatkan fitur yang mewakili camilan tanpa pengalamatan memori dari binlex seperti ini.
binlex -i sample.dll --threads 16 | jq -r -c ' select(.size >= 16 and .size <= 32 and .signature.feature != null)| .signature.feature ' | head -10
[4,9,8,11,12,0,4,1,11,9,0,3,0,0,1,15,0,0,4,5,3,3,12,0,8,5,13,2,4,8,8,11,13,0,4,1,0,15,9,5,12,0,4,8,15,15,2,5]
[4,4,8,11,5,1,4,5,3,3,12,0,3,3,12,0,4,8,8,3,12,1,3,0,4,1,0,15,10,3,12,2]
[4,8,8,3,14,12,4,12,8,11,12,10,4,4,8,9,4,4,2,4,11,2,0,1,4,4,0,15,11,7,12,1,8,10,12,10,14,8,5,11,4,8,8,3,12,4,12,3]
[4,8,8,3,14,12,4,4,8,9,4,4,2,4,4,12,8,11,12,10,4,4,0,15,11,7,12,1,11,2,0,1,3,3,12,9,14,8,0,11,4,8,8,3,12,4,12,3]
[4,0,5,3,4,8,8,3,14,12,15,15,1,5,8,11,12,8,8,11,13,8,15,15,1,5,8,11,12,3,4,8,8,3,12,4,5,11,12,3]
[11,9,2,0,0,3,15,14,7,15,4,8,8,11,8,11,0,4,2,5,4,8,0,15,10,15,12,1,4,8,12,1,14,8,1,8,12,3]
[8,11,0,12,2,5,11,8,2,0,0,3,15,14,7,15,4,8,12,1,14,1,2,0,4,8,8,11,4,8,12,1,14,0,0,8,4,8,15,7,14,1,4,8,8,11,12,2,12,3]
[4,8,8,11,0,5,4,8,8,5,12,0,7,5,12,3,4,8,15,15,2,5]
[4,8,8,11,0,13,3,3,12,0,3,8,8,1,11,0,0,8,0,15,9,5,12,0,12,3]
[4,8,8,11,0,5,4,8,8,5,12,0,7,5,12,3,4,8,15,15,2,5] Jika Anda ingin memperbaiki ini untuk model pembelajaran mesin Anda dengan menormalkannya antara 0 dan 1 Nilai Float Binlex telah Anda tutupi dengan alat blscaler .
binlex -i sample.dll --threads 16 | jq -r -c ' select(.size >= 16 and .size <= 32 and .signature.feature != null) ' | blscaler --threads 16 | jq -c -r ' .signature.feature ' | head -1
[0.26666666666666666,0.6,0.5333333333333333,0.7333333333333333,0.8,0.0,0.26666666666666666,0.06666666666666667,0.7333333333333333,0.6,0.0,0.2,0.0,0.0,0.06666666666666667,1.0,0.0,0.0,0.26666666666666666,0.3333333333333333,0.2,0.2,0.8,0.0,0.5333333333333333,0.3333333333333333,0.8666666666666667,0.13333333333333333,0.26666666666666666,0.5333333333333333,0.5333333333333333,0.7333333333333333,0.8666666666666667,0.0,0.26666666666666666,0.06666666666666667,0.0,1.0,0.6,0.3333333333333333,0.8,0.0,0.26666666666666666,0.5333333333333333,1.0,1.0,0.13333333333333333,0.3333333333333333]Untuk memanfaatkan fitur yang kuat dari filemapping untuk mengurangi penggunaan memori tetapi masih mendapat manfaat dari gambar virtual.
# Install BTRFS
sudo pacman -S btrfs-progs compsize
# Enable the Kernel Module on Boot
echo " btrfs " | sudo tee /etc/modules-load.d/btrfs.conf
# Reboot
reboot
# Create Virtual Image Cache Storage Pool
dd if=/dev/zero of=btrfs.img bs=1M count=2048
# Make it BTRFS
mkfs.btrfs btrfs.img
# Make a Cache Directory in /tmp/
mkdir -p /tmp/binlex/
# Mount the Cache (Multiple Compression Options Available)
sudo mount -o compress=lzo btrfs.img /tmp/binlex/
# Run Binlex
binlex -i sample.dll --threads 16 --enable-file-mapping --file-mapping-directory /tmp/binlex/ --enable-file-mapping-cache
sudo compsize ec1426109420445df8e9799ac21a4c13364dc12229fb16197e428803bece1140
# Virtual Image 6GB vs Stored Size of 192MB
# Processed 1 file, 49156 regular extents (49156 refs), 0 inline.
# Type Perc Disk Usage Uncompressed Referenced
# TOTAL 3% 192M 6.0G 6.0G
# none 100% 384K 384K 384K
# lzo 3% 192M 6.0G 6.0G Ini dapat mengatur ini untuk berada di disk atau IF /tmp/ direktori dipetakan ke RAM.
Ketika dipetakan ke RAM, kami memanfaatkan pembongkaran citra virtual tetapi tanpa penalti RAM tambahan di mana tugas berulang hampir dua kali lipat dalam kecepatan pemrosesan.
Karena btrfs mengabstraksikan akses ke file yang dipetakan di kernel, kami dapat mengaksesnya karena kami menggunakan file yang dipetakan tetapi dengan manfaat kompresi.
Untuk menghemat waktu jika Anda memilih opsi ini, lakukan pemasangan kumpulan btrfs terjadi pada boot dan selesaikan file konfigurasi Binlex Anda untuk lebih memilih caching gambar virtual di direktori pool yang dipasang. Pendekatan ini memastikan bahwa Anda tidak perlu bergantung pada parameter baris perintah setiap kali.
Proyek filofi dari Binlex difokuskan pada keamanan, kesederhanaan, kecepatan, dan kemampuan memperpanjang.
Sebagian dari ini adalah menyediakan API bagi pengembang untuk menulis deteksi dan logika perburuan mereka sendiri.
Pada saat ini, Binlex menyediakan binding karat dan python.
Karat, API membuat mudah untuk memulai
use std :: process ;
use binlex :: Config ;
use binlex :: formats :: PE ;
use binlex :: disassemblers :: capstone :: Disassembler ;
use binlex :: controlflow :: Graph ;
// Get Default Configuration
let mut config = Config ( ) ;
// Use 16 Threads for Multi-Threaded Operations
config . general . threads = 16 ;
// Read PE File
let pe = PE . new ( "./sample.dll" , config )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// To check if DotNet PE use pe.is_dotnet()
// Get Memory Mapped File
let mapped_file = pe . image ( )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 )
} ) ;
// Get Mapped File Virtual Image
let image = mapped_file
. mmap ( )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// Create Disassembler
let disassembler = Disassembler ( pe . architecture ( ) , & image , pe . executable_virtual_address_ranges ( ) , config )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// Create Control Flow Graph
let cfg = Graph ( pe . architecture ( ) , config ) ;
// Disassemble Control Flow
disassembler . disassemble_controlflow ( pe . entrypoint_virtual_addresses ( ) , & mut cfg ) ; use std :: process ;
use binlex :: Config ;
use binlex :: formats :: PE ;
use binlex :: disassemblers :: custom :: cil :: Disassembler ;
use binlex :: controlflow :: Graph ;
// Get Default Configuration
let mut config = Config ( ) ;
// Use 16 Threads for Multi-Threaded Operations
config . general . threads = 16 ;
// Read PE File
let pe = PE . new ( "./sample.exe" , config )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// To check if DotNet PE use pe.is_dotnet()
// Get Memory Mapped File
let mapped_file = pe . image ( )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 )
} ) ;
// Get Mapped File Virtual Image
let image = mapped_file
. mmap ( )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// Create Disassembler
let disassembler = Disassembler ( pe . architecture ( ) , & image , pe . dotnet_metadata_token_virtual_addresses ( ) , pe . dotnet_executable_virtual_address_ranges ( ) , config )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// Create Control Flow Graph
let cfg = Graph ( pe . architecture ( ) , config ) ;
// Disassemble Control Flow
disassembler . disassemble_controlflow ( pe . dotnet_entrypoint_virtual_addresses ( ) , & mut cfg ) ; use std :: process ;
use binlex :: Config ;
use binlex :: formats :: ELF ;
use binlex :: disassemblers :: custom :: cil :: Disassembler ;
use binlex :: controlflow :: Graph ;
// Get Default Configuration
let mut config = Config ( ) ;
// Use 16 Threads for Multi-Threaded Operations
config . general . threads = 16 ;
// Read PE File
let elf = ELF . new ( "./sample.exe" , config )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// Get Memory Mapped File
let mapped_file = elf . image ( )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 )
} ) ;
// Get Mapped File Virtual Image
let image = mapped_file
. mmap ( )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// Create Disassembler
let disassembler = Disassembler ( elf . architecture ( ) , & image , elf . executable_virtual_address_ranges ( ) , config )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// Create Control Flow Graph
let cfg = Graph ( elf . architecture ( ) , config ) ;
// Disassemble Control Flow
disassembler . disassemble_controlflow ( elf . entrypoint_virtual_addresses ( ) , & mut cfg ) ; use std :: process ;
use binlex :: Config ;
use binlex :: formats :: MACHO ;
use binlex :: disassemblers :: custom :: cil :: Disassembler ;
use binlex :: controlflow :: Graph ;
// Get Default Configuration
let mut config = Config ( ) ;
// Use 16 Threads for Multi-Threaded Operations
config . general . threads = 16 ;
// Read PE File
let macho = MACHO . new ( "./sample.app" , config )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// Iterate the MACHO Fat Binary Slices
for index in macho . number_of_slices ( ) {
// Get Memory Mapped File
let mapped_file = macho . image ( index )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 )
} ) ;
// Get Mapped File Virtual Image
let image = mapped_file
. mmap ( )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// Create Disassembler
let disassembler = Disassembler ( macho . architecture ( index ) , & image , macho . executable_virtual_address_ranges ( index ) , config )
. unwrap_or_else ( |error| {
eprintln ! ( "{}" , error ) ;
process :: exit ( 1 ) ;
} ) ;
// Create Control Flow Graph
let cfg = Graph ( macho . architecture ( index ) , config ) ;
// Disassemble Control Flow
disassembler . disassemble_controlflow ( macho . entrypoints ( index ) , & mut cfg ) ;
} use binlex :: controlflow :: Instruction ;
use binlex :: controlflow :: Block ;
use binlex :: controlflow :: Function ;
for address in cfg . instructions . valid_addresses ( ) {
// Read Instruction from Control Flow
instruction = Instruction ( address , & cfg ) ;
// Print Instruction from Control Flow
instruction . print ( ) ;
}
for address in cfg . blocks . valid_addresses ( ) {
// Read Block from Control Flow
block = Block ( address , & cfg ) ;
// Print Block from Control Flow
block . print ( ) ;
}
for address in cfg . functions . valid_addresses ( ) {
// Read Function from Control Flow
function = Function ( address , & cfg ) ;
// Print Function from Control Flow
function . print ( ) ;
}Binlex Python API sekarang dirancang untuk mengabstraksi Disassembler dan Grafik ControlFlow.
Untuk membongkar gambar yang dipetakan memori PE, gunakan contoh -contoh berikut.
Ada lebih banyak contoh dalam examples/python/ direktori.
from binlex . formats import PE
from binlex . disassemblers . capstone import Disassembler
from binlex . controlflow import Graph
from binlex import Config
# Get Default Configuration
config = Config ()
# Use 16 Threads for Multi-Threaded Operations
config . general . threads = 16
# Open the PE File
pe = PE ( './sample.exe' , config )
# To check if a DotNet PE use ps.is_dotnet()
# Get the Memory Mapped File
mapped_file = pe . image ()
# Get the Memory Map
image = mapped_file . as_memoryview ()
# Create Disassembler on Mapped PE Image and PE Architecture
disassembler = Disassembler ( pe . architecture (), image , pe . executable_virtual_address_ranges (), config )
# Create the Controlflow Graph
cfg = Graph ( pe . architecture (), config )
# Disassemble the PE Image Entrypoints Recursively
disassembler . disassemble_controlflow ( pe . entrypoint_virtual_addresses (), cfg ) from binlex . formats import PE
from binlex . disassemblers . custom . cil import Disassembler
from binlex . controlflow import Graph
from binlex import Config
# Get Default Configuration
config = Config ()
# Use 16 Threads for Multi-Threaded Operations
config . general . threads = 16
# Open the PE File
pe = PE ( './sample.exe' , config )
# To check if a DotNet PE use ps.is_dotnet()
# Get the Memory Mapped File
mapped_file = pe . image ()
# Get the Memory Map
image = mapped_file . as_memoryview ()
# Create Disassembler on Mapped PE Image and PE Architecture
disassembler = Disassembler ( pe . architecture (), image , pe . dotnet_metadata_token_virtual_addresses (), pe . dotnet_executable_virtual_address_ranges (), config )
# Create the Controlflow Graph
cfg = Graph ( pe . architecture (), config )
# Disassemble the PE Image Entrypoints Recursively
disassembler . disassemble_controlflow ( pe . dotnet_entrypoint_virtual_addresses (), cfg ) from binlex . formats import ELF
from binlex . disassemblers . capstone import Disassembler
from binlex . controlflow import Graph
from binlex import Config
# Get Default Configuration
config = Config ()
# Use 16 Threads for Multi-Threaded Operations
config . general . threads = 16
# Open the ELF File
elf = ELF ( './sample.so' , config )
# Get the Memory Mapped File
mapped_file = pe . image ()
# Get the Memory Map
image = mapped_file . as_memoryview ()
# Create Disassembler on Mapped ELF Image and ELF Architecture
disassembler = Disassembler ( elf . architecture (), image , elf . executable_virtual_address_ranges (), config )
# Create the Controlflow Graph
cfg = Graph ( elf . architecture (), config )
# Disassemble the PE Image Entrypoints Recursively
disassembler . disassemble_controlflow ( elf . entrypoint_virtual_addresses (), cfg ) from binlex . formats import MACHO
from binlex . disassemblers . capstone import Disassembler
from binlex . controlflow import Graph
from binlex import Config
# Get Default Configuration
config = Config ()
# Use 16 Threads for Multi-Threaded Operations
config . general . threads = 16
# Open the ELF File
macho = MACHO ( './sample.app' , config )
# MachO Fat Binary Can Support Multiple Architectures
for index in macho . number_of_slices ():
# Get the Memory Mapped File
mapped_file = macho . image ( index )
# Get the Memory Map
image = mapped_file . as_memoryview ()
# Create Disassembler on Mapped MACHO Image and MACHO Architecture
disassembler = Disassembler ( macho . architecture ( index ), image , macho . executable_virtual_address_ranges ( index ), config )
# Create the Controlflow Graph
cfg = Graph ( macho . architecture ( index ), config )
# Disassemble the MACHO Image Entrypoints Recursively
disassembler . disassemble_controlflow ( macho . entrypoints ( index ), cfg )Terkadang mungkin nessassary untuk menguraikan grafik ControlFlow yang dihasilkan.
Dalam hal ini, Anda dapat menggunakan teknik berikut.
from binlex . controlflow import Instruction
from binlex . controlflow import Block
from binlex . controlflow import Function
# Iterate Valid Instructions
for address in cfg . instructions . valid_addresses ():
# Read Instruction from Control Flow
instruction = Instruction ( address , cfg )
# Print Instruction from Control Flow
instruction . print ()
# Iterate Valid Blocks
for address in cfg . blocks . valid_addresses ():
# Read Block from Control Flow
block = Block ( address , cfg )
# Print Block from Control Flow
block . print ()
# Iterate Valid Functions
for address in cfg . functions . valid_addresses ():
# Read Function from Control Flow
function = Function ( address , cfg )
# Print Function from Control Flow
function . print ()Alih -alih parsing, Anda dapat mengakses instruksi, blok, dan fungsi lebih langsung.
for instruction in cfg . instructions ():
instruction . print ()
for block in cfg . blocks ():
block . print ()
for function in cfg . functions ():
function . print ()Dimungkinkan juga untuk beralih dari fungsi ke blok, ke instruksi, ke pasangan alel, ke gen.
Ini mewakili beralih dari abstraksi tingkat tertinggi ke abstraksi terendah.
for function in cfg . functions ():
for block in function . blocks ():
for instruction in block . instructions ():
for allelepair in instruction . chromosome (). allelepairs ():
for gene in allelepair . genes ():
print ( gene )Salah satu alat paling kuat yang dapat Anda gunakan di Binlex adalah membandingkan fungsi, blok, dan instruksi menggunakan hashing kesamaan.
Untuk melakukan perbandingan ini sesederhana memanggil metode compare .
for lhs in lhs_cfg . functions ():
for rhs in rhs_cfg . functions ():
similarity = lhs . compare ( rhs )
similarity . print ()
for lhs in lhs_cfg . blocks ():
for rhs in rhs_cfg . blocks ():
similarity = lhs . compare ( rhs )
similarity . print ()
for lhs in lhs_cfg . instructions ():
for rhs in rhs_cfg . instructions ():
similarity = lhs . compare ( rhs )
similarity . print ()Algoritma hashing kesamaan yang didukung akan dikalsualisasikan jika diaktifkan dengan konfigurasi Anda.
Meskipun bisa menantang, Binlex mendukung melakukan analisis kesamaan pada fungsi-fungsi yang tidak kontigu menggunakan algoritma sendiri untuk menemukan kecocokan kesamaan terbaik.
Setidaknya 75% atau lebih dari data fungsi yang tidak kontygu harus hashable untuk menghasilkan hash kesamaan.
Setiap instruksi, blok dan fungsi atau genom memiliki kromosom terkait yang dapat diakses melalui API.
Anda dapat mengikuti abstraksi ini ke pasangan alel, dan gen masing -masing.
# Iterate Block Chromosome
chromosome = block . chromosome ()
for allelepair in chromosome . allelepairs ():
for gene in allelepair . genes ()
gene . print ()
# Iterate Block Chromosome
chromosome = function . chromosome ()
for allelepair in chromosome . allelepairs ():
for gene in allelepair . genes ()
gene . print ()
# Iterate Block Chromosome
chromosome = function . chromosome ()
for allelepair in chromosome . allelepairs ():
for gene in allelepair . genes ()
gene . print ()Jika Anda ingin melakukan tugas pemrograman genetik, Anda juga dapat bermutasi kromosom, allelepairs, dan gen dan mereka melacak jumlah mutasi mereka sendiri.
chromosome = block . chromosome ()
chromosome . mutate ( 'deadbe?f' )
chromosome . number_of_mutations ()
chromosome . print ()
for allelepair in chromosome . allelepairs ():
allelepair . mutate ( 'dead' )
allelepair . number_of_mutations ()
allelepair . print ()
for gene in allelepair . genes ():
gene . mutate ( 'd' )
gene . number_of_mutations ()
gene . print ()Ini memfasilitasi mutasi dengan algoritma genetika yang mungkin akan Anda gunakan untuk usecases Anda.
Jika Anda menggunakan binlex dalam publikasi jurnal, atau model AI open-source menggunakan kutipan berikut.
@misc { binlex ,
author = { c3rb3ru5d3d53c } ,
title = { binlex: A Binary Genetic Trait Lexer Framework } ,
year = { 2024 } ,
note = { Available at url{https://github.com/c3rb3ru5d3d53c/binlex-rs} }
}Jika penggunaan binlex untuk perusahaan, tujuan pribadi, atau untuk menghasilkan output yang bukan model AI open-source, tidak diperlukan kutipan.
Misalnya, jika Anda menggunakan Binlex untuk membuat aturan Yara, tidak diperlukan kutipan.
Ini memastikan bahwa Binlex tetap relevan tetapi juga memastikan penggunaan perusahaan dan pribadi yang permisif.