
![]() | Binlex - إطار عمل ثنائي للسمات الوراثية إذا اعتقد Maldevs أن ثنائيهم هو fud ، فإنهم على وشك أن يكون لديهم أزمة وجودية. |
Binlex هي أداة لمحللي البرامج الضارة والباحثين الذين يستخرجون التعليمات والكتل الأساسية والوظائف من الملفات الثنائية وتنظيمها في التسلسل الهرمي منظم للجينومات والكروموسومات وأزواج الأليل والجينات . ؟
يتيح هذا الانهيار الهرمي Binlex تحليل ومقارنة ثنائيات البرامج الضارة عن طريق علاج بنية الكود الخاصة بهم مثل "بصمة الحمض النووي" ، مما يجعل من الأسهل اكتشاف الأنماط وأوجه التشابه والاختلافات عبر العينات.
على عكس الأدوات التي تعتمد على الثعبان النقي ، والتي يمكن أن تكون بطيئة؟ ، تم تصميم Binlex للسرعة والبساطة والمرونة. تساعد واجهة سطر أوامر المحللين على البحث عن أنماط عبر مئات أو آلاف عينات البرامج الضارة ، وتوفير الوقت ⏳ والموارد ؟
بالنسبة للمطورين ، يقدم Binlex API Rust و Bython Bindings لبناء أدوات اكتشاف مخصصة مع الحد الأدنى من قيود الترخيص. ؟
كجزء من المعركة ضد البرامج الضارة ، فإن Binlex مجاني في استخدام - فقط قم بتنزيل الثنائيات من صفحة الإصدار. ؟
أحدث إصدار من Binlex يوفر الميزات المذهلة التالية!
| ميزة | وصف |
|---|---|
| المنصات | - Windows؟ - ماكوس؟ - لينكس؟ |
| تنسيقات | - PE - مفتول العضلات - قزم |
| البنى | - AMD64 - I386 - CIL |
| ؟ متعدد الخيوط | - قائمة انتظار تفكيك آمن مؤشر الترابط -؟ أدوات متعددة الخيوط لتحقيق أقصى قدر من الكفاءة |
| أداء قابل للتخصيص | تبديل الميزات تشغيل/إيقاف لتحسين حالة الاستخدام الخاصة بك |
| ؟ JSON سلسلة ضغط | احفظ الذاكرة مع ضغط JSON |
| ؟ تشابه التجزئة | -؟ مينهاش - TLSH -؟ SHA256 |
| ؟ رموز الوظيفة | - رموز وظيفة التمرير إلى binlex كمدخل قياسي باستخدام BLPDB أو blelfsym أو blmachosym أو أدواتك الخاصة |
| ؟ ️ وضع العلامات | وضع علامة على المنظمة السهلة |
| البطاقة البرية | مثالي لتوليد قواعد يارا والآن في حل القلوب! |
| API | -؟ صدأ API -Python API |
| ؟ ميزات التعلم الآلي | - ميزات طبيعية للاتساق -؟ ميزة Scaler فائدة -؟ تصفية السمات - تدريب عينة ONNX -؟ تصنيف العينة |
| التصوير الافتراضي | - ذاكرة التخزين المؤقت لكفاءة رسم الخرائط للصور الافتراضية -؟ ️ متوافق مع ZFS / BTRFS - يسرع المهام المتكررة والتصفية - سرعة الإضاءة ⚡ |
من خلال تخزين الصور الافتراضية ، فإن Binlex قادر على أداء سرعات أفضل ، مما يجعل التكرار يعمل بشكل أسرع وأكثر كفاءة.
لبناء binlex تحتاج الصدأ.
التثبيت مستقيم على Linux و 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 لإنشاء حزم لمختلف الأنظمة الأساسية ، استخدم Makefile .
make zst # Make Arch Linux Package
make deb # Make Debian Package
make wheel # Make Python Wheel ستكون الحزم الناتجة في target/ الدليل.
من السهل تثبيت تثبيت المكون الإضافي لـ IDA ، فقط تأكد من تثبيت روابط Python في بيئة Python لـ IDA.
الآن انسخ الدليل للمكون الإضافي Binlex إلى دليل البرنامج المساعد الخاص بك.
mkdir -p ~ /.idapro/plugins/
cp -r scripts/plugins/ida/binlex/ ~ /.idapro/plugins/بمجرد فتح IDA ، يجب أن يتم الترحيب بك برسالة الترحيب Binlex .

