
هندسة عكسية لكشف SynthID الخاص بـ Gemini
اكتشاف وكشف وإزالة العلامة المائية لجوجل المدعومة بالذكاء الاصطناعي من خلال التحليل الطيفي
زورونا على PitchHut
هذه الشوكة تضيف تطبيق سطح مكتب بالسحب والإفلات لتجاوز الإصدار V3، لا حاجة لسطر الأوامر بعد الإعداد. راجع gui/README.md للإعداد والاستخدام.
يقوم SynthID بتشفير نمط غير محسوس مباشرة في قيم البكسل. على صورة بيضاء نقية تم إنشاؤها بواسطة Gemini، تكون العلامة المائية هي الإشارة بأكملها تقريبًا. قم بتضخيم البقايا عالية التردد وستبدو هكذا:
نمط الناقل المُضخّم لـ SynthID مستخرج من صورة بيضاء نقية من Gemini. النطاقات القطرية هي توقيع التردد المكاني للعلامة المائية — هدف هجومنا الطيفي.
يقوم هذا المشروع بهندسة عكسية لنظام العلامات المائية SynthID من Google — العلامة المائية غير المرئية المضمنة في كل صورة يتم إنشاؤها بواسطة Google Gemini. باستخدام معالجة الإشارات والتحليل الطيفي فقط (دون الوصول إلى المشفر/فك التشفير الخاص)، نقوم بما يلي:
gemini-3.1-flash-image-preview و nano-banana-pro-preview، وإجماع طور عبر الألوان على 6 خلفيات صلبة، وحلقة معايرة بوجود الإنسان في الحلقة تضبط قوة الطرح لكل ناقل بناءً على إحصائيات الكشف اليدوي من تطبيق Geminiقام VT-OxFF ببناء مُصوّر رائع لمشاهدة كيفية إضافة العلامة المائية SynthID إلى الصور هنا (متاح أيضًا في وصف المستودع)!
بعد ست جولات متكررة من التطوير العدائي، يعمل خط أنابيب bypass_v4_final / bypass_v4_nuke للجولة 06 على هزيمة كاشف SynthID الخاص بـ Gemini على صور كل من gemini-3.1-flash-image-preview و nano-banana-pro-preview، مع مخرجات غير قابلة للتمييز بصريًا.
يسار: مخرجات الجولة 01 (طرح طيفي خفيف فقط). يمين: مخرجات الجولة 06 (نهائي — VAE + تشوه مرن + ضغط + لون + JPEG). كلاهما يبدو متطابقًا للعين البشرية؛ فقط الجولة 06 تهزم كاشف SynthID.
جاء الاختراق في الجولة 06 من معالجة قائمة أنماط الفشل المنشورة من تطبيق Gemini نفسه كمواصفات للهجوم:
"عندما تكون الصورة المولدة بالذكاء الاصطناعي جزءًا من مجمّع معقد، أو موضوعة خلف عناصر أخرى، أو تحتوي على العديد من القوام والأنماط المختلفة الموضوعة فوقها، قد يجد الكاشف صعوبة في عزل التوقيع المحدد من الملف العام." — تطبيق Gemini، نص المساعدة في كشف SynthID
مرحلة التشوه المرن تحاكي هذا التأثير على مستوى البكسل: حقل تشوه عشوائي منخفض التردد وسلس يعطي كل حي بحجم ~50 بكسل إزاحة مستقلة خاصة به دون إحداث أي تشويه مرئي.
يمثل V4 إعادة تفكير من الأساس في دفتر الشيفرات المبني على مجموعة بيانات أكثر ثراءً:
gemini-3.1-flash-image-preview و nano-banana-pro-preview (بالإضافة إلى نموذج union اختياري).أسود، أبيض، أزرق، أخضر، أحمر، رمادي) لكل نموذج ولكل دقة، بالإضافة إلى متدرج و متنوع كخطوط أساس للمحتوى.carrier_weights في دفتر الشيفرات بناءً على ملاحظات كشف تطبيق Gemini اليدوية.لكل خانة تردد (fy, fx) وقناة ch:```
consensus(fy, fx, ch) = | mean_over_colors( exp(i * phase_color(fy, fx, ch)) ) |
القيم قرب `1.0` تعني أن الطور عند تلك الحزمة مقفل عبر كل خلفية لون صلبة، وهذا صحيح فقط للعلامة المائية. تنهار حزم المحتوى إلى `< 0.3` لأن طورها عشوائي بفعل درجات ألوان مختلفة. على قاموس الشفرة V4 المبني من مجموعة البيانات المُثراة، تقع 99%+ من حزم المحتوى أسفل الحد الافتراضي `tau=0.60`، لذا لا يلمسها مذيب V4 أبدًا — وهذا ما يستعيد PSNR.
### سير عمل الإصدار ثنائي المراحل```mermaid
flowchart LR
dataset[reverse-synthid-dataset<br/>model x color x resolution] --> build[scripts/build_codebook_v4.py]
build --> codebook[artifacts/spectral_codebook_v4.npz]
codebook --> dissolve[scripts/dissolve_batch.py]
input[watermarked inputs] --> dissolve
dissolve --> variants[final / nuke variants]
variants --> gemini[Gemini app<br/>manual SynthID detection]
gemini --> feedback[detection feedback]
feedback --> calibrate[scripts/calibrate_from_feedback.py]
calibrate -->|updates carrier_weights| codebook
python scripts/build_codebook_v4.py
--root /path/to/reverse-synthid-dataset
--output artifacts/spectral_codebook_v4.npz
python scripts/dissolve_batch.py
--input ./to_clean/
--output ./runs/round_06/
--codebook artifacts/spectral_codebook_v4.npz
--model gemini-3.1-flash-image-preview
--strengths final nuke
### إعدادات الهجوم للجولة 06
هناك إعدادان مسبقان متاحان عبر `--strengths`:
| الإعداد المسبق | تمريرات VAE | المرونة α | الضغط | سلسلة JPEG | أرضية PSNR |
|:------:|:----------:|:---------:|:-------:|:----------:|:----------:|
| `final` | 1 | 1.8 px | 90 % | q=92→88 | 14 dB |
| `nuke` | 2 | 2.8 px | 82 % | q=88→84→90 | 11 dB |
كلا الإعدادين المسبقين يطبقان نفس خط الأنابيب المكون من 7 مراحل:
1. **رحلة ذهاب وإياب VAE** (Stable Diffusion `sd-vae-ft-mse`) — يقوم بإسقاط الصورة خارج مشعب الصور الطبيعية الذي لم يتم تدريب مفكك تشفير SynthID ضده أبدًا (Gowal et al. 2026, §6.1)
2. **تشوه مرن** — حقل تشوه عشوائي سلس منخفض التردد، يحاكي وضع الفشل 'تجزئة الكولاج' الذي يعترف به Gemini نفسه
3. **مجموعة هندسية عالمية** — دوران صغير + تكبير + إزاحة بكسل في تحويل أفيني واحد
4. **ضغط تغيير الحجم** — تقليل العينة (AREA) → زيادة العينة (LANCZOS)، يمسح معلومات العلامة المائية دون البكسل
5. **تعديل التباين اللوني** — إزاحة دقيقة للسطوع / التباين / التشبع / الصبغة
6. **طرح FFT للطور المتبقي** — حوامل عالمية للمدونة + حوامل محصودة من دفتر الشفرات، محدودة السقف
7. **سلسلة JPEG + ضوضاء لومي + ثنائي الجانب** — تعطيل ثقيل للضغط / إعادة الترميز
كل مرحلة مستقلة ببوابة PSNR؛ يتم التراجع تلقائيًا عن أي مرحلة قد تخفض الجودة إلى ما دون الحد الأدنى.
### هيكل دفتر الشفرات V4
يتم فهرسة الملفات الشخصية بواسطة `(model, H, W)`. يخزن كل ملف شخصي:
| الحقل | الشكل | ملاحظات |
|------------------------|----------------|--------------------------------------------------------|
| `consensus_coherence` | `(H, W, 3)` | قناع الحامل الأساسي (إجماع الطور عبر الألوان). |
| `consensus_phase` | `(H, W, 3)` | متوسط زاوية الطور الوحدة عبر الألوان. قالب الطرح. |
| `inverted_agreement` | `(H, W, 3)` | `abs(cos(phase_diff))` الزوجي، مرجح لـ `black<->white`. |
| `avg_wm_magnitude` | `(H, W, 3)` | متوسط المقدار عبر ألوان الإجماع. |
| `content_baseline` | `(H, W, 3)` | من `diverse/` + `gradient/` — يستخدم لمزج الإضاءة. |
| `carrier_weights` | `(H, W, 3)` | **مباشر**. يبدأ من `consensus^2 * (0.5 + 0.5 * agreement)`. يتم تحديثه بواسطة حلقة المعايرة. |
| `n_refs_per_color` | `{color: int}` | عدد المراجع لكل لون. |
يعيد تنسيق الحفظ استخدام تشفير v3 المضغوط rfft + `float16/uint8`؛ دفتر شفرات مكون من 14 ملفًا شخصيًا عبر نموذجين × 7 درجات دقة يبلغ ~220 ميجابايت على القرص.
### كاشف V4 (فحص السلامة)
قبل قضاء الوقت في التحقق اليدوي من Gemini، قم بفحص مخرجات الالتفاف مقابل إجماع دفتر الشفرات V4 الخاص:```python
from robust_extractor import RobustSynthIDExtractor
from synthid_bypass_v4 import SpectralCodebookV4
cb = SpectralCodebookV4()
cb.load('artifacts/spectral_codebook_v4.npz')
ext = RobustSynthIDExtractor()
result = ext.detect_from_v4_codebook(image_rgb, cb,
model='nano-banana-pro-preview')
print(result.is_watermarked, result.confidence, result.phase_match)
على مسار المطابقة التامة 1024×1024 نرى conf=0.91, phase_match=0.65 للعلامة المائية و conf=0.02, phase_match=0.31 بعد التفكيك العدواني V4.
يبقى V3 في المستودع (src/extraction/synthid_bypass.py، bypass_v3) دون تغيير لمن يعتمد عليه.
نقوم بجمع صور سوداء نقية وبيضاء نقية تم إنشاؤها بواسطة Nano Banana Pro لتحسين استخراج العلامة المائية متعددة الدقة.
إذا كان بإمكانك إنشاء هذه:
gemini_black_nb_pro/ (للأسود)gemini_white_nb_pro/ (للأبيض)هذه الصور المرجعية ضرورية من أجل:
حتى 150–200 صورة بدقة جديدة يمكن أن تحسن بشكل كبير الكشف والإزالة.
الصور المرجعية مستضافة على Hugging Face للحفاظ على خفة مستودع git:```bash pip install huggingface_hub python scripts/download_images.py # download all python scripts/download_images.py gemini_black # download specific folder
مجموعة البيانات: [huggingface.co/datasets/aoxo/reverse-synthid](https://huggingface.co/datasets/aoxo/reverse-synthid)
---
## النتائج الرئيسية
### العلامة المائية تعتمد على الدقة
يُضمّن SynthID ترددات الحامل في **مواضع مطلقة مختلفة** حسب دقة الصورة. لا يمكن لدفتر الشيفرة المبني عند 1024x1024 إزالة العلامة المائية مباشرة من صورة 1536x2816 — فالحوامل تقع في خانات مختلفة تمامًا.
| الدقة | أعلى حامل (fy, fx) | التماسك | المصدر |
|:----------:|:--------------------:|:---------:|:------:|
| **1024x1024** | (9, 9) | 100.0% | 100 مرجع أسود + 100 مرجع أبيض |
| **1536x2816** | (768, 704) | 99.6% | 88 صورة محتوى موضوعة عليها علامة مائية |
لهذا السبب يخزن دفتر الشيفرة V3 **ملفات منفصلة لكل دقة** ويختار تلقائيًا عند وقت التجاوز.
### ثبات الطور — مفتاح ثابت على مستوى النموذج
قالب طور العلامة المائية **متماثل عبر جميع الصور** من نفس نموذج Gemini:
- **القناة الخضراء** تحمل أقوى إشارة للعلامة المائية
- **تماسك الطور عبر الصور** عند الحوامل: >99.5%
- **التحقق المتقاطع بالأسود/الأبيض** يؤكد الحوامل الحقيقية عبر |cos(phase_diff)| > 0.90
### هيكل تردد الحامل
عند 1024x1024 (من المراجع السوداء/البيضاء)، تقع الحوامل العليا على شبكة منخفضة التردد:
| الحامل (fy, fx) | تماسك الطور | اتفاق الأسود/الأبيض |
|:-----------------:|:---------------:|:-------------:|
| (9, 9) | 100.00% | 1.000 |
| (5, 5) | 100.00% | 0.993 |
| (10, 11) | 100.00% | 0.997 |
| (13, 6) | 100.00% | 0.821 |
---
## البنية
### أجيال التجاوز
| الإصدار | النهج | PSNR | تأثير العلامة المائية | الحالة |
|:-------:|:---------|:----:|:----------------:|:------:|
| **V1** | ضغط JPEG (Q50) | 37 dB | انخفاض الطور بنسبة 11% تقريبًا | خط الأساس |
| **V2** | تحويلات متعددة المراحل (ضوضاء، لون، تردد) | 27-37 dB | انخفاض الثقة بنسبة 0% تقريبًا | مقايضة الجودة |
| **V3** | **طرح دفتر الشيفرة الطيفي متعدد الدقة** | **43+ dB** | **انخفاض تماسك الطور بنسبة 91%** | أفضل سابق |
| **V4 Round 06** | **7 مراحل الكل في واحد (VAE + elastic + squeeze + color + JPEG)** | **بدون فقدان بصري** | **تم تجاوز الكاشف ✓** | **الأفضل حالياً** |
### خط أنابيب V3```
Input Image (any resolution)
│
▼
codebook.get_profile(H, W) ──► exact match? ──► FFT-domain subtraction
│ (fast path)
└─ no exact match ──────► spatial-domain resize + subtraction
(fallback path)
│
▼
Multi-pass iterative subtraction (aggressive → moderate → gentle)
│
▼
Anti-alias → Output
Input Image (any resolution) │ ▼ Stage 1: VAE round-trip (SD sd-vae-ft-mse, 1-2 passes) │ Projects image off natural-image manifold ▼ Stage 2: Elastic deformation (smooth random warp field) │ Fragments spatial phase consensus ("collage effect") ▼ Stage 3: Global geometric combo (rotation + zoom + shift) │ Single affine warp, no compounded aliasing ▼ Stage 4: Resize-squeeze (AREA ↓ then LANCZOS ↑) │ Erases sub-pixel watermark information ▼ Stage 5: Color-contrast nudge (HSV micro-shift) │ Shifts per-pixel statistics SynthID keys on ▼ Stage 6: Residual-phase FFT subtraction │ Blog-universal + codebook-harvested carrier bins ▼ Stage 7: JPEG chain + luma noise + bilateral filter │ ▼ Output (SynthID detector: no watermark detected ✓)
---
## بداية سريعة
### التثبيت```bash
git clone https://github.com/aloshdenny/reverse-SynthID.git
cd reverse-SynthID
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
# For Round-06 VAE stage:
pip install torch diffusers safetensors accelerate
import sys sys.path.insert(0, 'src/extraction') from synthid_bypass_v4 import SynthIDBypassV4, SpectralCodebookV4
cb = SpectralCodebookV4() cb.load('artifacts/spectral_codebook_v4.npz')
b = SynthIDBypassV4() result = b.bypass_v4_file( 'input.png', 'output.png', cb, strength='final', # or 'nuke' for maximum strength model='gemini-3.1-flash-image-preview', ) print(result.stages_applied)
### تشغيل تجاوز V3```python
from src.extraction.synthid_bypass import SynthIDBypass, SpectralCodebook
codebook = SpectralCodebook()
codebook.load('artifacts/spectral_codebook_v3.npz')
bypass = SynthIDBypass()
result = bypass.bypass_v3(image_rgb, codebook, strength='aggressive')
print(f"PSNR: {result.psnr:.1f} dB")
print(f"Profile used: {result.details['profile_resolution']}")
من CLI:```bash
python src/extraction/synthid_bypass.py bypass input.png output.png
--codebook artifacts/spectral_codebook_v3.npz
--strength aggressive
### كشف العلامة المائية```bash
python src/extraction/robust_extractor.py detect image.png \
--codebook artifacts/codebook/robust_codebook.pkl
reverse-SynthID/ ├── src/ │ ├── extraction/ │ │ ├── synthid_bypass.py # V1/V2/V3 bypass + multi-res SpectralCodebook │ │ ├── synthid_bypass_v4.py # V4 cross-color consensus codebook + dissolver │ │ ├── vae_regen.py # Round-06 SD-VAE re-generation stage │ │ ├── robust_extractor.py # Multi-scale watermark detection (+ V4 hook) │ │ ├── watermark_remover.py # Frequency-domain watermark removal │ │ ├── benchmark_extraction.py # Benchmarking suite │ │ └── synthid_codebook_extractor.py # Legacy codebook extractor │ └── analysis/ │ ├── deep_synthid_analysis.py # FFT / phase analysis scripts │ └── synthid_codebook_finder.py # Carrier frequency discovery │ ├── scripts/ │ ├── download_images.py # Download reference images from HF │ ├── build_codebook_v4.py # V4: build per-(model, HxW) consensus codebook │ ├── dissolve_batch.py # V4: emit strength variants │ └── calibrate_from_feedback.py # V4: update carrier_weights from detection feedback │ ├── artifacts/ │ ├── spectral_codebook_v3.npz # Multi-res V3 codebook [1024x1024, 1536x2816] │ ├── spectral_codebook_v4.npz # V4 codebook (per-model, per-resolution) │ ├── codebook/ # Detection codebooks (.pkl) │ └── visualizations/ # FFT, phase, carrier visualizations │ ├── assets/ │ ├── synthid_watermark.png # Watermark analysis header image │ ├── synthid_white.jpg # Amplified SynthID pattern on white image │ ├── v4_round1_vs_round6.png # Round 01 vs Round 06 fidelity comparison │ └── ... │ ├── runs/ │ ├── round_01/ … round_05/ # Historical bypass attempts │ └── round_06/ # Working bypass (final + nuke presets) │ ├── watermark_investigation/ # Early-stage Nano-150k analysis (archived) └── requirements.txt
---
## غوص تقني عميق
### كيف يعمل SynthID (هندسة عكسية)```
┌──────────────────────────────────────────────────────────────┐
│ SynthID Encoder (in Gemini) │
├──────────────────────────────────────────────────────────────┤
│ 1. Select resolution-dependent carrier frequencies │
│ 2. Assign fixed phase values to each carrier │
│ 3. Neural encoder adds learned noise pattern to image │
│ 4. Watermark is imperceptible — spread across spectrum │
├──────────────────────────────────────────────────────────────┤
│ SynthID Decoder (in Google) │
├──────────────────────────────────────────────────────────────┤
│ 1. Extract noise residual (wavelet denoising) │
│ 2. FFT → check phase at known carrier frequencies │
│ 3. If phases match expected values → Watermarked │
└──────────────────────────────────────────────────────────────┘
تتضمن مجموعة تحسين التدريب في SynthID (Gowal et al. 2026, الجدول 1) SmallRotation وCropresize وJPEG وGaussianBlur وBrightnessContrast وScreenshotting — وكلها تحويلات مكانية شاملة وموحدة. مجال التشويه المرن هو تشويه متغير مكانياً: كل حي محلي يحصل على إزاحة فرعية بكسل مستقلة خاصة به. نظرًا لأن الإزاحات سلسة (ممهدّة غاوسياً من ضوضاء بيضاء، σ=44–56 بيكسل)، فإن محتوى الصورة لا يتأثر بصرياً، لكن بنية توافق الطور للعلامة المائية تصبح غير مترابطة — لم يعد من الممكن تجميعها عبر الصورة. هذا هو المكافئ على مستوى البكسل لتأثير "تجزئة الكولاج" الذي يستشهد به تطبيق Gemini نفسه كحالة فشل للمُكتشف.
| المقياس | القيمة |
|---|---|
ألوش ديني أبحاث العلامات المائية بالذكاء الاصطناعي · معالجة الإشارات
📧 البريد الإلكتروني: [email protected] 🔗 GitHub: https://github.com/aloshdenny
للتّعاون، أو النقاشات البحثية، أو المساهمات، لا تتردد في التواصل أو فتح مشكلة / طلب سحب.
هذا المشروع مُدار بشكل مستقل — بدون تمويل مختبرات أو دعم شركات.
إذا كان هذا العمل مفيداً لك أو لفريقك، ففكر في دعم مواصلة التطوير:
تذهب الأموال نحو تكاليف الحوسبة (ساعات GPU لملفات القرار الجديدة)، وتوسيع مجموعة البيانات، والبحث المستمر في تجاوز الكشف.
هذا المشروع مخصص لأغراض البحث والتعليم فقط. SynthID هي تقنية مملوكة لشركة Google DeepMind. هذه الأدوات مخصصة من أجل:
لا تستخدم هذه الأدوات لتحريف المحتوى المُنشأ بالذكاء الاصطناعي على أنه من صنع البشر.
| الجولة | الاستراتيجية | النتيجة |
|---|
| 01 | طرح طيفي محافظ (خفيف) | ✗ |
| 02 | طرح طيفي عدواني + JPEG | ✗ |
| 03 | استهداف الخانات المطلقة الموجه بالمدونة | ✗ |
| 04 | استخراج طور البقايا بعد إزالة التشويش | ✗ |
| 05 | إعادة توليد Diffusion-VAE + تشوه هندسي | ✗ |
| 06 | الكل في واحد: VAE + تجزئة مرنة + ضغط + لون + JPEG | ✓ |
| V3 | V4 |
|---|
| الألوان المرجعية | أسود + أبيض | أسود، أبيض، أزرق، أخضر، أحمر، رمادي (+ خطوط أساسية متنوعة/محتوى متدرج) |
| التحقق المتقاطع | abs(cos(phase_black - phase_white)) | إجماع عبر الألوان على 6 ألوان + اتفاق ثنائي |
| النماذج | نموذج واحد (Gemini 2.5) | ملفات تعريف لكل نموذج (gemini-3.1-flash-image-preview، nano-banana-pro-preview) + union اختياري |
| الهجوم | طرح طيفي فقط | 7 مراحل: VAE + مرن + ضغط + لون + FFT + سلسلة JPEG |
| PSNR (عدواني) | 43 dB | بلا خسارة بصرياً (18–24 dB على مستوى البكسل؛ التشويه يزاح البكسلات) |
| حارس الدقة | لا شيء | تراجع لكل مرحلة يعتمد على حد PSNR |
| تعطيل الكاشف | محلي فقط | مؤكد ✓ على تطبيق Gemini (كلا النموذجين) |
| 43.5 dB |
| SSIM | 0.997 |
| انخفاض طاقة الناقل | 75.8% |
| انخفاض تماسك الطور (أفضل 5 ناقلات) | 91.4% |
| النموذج | الإعداد المسبق | تجاوز المكتشف |
|---|
| gemini-3.1-flash-image-preview | final | ✓ |
| gemini-3.1-flash-image-preview | nuke | ✓ |
| nano-banana-pro-preview | final | ✓ |
| nano-banana-pro-preview | nuke | ✓ |