Skip to content
psobf exploit

psobf exploit

Sploitus September 9, 2026

هدفه هو تحويل الكود لإعاقة التحليل والتوقيعات الثابتة، مفيد في المختبرات وفي مهام Red Team/Pentesting المصرح بها.

يدعم 6 مستويات من التعتيم بالإضافة إلى بنية التحويلات/الأنابيب التي تسمح بتراكم تقنيات مثل ترقيم السلاسل النصية، تشفير بسيط للثوابت الحرفية، إخفاء الأرقام، تشويه المعرفات، "الارتعاش" في التنسيق، تحسينات تجميلية لتدفق التحكم، إدخال كود ميت، ملفات تعريف التجزئة، وملفات تعريف حتمية.

⚠️ الاستخدام المسؤول: هذه الأداة مخصصة للبحث والاختبار المصرح به فقط. **لا** تستخدم لأغراض ضارة.```powershell

██████╗ ███████╗ ██████╗ ██████╗ ███████╗

██╔══██╗██╔════╝██╔═══██╗██╔══██╗██╔════╝

Usage: psobf -i -o -level [options]

Obfuscation Levels: 1 - Char join encoding 2 - Base64 encoding 3 - Base64 encoding (alternate) 4 - GZip + Base64 compression 5 - Script fragmentation 6 - AES-256 CTR encryption (NEW in 2.0.0)

Transform Pipeline Options (use with -pipeline): iden - Identifier morphing (use with -iden obf) strenc - String encryption (use with -strenc xor|rc4) stringdict - String tokenization (use with -stringdict N) numenc - Number encoding fmt - Format jitter (use with -fmt jitter) cf - Control flow obfuscation (use with -cf-opaque, -cf-shuffle) dead - Dead code injection (use with -deadcode N) hexenc - Hex string encoding (NEW) alias - Cmdlet alias substitution (NEW) unicode - Unicode character encoding (NEW) antidebug - Anti-debugging/VM detection (NEW) iexobf - Invoke-Expression obfuscation (NEW)

psobf -i script.ps1 -o out.ps1 -level 6 -profile heavy

psobf -i script.ps1 -o out.ps1 -level 4 -pipeline "iden,alias,hexenc,antidebug,iexobf" -iden obf

psobf -i script.ps1 -o out.ps1 -level 4 -pipeline "strenc" -strenc rc4 -strkey 0011223344556677

go install github.com/TaurusOmar/psobf/v2/cmd/[email protected]

psobf -i input.ps1 -o out.ps1 -level 1..6 [options] psobf -h # full help

go install github.com/TaurusOmar/psobf/cmd/[email protected]

psobf -i input.ps1 -o out.ps1 -level 1..6 [options] psobf -h # full help

| Flag | Type / Values | Default | Description | Example | | |

| ------------- | ----------------- | ---------------: | ------------------------------------------- | ------------------------------------------------------------ | ------------------------------- | ---------------------- |

| `-i` | string | — | إدخال PS1 (استخدم `-stdin` للقراءة من الأنبوب) | `-i script.ps1` | | |

| `-o` | string | `obfuscated.ps1` | إخراج (استخدم `-stdout` للكتابة إلى STDOUT) | `-o out.ps1` | | |

| `-level` | 1..6 | 1 | الحزمة النهائية (انظر المستويات) | `-level 4` | | |

| `-noexec` | bool | false | إصدار الحمولة فقط (بدون `Invoke-Expression`) | `-noexec` | | |

| `-stdin` | bool | false | قراءة PS من STDIN | `-stdin` | | |

| `-stdout` | bool | false | كتابة النتيجة إلى STDOUT | `-stdout` | | |

| `-seed` | int64 | random | عشوائية قابلة للتكرار | `-seed 42` | | |

| `-q` | bool | false | هادئ (بدون شعار) | `-q` | | |

| `-pipeline` | csv | — | التحويلات المطلوب تطبيقها بالترتيب | `-pipeline "iden,strenc,stringdict,numenc,fmt,cf,dead,frag"` | | |

| `-iden` | `keep`/`obf` | `keep` | تحوير المعرفات (المتغيرات والدوال) | `-iden obf` | | |

| `-strenc` | `off`/`xor`/`rc4` | `off` | تشفير النصوص الحرفية | `-strenc rc4` | | |

| `-strkey` | hex | — | مفتاح لـ `-strenc` | `-strkey 0011223344556677` | | |

| `-stringdict` | 0..100 | 0 | رمزية السلاسل الطويلة؛ نسبة مئوية لكل حرفية | `-stringdict 40` | | |

| `-numenc` | bool | false | ترميز الأعداد كتعبيرات PS حسابية | `-numenc` | | |

| `-fmt` | `off`/`jitter` | `off` | عشوائية المسافات البيضاء/فواصل الأسطر | `-fmt jitter` | | |

| `-cf-opaque` | bool | false | تغليف في `if(1 -eq 1){...}` | `-cf-opaque` | | |

| `-cf-shuffle` | bool | false | إعادة ترتيب **كتل الدوال** | `-cf-shuffle` | | |

| `-deadcode` | 0..100 | 0 | احتمالية إدخال كود ميت | `-deadcode 20` | | |

| `-frag` | \`profile=tight | medium | loose\` | — | ملف تعريف التجزئة (المستوى 5) | `-frag profile=medium` |

| `-minfrag` | int | 10 | الحد الأدنى لحجم الشظية (المستوى 5) | `-minfrag 8` | | |

| `-maxfrag` | int | 20 | الحد الأقصى لحجم الشظية (المستوى 5) | `-maxfrag 16` | | |

| `-profile` | \`light | balanced | heavy\` | — | إعدادات مسبقة للـ pipeline/seed/إلخ. | `-profile heavy` |

| `-fuzz` | int | 0 | إنتاج N متغير (بذور مختلفة) | `-fuzz 5` | | |

| `-poly` | int | 0 | متغيرات متعددة الأشكال لكل تحويل | `-poly 3` | | |

> يتم تشغيل **pipeline** **قبل** التعبئة النهائية **`-level`**.

للحفاظ على الأمثلة غير ضارة، سنستخدم:```powershell