باستخدام المكون الإضافي IDA ، لديك العديد من الميزات التي يتم توفيرها لمساعدتك في كتابة قواعد Yara وتحليل التشابه.
القائمة الرئيسية:
قائمة سياق Disassembler:
يهدف نمط النسخ وميزة نسخ HEX إلى المساعدة في قواعد YARA ونسخ تجزئة التشابه والمسح الضوئي للبحث عن بيانات مماثلة.
لمقارنة قاعدة بيانات واحدة مقابل آخر ، استخدم ميزة التصدير لتصدير ملف JSON ، ثم انقر فوق Compare Functions ، والتي ستملأ جدولًا بمجرد اكتماله.
cargo docيمكنك أيضا فتح المستندات.
cargo doc --openفي Binlex ، يتم استخدام التسلسل الهرمي للمصطلحات المستوحاة من الوراثة لوصف وترمز بنية وسمات الكود الثنائي. تعكس هذه المصطلحات العلاقات بين التجريدات المختلفة والتشبيهات الوراثية:
الجينوم : يمثل كل كائن يتم تحليله ، مثل وظيفة أو كتلة. يلف جميع المعلومات ، بما في ذلك البيانات الوصفية والكروموسومات والسمات الأخرى.
الكروموسوم : يمثل الأنماط الأساسية أو التسلسلات المستخرجة من كتلة أو وظيفة. يعمل الكروموسوم كمخطط لتحديد الخصائص الرئيسية للثنائي دون معالجة الذاكرة كما هو موضح في أحرف البرية مثل ? ، حيث تمثل بطاقة البرية الواحدة جينًا واحدًا.
أليليليلير : وحدة داخل الكروموسوم تتكون من جينين . أزواج الأليل هي لبنات البناء للكروموسوم ، حيث تجمع بين الجينات في أزواج ذات معنى.
الجين : أصغر وحدة من المعلومات الوراثية ، التي تمثل حلقة واحدة من البيانات (نصف بايت).
يمكن تصور العلاقة بين هذه التجريدات على النحو التالي:
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 "
}
]
}بالنظر إلى مثال جينوم json.
"4c8b47??498bc0""4c" أو "8b""4" أو "c"باستخدام API Binlex ، من الممكن تحوير هذه الكروموسومات ، وأزواج أليلهم وجيناتها لتسهيل البرمجة الوراثية.
يمكن أن تحتوي البرمجة الوراثية في هذا السياق على العديد من الحالات بما في ذلك على سبيل المثال لا الحصر:
أبسط طريقة للبدء هي مع سطر الأوامر ، والاستفادة من أداة تصفية JSON مثل jq .
يقوم الأمر التالي بفك sample.dll مع 16 مؤشر ترابط ، والسمات ذات الصلة هي كائنات JSON ، وواحدة لكل سطر ويتم الأنابيب في jq للتصفية والتجميل.
لمعرفة الخيارات المتوفرة عند استخدام سطر الأوامر Binlex -h أو --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: @c3rb3ru5d3d53cيتم توفير مثال بسيط لاستخدام سطر الأوامر أدناه.
binlex -i sample.dll --threads 16 | jq يرجى ملاحظة أن Binlex ستكتشف تنسيق الملف Fort You ويدعم حاليًا تنسيقات PE و ELF و MACHO .
عند تنفيذك الأول لـ Binlex ، سيقوم بتخزين ملف التكوين في دليل التكوين الخاص بك في binlex/binlex.toml .
يجد Binlex هذا دليل التكوين الافتراضي استنادًا إلى نظام التشغيل الخاص بك كما هو موضح في الجدول أدناه لتكوينه.
| نظام التشغيل | متغير البيئة | مثال مسار تكوين binlex |
|---|---|---|
| Linux | $XDG_CONFIG_HOME أو $HOME/.config | /home/alice/.config/binlex/binlex.toml |
| ماكوس | $HOME/Library/Application Support | /Users/Alice/Library/Application Support/binlex/binlex.toml |
| النوافذ | {FOLDERID_RoamingAppData} | C:UsersAliceAppDataRoamingbinlexbinlex.toml |
تم توفير اسم التكوين الافتراضي binlex.toml لـ binlex أدناه.
[ 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 = trueإذا لم تكن خيارات سطر الأوامر كافية ، فإن ملف التكوين يوفر عنصر تحكم محبب لجميع الخيارات.
إذا كنت ترغب في تجاوز ملف التكوين الافتراضي وتحديد ملف تكوين آخر ، فاستخدم معلمة سطر الأوامر.
binlex -c config.toml -i sample.dllعند تشغيل Binlex ، فإنه يستخدم ملف التكوين ويتجاوز أي إعدادات عند استخدام معلمة سطر الأوامر المعنية.
فيما يلي سير عمل عام يبدأ في صنع قواعد Yara ، حيث نحصل على 10 سلاسل فريدة من نوعها من Yara Hex من عينة معينة.
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 ???? لاتخاذ هذه الخطوة إلى الأمام ، يمكنك تشغيلها من خلال أداة blyara لتوقيع Yara السريع.
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 للحصول على نتائج أفضل إذا قمت بتصدير الجينومات باستخدام المكون الإضافي Binlex IDA أو بوسائل أخرى ، يمكنك تصفية بادئات بدء الوظيفة مثل mw:: ، للبرامج malware ، وهو أمر شائع جدًا.
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 لاستخدام Binlex مع Ghidra ، استخدم Script blghidra/blghidra.py في دليل البرامج النصية.
للاستفادة من أسماء الوظائف والعناوين الافتراضية من مشاريع Ghidra الخاصة بك وتزويدها بـ Binlex ، استخدم البرنامج النصي analyzeHeadless في دليل تثبيت Ghidra الخاص بك.
./analyzeHeadless
< project-directory >
< project-name >
-process sample.dll
-noanalysis
-postscript blghidra.py 2> /dev/null | grep -P " ^{ " type " | binlex -i sample.dll يرجى ملاحظة أن تحليل رسائل سجل المطبوعات analyzeHeadless إلى stdout وإخراج السجل الأخرى إلى stderr لا فائدة من التشغيل البيني مع أدوات سطر الأوامر الأخرى.
على هذا النحو ، لجمع إخراج البرنامج النصي ، يجب ترشيحه باستخدام 2>/dev/null | grep -P "^{"type" .
للاستفادة من قوة الكشف عن وظائف RIZIN وتسمية الوظيفة في Binlex ، قم بتشغيل rizin على مشروعك باستخدام aflj لسرد الوظائف بتنسيق JSON.
ثم قم بتنشيط هذا الإخراج إلى blrizin ، الذي يحلل rizin Json إلى تنسيق binlex undestands.
بالإضافة إلى ذلك ، يمكنك الجمع بين هذا مع أدوات أخرى مثل blpdb لتحليل رموز PDB للحصول على عناوين الوظائف والأسماء.
يمكنك بعد ذلك القيام بأي تحليل كما تفعل عمومًا باستخدام jq ، في هذا المثال ، نحسب الوظائف التي تتم معالجتها بواسطة Binlex لمعرفة ما إذا كنا نكتشف المزيد منها.
rizin -c ' aaa;aflj; ' -q sample.dll |
blrizin |
blpdb -i sample.pdb |
binlex -i sample.dll |
jq ' select(.type == "function") | .address ' | wc -l ملاحظة : في هذا الوقت ، يكون blrizin متوافقًا أيضًا مع الإخراج من radare2 باستخدام blrizin .
إذا كنت ترغب في القيام ببعض التعلم الآلي ، فيمكنك الحصول على ميزات تمثل nibbles دون معالجة ذاكرة من Binlex مثل هذا.
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] إذا كنت ترغب في تحسين هذا لنموذج التعلم الآلي عن طريق تطبيعها بين 0 و 1 قيم تعويم Binlex التي قمت بتغطيتها بأداة 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]للاستفادة من الميزة القوية المتمثلة في تقليل استخدام الذاكرة ولكن لا يزال بينيفيت من الصور الافتراضية.
# 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 يمكن أن يقوم هذا بإعداد هذا على القرص أو إذا تم تعيين /tmp/ الدليل إلى ذاكرة الوصول العشوائي.
عند تعيينه إلى ذاكرة الوصول العشوائي ، نستفيد من تفكيك الصور الافتراضية ولكن بدون عقوبة RAM إضافية حيث تكون المهام المتكررة مضاعفة تقريبًا في سرعة المعالجة.
نظرًا لأن btrfs يمتد الوصول إلى الملف المعين في kernel ، فنحن قادرون على الوصول إليه كما نفعل أي ملف تم تعيينه ولكن مع الاستفادة من الضغط.
لتوفير الوقت لنفسك إذا اخترت هذا الخيار ، اجعل تصاعد تجمع btrfs يحدث عند التمهيد وقم بتعيين ملف تكوين Binlex لتفضيل التخزين المؤقت للصور الافتراضية في دليل التجمع المثبت. يضمن هذا النهج أنك لا تحتاج إلى الاعتماد على معلمات سطر الأوامر في كل مرة.
يركز Philophsy of the Binlex على الأمن والبساطة والسرعة وقابلية التمديد.
جزء من هذا هو توفير واجهة برمجة تطبيقات للمطورين لكتابة منطق الكشف والصيد الخاص بهم.
في هذا الوقت ، يوفر Binlex روابط الصدأ والثعبان.
الصدأ ، API يجعل من السهل البدء
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 الآن لتجريد Disassembler و Controlflow الرسم البياني.
لتفكيك صورة ذاكرة PE المعينة ، استخدم الأمثلة التالية.
هناك المزيد من الأمثلة في examples/python/ الدليل.
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 )في بعض الأحيان ، ربما يكون من غير ذلك تحليل الرسم البياني لتدفق التحكم الذي تم إنشاؤه.
في هذه الحالة ، يمكنك استخدام التقنية التالية.
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 ()بدلاً من التحليل ، يمكنك الوصول إلى التعليمات والكتل والوظائف بشكل مباشر أكثر.
for instruction in cfg . instructions ():
instruction . print ()
for block in cfg . blocks ():
block . print ()
for function in cfg . functions ():
function . print ()من الممكن أيضًا التكرار من الوظائف إلى الكتل ، إلى التعليمات ، إلى أزواج الأليل ، إلى الجينات.
هذا يمثل الانتقال من أعلى مستوى التجريد إلى أدنى تجريد.
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 )واحدة من أقوى الأدوات التي يمكنك استخدامها في Binlex هي مقارنة الوظائف والكتل والتعليمات باستخدام Hashing التشابه.
لإجراء هذه المقارنات بسيطة مثل استدعاء طريقة 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 ()سيتم حساب أي خوارزميات تجزئة التشابه المدعومة إذا تم تمكينها مع التكوين الخاص بك.
على الرغم من أنه يمكن أن يكون تحديًا ، إلا أن Binlex يدعم إجراء تحليل التشابه على الوظائف غير المتجددة باستخدام خوارزمية خاصة به للعثور على أفضل تطابقات التشابه.
يجب أن يكون ما لا يقل عن 75 ٪ أو أكثر من بيانات الوظيفة غير المجردة قابلة للتجزئة لإعطاء تجزئة التشابه.
كل تعليمات أو كتلة أو وظيفة أو جينوم لها كروموسوم مرتبط يمكن الوصول إليه عبر API.
يمكنك متابعة هذه التجريدات وصولاً إلى أزواج الأليل ، وجيناتها.
# 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 ()إذا كنت تتطلع إلى أداء مهام البرمجة الوراثية ، فيمكنك أيضًا تحوير الكروموسومات والألامين والجينات وتتابع عدد الطفرات الخاصة بها.
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 ()هذا يسهل الطفرات مع الخوارزميات الوراثية التي قد توظفها لاستخدامها.
إذا كنت تستخدم Binlex في منشور مجلة ، أو في نموذج AI مفتوح المصدر ، استخدم الاقتباس التالي.
@misc { binlex ,
author = { c3rb3ru5d3d53c } ,
title = { binlex: A Binary Genetic Trait Lexer Framework } ,
year = { 2024 } ,
note = { Available at url{https://github.com/c3rb3ru5d3d53c/binlex-rs} }
}إذا كان استخدام Binlex مخصصًا للأغراض الشخصية أو الشخصية أو لإنشاء مخرجات غير نماذج منظمة العفو الدولية مفتوحة المصدر ، فلن تكون هناك حاجة إلى استشهاد.
على سبيل المثال ، إذا كنت تستخدم Binlex لإنشاء قواعد Yara ، فلن تكون هناك حاجة إلى استشهاد.
هذا يضمن أن يبقى Binlex ذا صلة ولكنه يضمن أيضًا الاستخدام المتساوي للشركات والشخصية.