
مبهم PowerShell
هدفه هو تحويل الكود لإعاقة التحليل والتوقيعات الثابتة، مفيد في المختبرات وفي مهام Red Team/Pentesting المصرح بها.
يدعم 6 مستويات من التعتيم بالإضافة إلى بنية التحويلات/الأنابيب التي تسمح بتراكم تقنيات مثل ترقيم السلاسل النصية، تشفير بسيط للثوابت الحرفية، إخفاء الأرقام، تشويه المعرفات، "الارتعاش" في التنسيق، تحسينات تجميلية لتدفق التحكم، إدخال كود ميت، ملفات تعريف التجزئة، وملفات تعريف حتمية.
⚠️ الاستخدام المسؤول: هذه الأداة مخصصة للبحث والاختبار المصرح به فقط. لا تستخدم لأغراض ضارة.```powershell
./psobf -h
██████╗ ███████╗ ██████╗ ██████╗ ███████╗
██╔══██╗██╔════╝██╔═══██╗██╔══██╗██╔════╝
██████╔╝███████╗██║ ██║██████╔╝█████╗
██╔═══╝ ╚════██║██║ ██║██╔══██╗██╔══╝
██║ ███████║╚██████╔╝██████╔╝██║
╚═╝ ╚══════╝ ╚═════╝ ╚═════╝ ╚═╝
Omar Salazar
v.2.0.0
Usage: psobf -i -o -level <1|2|3|4|5|6> [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)
Examples:
psobf -i script.ps1 -o out.ps1 -level 2
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
## الميزات
<h1 align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6598/11956ab9f65e8dc1b0460652042c601f70d28bb67e9fd6f0a89813ed5369997f.gif" alt="psobf" width="700px"></a>
<br>
</h1>
<h1 align="center">
<img src="https://raw.githubusercontent.com/taurusomar/psobf/HEAD/static/poc2.gif" alt="psobf" width="700px"></a>
<br>
</h1>
---
## التثبيت```bash
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
## الميزات
<h1 align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6598/11956ab9f65e8dc1b0460652042c601f70d28bb67e9fd6f0a89813ed5369997f.gif" alt="psobf" width="700px"></a>
<br>
</h1>
<h1 align="center">
<img src="https://raw.githubusercontent.com/taurusomar/psobf/HEAD/static/poc2.gif" alt="psobf" width="700px"></a>
<br>
</h1>
---
## التثبيت```bash
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
Write-Host "Hello, World!"
$answer = 42
function Greet($name) { Write-Host ("Hi, " + $name) }
Greet "Ada"
ما يلي يوضح شكل المخرجات (مقتطفات). ستختلف الحمولات الفعلية.
psobf -i sample.ps1 -o out.ps1 -level 1
**الإخراج (مقتطف):**```powershell
$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
psobf -i sample.ps1 -o out.ps1 -level 2
**المخرجات (مقتطف):**```powershell
$obfuscated = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('V3JpdGUtSG9zdCAiSGVsbG8sIFdvcmxkISIKJGFuc3dlciA9IDQyCmZ1bmN0aW9uIEdyZWV0KCRuYW1lKSB7IFdyaXRlLUhvc3QgKCJIaSwgIiArICRuYW1lKSB9CkdyZWV0ICJBZGEiCg==')); Invoke-Expression $obfuscated
psobf -i sample.ps1 -o out.ps1 -level 3
**المخرجات (مقتطف):**```powershell
$e = [Convert]::FromBase64String('V3JpdGUtSG9zdCAiSGVsbG8sIFdvcmxkISIKJGFuc3dlciA9IDQyCmZ1bmN0aW9uIEdyZWV0KCRuYW1lKSB7IFdyaXRlLUhvc3QgKCJIaSwgIiArICRuYW1lKSB9CkdyZWV0ICJBZGEiCg=='); $obfuscated = [Text.Encoding]::UTF8.GetString($e); Invoke-Expression $obfuscated
psobf -i sample.ps1 -o out.ps1 -level 4
**المخرجات (مقتطف):**```powershell
$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
psobf -i sample.ps1 -o out.ps1 -level 5
**المخرجات (مقتطف):**```powershell
$fragments = @('Write-Host "Hello',', World!"
$','answer = 42','
function G','reet($name)',' { Write-Ho','st ("Hi, " ','+ $name) }
','Greet "Ada"','
'); $script = $fragments -join ''; Invoke-Expression $script
psobf -i sample.ps1 -o out.ps1 -level 6
**مخرجات (مقتطف):**```powershell
$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لفحص الحمولات دون تنفيذ.
-iden)__$.الأمر```bash psobf -i sample.ps1 -o out.ps1 -level 4 -pipeline "iden" -iden obf -seed 11
**المخرجات (مقتطف)**```powershell
$WguE = 42
function QhZy($Chx){ Write-Host ("Hi, " + $Chx) }
QhZy "Ada"
-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
**المخرجات (مقتطف)**```powershell
$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
**المخرجات (مقتطف)**```powershell
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...')) )
-stringdict)يُقسم السلاسل الطويلة إلى مصفوفة $D ويعيد بنائها في وقت التشغيل. يقلل من التواقيع المتكررة.
العلم: -stringdict <0..100>
الأمر```bash psobf -i sample.ps1 -o out.ps1 -level 3 -pipeline "stringdict" -stringdict 40 -seed 1
**المخرجات (مقتطف)**```powershell
$D=@('Hello',', World','!','Hi, ', 'Ada');
Write-Host ($D[0]+$D[1]+$D[2])
function Greet($name){ Write-Host ($D[3] + $name) }
Greet $D[4]
-numenc)يستبدل الأرقام العادية بتعبيرات حسابية/بتية مكافئة (خارج السلاسل النصية).
الأمر```bash psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "numenc" -numenc -seed 1337
**المخرجات (مقتطف)**```powershell
$answer = ((0x2A -bxor 0x00)+0)
تحذير: يجب أن تبقى عمليات إعادة التوجيه مثل 2>&1 متطابقة تمامًا. إذا كان مصدرك يحتوي على عمليات إعادة توجيه غير مقتبسة وتواجه مشكلات، فقم بتعطيل -numenc أو قم بتضمين تلك العمليات في سلاسل نصية داخل المصدر.
-fmt)يُحدث تباينًا عشوائيًا في المسافات والأسطر الجديدة.
الأمر```bash psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "fmt" -fmt jitter -seed 20
**المخرجات (مقتطف)**```powershell
Write-Host "Hello, World!"
$answer=42
function Greet($name) { Write-Host ("Hi, "+$name) }
Greet "Ada"
-cf-opaque, -cf-shuffle)-cf-opaque: يقوم بتغليف النص البرمجي بأكمله في فرع لا يكون أبدًا خاطئًا.-cf-shuffle: يعيد ترتيب كتل الدوال (وليس العبارات الفردية). ستلاحظ التغييرات فقط إذا كان نصك البرمجي يعرّف دوال.الأمر
if __name__ == "__main__":
# Example: obfuscate a script
pyobfuscator -i input.py -o output.py -cf-opaque -cf-shuffle
``````bash
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`)
يقوم بحقن دوال لا تفعل شيئًا، حلقات بعدد تكرارات صفرية، سلاسل غير ضارة، إلخ. يتم التحكم فيها بواسطة الاحتمالية.
العلم: `-deadcode <0..100>` (احتمالية حقن المقتطف).
**الأمر**```bash
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=tight` → أجزاء صغيرة (≈6–10)
* `profile=medium` → أجزاء متوسطة (≈10–18)
* `profile=loose` → أجزاء أكبر (≈14–28)
* **أو** ضبط باستخدام `-minfrag` / `-maxfrag`.
**الأوامر**```bash
# Profile based
psobf -i sample.ps1 -o out.ps1 -level 5 -frag profile=loose -seed 9
# Fine control
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
---
### تحويلات جديدة (v2.0+)
#### ترميز سداسي عشري (`hexenc`)
يقوم بترميز النصوص الحرفية إلى سداسي عشري.```bash
psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "hexenc" -seed 42
الإخراج (مقتطف):```powershell [Text.Encoding]:https://raw.githubusercontent.com/taurusomar/psobf/HEAD/:UTF8.GetString(%5BConvert%5D::FromHexString(%2748656C6C6F%27))
#### استبدال الأسماء المستعارة (`alias`)
يستبدل أوامر PowerShell الداخلية بأسمائها المستعارة القصيرة.```bash
psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "alias" -seed 42
الإخراج (مقتطف):```powershell
#### ترميز Unicode (`unicode`)
تحول أحرف السلسلة إلى تنسيق `[char]0xNNNN`.```bash
psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "unicode" -seed 42
المخرجات (مقتطف):```powershell "H[char]0x0065[char]0x006C[char]0x006Co"
#### مكافحة التصحيح (`antidebug`)
يحقن مقتطفات كشف البيئة المعزولة/الجهاز الافتراضي/المصحح.```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 }
#### إخفاء IEX (`iexobf`)
يستبدل `Invoke-Expression` بأشكال بديلة.```bash
psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "iexobf" -seed 42
الإخراج (مقتطف):```powershell
. $code # instead of Invoke-Expression $code
---
## Profiles (light, balanced, heavy)
الإعدادات المسبقة هي نقاط بداية ملائمة. أي علامة صريحة تمررها **تتجاوز** الإعداد المسبق. أي علامة تمررها بشكل صريح تأخذ الأولوية على الملف الشخصي.
* **light** ```
-pipeline "iden,stringdict,numenc,frag"
-frag profile=tight
-seed 1337
-seed N → مخرجات حتمية لتكوين معين.-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
## STDIN/STDOUT و `-noexec`
* **Pipe in / out** ```bash
cat sample.ps1 | psobf -stdin -stdout -level 2 > out.ps1
الهدف هو تنويع القطع الأثرية وتقليل التوقيعات المستقرة من أجل البحث في البيئات المصرح بها.
2. **التنوع الأقصى (التنسيق + التجزئة + الكود الميت)**```bash
psobf -i sample.ps1 -o out.ps1 -level 5 \
-pipeline "fmt,frag,dead" -fmt jitter -frag profile=loose -deadcode 15 \
-fuzz 5
4. **تقليل IOCs الثابتة (أرقام + قاموس)**```bash
psobf -i sample.ps1 -o out.ps1 -level 2 -pipeline "numenc,stringdict" -numenc -stringdict 35 -seed 9
---
## أفضل الممارسات والملاحظات الدفاعية
* قم بتدوير **`-strkey`** و **`-seed`** لكل بناء.
* يُفضل دمج الطبقات: `-strenc` + `-stringdict` + `-fmt jitter` + التجزئة.
* استخدم `-fuzz` لتوليد عائلات من المتغيرات لاختبار الكشف.
* احتفظ بخط أساس نظيف وحميد وتحقق من التكافؤ الوظيفي داخل بيئة الحماية قبل وبعد التحويلات.
* إذا كان السكريبت الخاص بك يعتمد على بناء جملة PS الحساس (مثل إعادة التوجيه)، فاحتفظ بها داخل علامات الاقتباس أو قم بتعطيل `-numenc`.
---
## مخطط البنية```
┌──────────────┐
│ input.ps1 │
└──────┬───────┘
│ read (-i / -stdin)
▼
┌──────────────┐
│ Pipeline │ order you choose
│ iden │ rename vars/funcs
│ strenc │ XOR/RC4 literals
│ stringdict │ tokenize + rejoin
│ numenc │ numeric masking
│ fmt │ whitespace jitter
│ cf │ opaque/shuffle
│ dead │ harmless noise
└──────┬───────┘
│ mutated script
▼
┌──────────────┐
│ Level 1..5 │ final packing
└──────┬───────┘
│ + Invoke-Expression (unless -noexec)
▼
┌──────────────┐
│ out.ps1 │
└──────────────┘
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
psobf -i sample.ps1 -o out.ps1 -level 5
-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
psobf -i sample.ps1 -o out.ps1 -level 6 -profile heavy -seed 999
psobf -i sample.ps1 -o out.ps1 -level 4 -pipeline "antidebug,alias,hexenc" -seed 42
psobf -i sample.ps1 -o out.ps1 -level 6
-pipeline "iden,alias,hexenc,unicode,antidebug,iexobf,strenc"
-iden obf -strenc rc4 -strkey 0011223344556677 -seed 42
psobf -i sample.ps1 -o payload.txt -level 4 -noexec
---
## قانوني
هذا المشروع مخصص **للأغراض التعليمية** و**الاختبارات المأذون بها** فقط. أنت المسؤول الوحيد عن استخدامك. لا يتحمل المؤلفون والمساهمون أي مسؤولية عن الأضرار المباشرة أو غير المباشرة.