function Greet($name) { Write-Host ("Hi, " + $name) }

## مستويات التعتيم (1–6) + مقتطفات المخرجات

> ما يلي يوضح **شكل** المخرجات (مقتطفات). ستختلف الحمولات الفعلية.

$obfuscated = $([char[]](87,114,105,116,101,45,72,111,115,116,32,34,72,101,108,108,111,44,32,87,111,114,108,100,33,34,10,36,97,110,115,119,101,114,32,61,32,52,50,10,102,117,110,99,116,105,111,110,32,71,114,101,101,116,40,36,110,97,109,101,41,32,123,32,87,114,105,116,101,45,72,111,115,116,32,40,34,72,105,44,32,34,32,43,32,36,110,97,109,101,41,32,125,10,71,114,101,101,116,32,34,65,100,97,34,10) -join ''); Invoke-Expression $obfuscated

$obfuscated = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('V3JpdGUtSG9zdCAiSGVsbG8sIFdvcmxkISIKJGFuc3dlciA9IDQyCmZ1bmN0aW9uIEdyZWV0KCRuYW1lKSB7IFdyaXRlLUhvc3QgKCJIaSwgIiArICRuYW1lKSB9CkdyZWV0ICJBZGEiCg==')); Invoke-Expression $obfuscated

$e = [Convert]::FromBase64String('V3JpdGUtSG9zdCAiSGVsbG8sIFdvcmxkISIKJGFuc3dlciA9IDQyCmZ1bmN0aW9uIEdyZWV0KCRuYW1lKSB7IFdyaXRlLUhvc3QgKCJIaSwgIiArICRuYW1lKSB9CkdyZWV0ICJBZGEiCg=='); $obfuscated = [Text.Encoding]::UTF8.GetString($e); Invoke-Expression $obfuscated

$compressed = 'H4sIAAAAAAAA/wovyixJ1fXILy5RUPJIzcnJ11EIzy/KSVFU4lJJzCsuTy1SsFUwMeJKK81LLsnMz1NwL0pNLdFQyUvMTdVUqFZA0q+h5JGpo6CkoK0Ala3lAitWUHJMSVTiAgQAAP//m+Ey2GoAAAA='; $bytes = [Convert]::FromBase64String($compressed); $ms = New-Object IO.MemoryStream(,$bytes); $gz = New-Object IO.Compression.GzipStream($ms,[IO.Compression.CompressionMode]::Decompress); $sr = New-Object IO.StreamReader($gz); $obfuscated = $sr.ReadToEnd(); Invoke-Expression $obfuscated

$fragments = @('Write-Host "Hello',', World!"

function G','reet($name)',' { Write-Ho','st ("Hi, " ','+ $name) }

'); $script = $fragments -join ''; Invoke-Expression $script

$k=[Convert]::FromBase64String('...base64key...');$iv=[Convert]::FromBase64String('...base64iv...');$e=[Convert]::FromBase64String('...base64ciphertext...');$a=New-Object Security.Cryptography.AesManaged;$a.Key=$k;$a.IV=$iv;$d=$a.CreateDecryptor();$bytes=$d.TransformFinalBlock($e,0,$e.Length);$dec=[Text.Encoding]::UTF8.GetString($bytes);Invoke-Expression $dec

## التحويلات (خط الأنابيب) — التفاصيل والأمثلة

> استخدم `-noexec` لفحص الحمولات دون تنفيذ.

* يعيد تسمية المتغيرات و**الدوال** مع الحفاظ على الدلالات.

* احم أي شيء لا تريد إعادة تسميته باستخدام البادئة `__$`.

**الأمر** ```bash psobf -i sample.ps1 -o out.ps1 -level 4 -pipeline "iden" -iden obf -seed 11

function QhZy($Chx){ Write-Host ("Hi, " + $Chx) }

### تشفير السلاسل النصية (`-strenc xor|rc4`)

يقوم بتشفير **النصوص الحرفية فقط** (لا تغيير في واجهة برمجة التطبيقات). يتم فك التشفير في الوقت الفعلي أثناء التشغيل. العلامات: -strenc xor|rc4, -strkey .

**الأمر** ```bash psobf -i sample.ps1 -o out.ps1 -level 4 -pipeline "strenc" -strenc xor -strkey a1b2c3d4 -seed 42

$b=[Convert]::FromBase64String('EwAB...'); for($i=0;$i -lt $b.Length;$i++){$b[$i]=$b[$i] -bxor 0xA1}; [Text.Encoding]::UTF8.GetString($b)

**الأمر** ```bash psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "strenc" -strenc rc4 -strkey 0011223344556677 -seed 7

function __decGWREVT($k,[byte[]]$d){ $s=0..255; $j=0; for($i=0;$i -lt 256;$i++){ $j=($j+$s[$i]+$k[$i%$k.Length])%256; $t=$s[$i];$s[$i]=$s[$j];$s[$j]=$t } $i=0;$j=0; for($x=0;$x -lt $d.Length;$x++){ $i=($i+1)%256;$j=($j+$s[$i])%256; $t=$s[$i];$s[$i]=$s[$j];$s[$j]=$t; $d[$x]=$d[$x] -bxor $s[($s[$i]+$s[$j])%256] } [Text.Encoding]::UTF8.GetString($d) }

( __decGWREVT ([byte[]](0..(8-1)|%{[Convert]::ToByte('0011223344556677'.Substring($_*2,2),16)})) ([Convert]::FromBase64String('m7m7...')) )

يُقسم السلاسل الطويلة إلى مصفوفة `$D` ويعيد بنائها في وقت التشغيل. يقلل من التواقيع المتكررة. العلم: -stringdict

**الأمر** ```bash psobf -i sample.ps1 -o out.ps1 -level 3 -pipeline "stringdict" -stringdict 40 -seed 1

$D=@('Hello',', World','!','Hi, ', 'Ada');

function Greet($name){ Write-Host ($D[3] + $name) }

يستبدل الأرقام العادية بتعبيرات حسابية/بتية مكافئة (خارج السلاسل النصية).

**الأمر** ```bash psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "numenc" -numenc -seed 1337

تحذير: يجب أن تبقى عمليات إعادة التوجيه مثل `2>&1` متطابقة تمامًا. إذا كان مصدرك يحتوي على عمليات إعادة توجيه غير مقتبسة وتواجه مشكلات، فقم بتعطيل `-numenc` أو قم بتضمين تلك العمليات في سلاسل نصية داخل المصدر.

يُحدث تباينًا عشوائيًا في المسافات والأسطر الجديدة.

**الأمر** ```bash psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "fmt" -fmt jitter -seed 20

function Greet($name) { Write-Host ("Hi, "+$name) }

### التحكم في التدفق (`-cf-opaque`, `-cf-shuffle`)

* `-cf-opaque`: يقوم بتغليف النص البرمجي بأكمله في فرع لا يكون أبدًا خاطئًا.

* `-cf-shuffle`: يعيد ترتيب **كتل الدوال** (وليس العبارات الفردية). ستلاحظ التغييرات فقط إذا كان نصك البرمجي يعرّف دوال.

pyobfuscator -i input.py -o output.py -cf-opaque -cf-shuffle

psobf -i sample.ps1 -o out.ps1 -level 4 -pipeline "cf" -cf-opaque -cf-shuffle -seed 77

**المخرجات (مقتطف)** ```powershell if(1 -eq 1){ function Greet($name){ Write-Host ("Hi, " + $name) } Write-Host "Hello, World!" $answer = 42 Greet "Ada" }

يقوم بحقن دوال لا تفعل شيئًا، حلقات بعدد تكرارات صفرية، سلاسل غير ضارة، إلخ. يتم التحكم فيها بواسطة الاحتمالية.

العلم: `-deadcode ` (احتمالية حقن المقتطف).

psobf -i sample.ps1 -o out.ps1 -level 4 -pipeline "dead" -deadcode 25 -seed 5

**المخرجات (مقتطف)** ```powershell function __dummyzQJxJk { return } for($i=0;$i -lt 0;$i++){Start-Sleep -Milliseconds 0} $x='canary';$y=$x+$x|Out-Null Write-Host "Hello, World!" ...

### التجزئة (`-frag`, `-minfrag`, `-maxfrag`)

يؤثر فقط على **المستوى 5** (تجزئة السلسلة + الانضمام أثناء التشغيل).

* `profile=medium` → أجزاء متوسطة (≈10–18)

* **أو** ضبط باستخدام `-minfrag` / `-maxfrag`.

psobf -i sample.ps1 -o out.ps1 -level 5 -frag profile=loose -seed 9

psobf -i sample.ps1 -o out.ps1 -level 5 -minfrag 8 -maxfrag 16 -seed 9

**مخرجات (مقتطف)** ```powershell $fragments=@('Write-Host "Hello,',' World!"',"`n", '$answer = 42',"`n",'function Greet($','name){ Write-Host ("Hi, "+$name)}',"`n",'Greet "Ada"'); $script=$fragments -join ''; Invoke-Expression $script

يقوم بترميز النصوص الحرفية إلى سداسي عشري.```bash

psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "hexenc" -seed 42

**الإخراج (مقتطف):** ```powershell [Text.Encoding]:

يستبدل أوامر PowerShell الداخلية بأسمائها المستعارة القصيرة.```bash

psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "alias" -seed 42

تحول أحرف السلسلة إلى تنسيق `[char]0xNNNN`.```bash

psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "unicode" -seed 42

**المخرجات (مقتطف):** ```powershell "H[char]0x0065[char]0x006C[char]0x006Co"

يحقن مقتطفات كشف البيئة المعزولة/الجهاز الافتراضي/المصحح.```bash

psobf -i sample.ps1 -o out.ps1 -level 4 -pipeline "antidebug" -seed 42

**المخرجات (مقتطف):** ```powershell if($env:COMPUTERNAME -match '^(SANDBOX|MALWARE|VIRUS)'){ exit } if((Get-WmiObject Win32_ComputerSystem).Model -match '^(VirtualBox|VMware)'){ exit }

يستبدل `Invoke-Expression` بأشكال بديلة.```bash

psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "iexobf" -seed 42

. $code # instead of Invoke-Expression $code

الإعدادات المسبقة هي نقاط بداية ملائمة. أي علامة صريحة تمررها **تتجاوز** الإعداد المسبق. أي علامة تمررها بشكل صريح تأخذ الأولوية على الملف الشخصي.

* **متوازن** ``` -pipeline "iden,strenc,stringdict,numenc,fmt,cf,dead,frag" -strenc xor -strkey a1b2c3d4 -stringdict 30 -deadcode 10 -fmt jitter -frag profile=medium -seed 424242

* **ثقيل** ``` -pipeline "iden,strenc,stringdict,numenc,fmt,cf,dead,frag" -strenc rc4 -strkey 00112233445566778899aabbccddeeff -stringdict 50 -deadcode 25 -fmt jitter -frag profile=loose -seed 987654321

## البذور، قابلية التكرار، والاختبار العشوائي

* بدون `-seed` → عشوائية معتمدة على بذور تشفيرية.

* `-fuzz N` → إنتاج **N** من المتغيرات (`out.ps1.v1.ps1`، `out.ps1.v2.ps1`، …)، ممتاز لاختبار التنوع.

**مثال** ```bash psobf -i sample.ps1 -o out.ps1 -level 4 -profile heavy -fuzz 3

cat sample.ps1 | psobf -stdin -stdout -level 2 > out.ps1

* **التدقيق فقط (لا يوجد غلاف تنفيذ)** ```bash psobf -i sample.ps1 -o payload.txt -level 4 -noexec

# payload.txt contains just the artifact (e.g., base64/gzip) without Invoke-Expression

> الهدف هو **تنويع** القطع الأثرية وتقليل التوقيعات المستقرة من أجل **البحث** في البيئات المصرح بها.

1. **التعبئة الكثيفة + التشفير الحرفي** ```bash psobf -i sample.ps1 -o out.ps1 -level 4

-pipeline "iden,strenc,stringdict" -iden obf -strenc rc4 -strkey 0011223344556677 -stringdict 40

2. **التنوع الأقصى (التنسيق + التجزئة + الكود الميت)**```bash

psobf -i sample.ps1 -o out.ps1 -level 5 \

-pipeline "fmt,frag,dead" -fmt jitter -frag profile=loose -deadcode 15 \

3. **بناء متوازن متوافق مع CI** ```bash psobf -i sample.ps1 -o out.ps1 -level 3 -profile balanced -seed 777

4. **تقليل IOCs الثابتة (أرقام + قاموس)**```bash

psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "numenc,stringdict" -numenc -stringdict 35 -seed 9

5. **RC4 + التجزئة الضيقة (عرض الطبقات المدمجة)** ```bash psobf -i sample.ps1 -o out.ps1 -level 5 -pipeline "strenc,frag" -strenc rc4 -strkey 0011223344556677 -frag profile=tight -seed 44

* قم بتدوير **`-strkey`** و **`-seed`** لكل بناء.

* يُفضل دمج الطبقات: `-strenc` + `-stringdict` + `-fmt jitter` + التجزئة.

* استخدم `-fuzz` لتوليد عائلات من المتغيرات لاختبار الكشف.

* احتفظ بخط أساس نظيف وحميد وتحقق من التكافؤ الوظيفي داخل بيئة الحماية قبل وبعد التحويلات.

* إذا كان السكريبت الخاص بك يعتمد على بناء جملة PS الحساس (مثل إعادة التوجيه)، فاحتفظ بها داخل علامات الاقتباس أو قم بتعطيل `-numenc`.

psobf -i sample.ps1 -o out.ps1 -level 2 -seed 123

psobf -i sample.ps1 -o out.ps1 -level 4 -pipeline "strenc" -strenc rc4 -strkey 0011223344556677

psobf -i sample.ps1 -o out.ps1 -level 3 -pipeline "stringdict,numenc" -stringdict 40 -numenc

-pipeline "iden,strenc,stringdict,numenc,fmt,cf,dead,frag"

-iden obf -strenc xor -strkey a1b2c3d4 -stringdict 35 -numenc

-fmt jitter -cf-opaque -deadcode 15 -frag profile=medium -seed 777

# Level 6 - AES encryption (maximum protection)

psobf -i sample.ps1 -o out.ps1 -level 6 -profile heavy -seed 999

# New transforms - anti-debug + alias + hex

psobf -i sample.ps1 -o out.ps1 -level 4 -pipeline "antidebug,alias,hexenc" -seed 42

-pipeline "iden,alias,hexenc,unicode,antidebug,iexobf,strenc"

-iden obf -strenc rc4 -strkey 0011223344556677 -seed 42

# Inspect artifact only (no Invoke-Expression)

psobf -i sample.ps1 -o payload.txt -level 4 -noexec

هذا المشروع مخصص **للأغراض التعليمية** و**الاختبارات المأذون بها** فقط. أنت المسؤول الوحيد عن استخدامك. لا يتحمل المؤلفون والمساهمون أي مسؤولية عن الأضرار المباشرة أو غير المباشرة.