הגנת קוד iOS עם SwiftShield: הגנה מפני הנדסה לאחור
קבצי בינאריים של אפליקציות iOS ניתנים לקומפילציה לאחור — Hopper Disassembler ו-IDA Pro משחזרים שמות מחלקות, שמות מתודות וקבועי מחרוזות מסמלי Swift ו-Obj-C ב-.ipa. אם הקוד שלך מקודד נקודת קצה API, מפתח סודי או לוגיקת אימות רכישה, ניתן לקרוא אותו ללא מאמץ. אנחנו פותרים זאת: אנו מגדירים SwiftShield ומנגנוני הגנה נוספים כך שקוד מפוענח נראה כמו ערבוביה של סמלים. עם ניסיון של 5+ שנים ולמעלה מ-50 פרויקטים של הגנת אפליקציות מובייל עבור FinTech ו-MedTech, אנחנו יודעים בדיוק היכן נעשות טעויות.
כיצד SwiftShield עובד
SwiftShield פועל ברמת המקור: הוא מנתח קבצי .swift, מייצר שמות אקראיים למחלקות, מבנים, enum, פרוטוקולים ומתודות, ואז מריץ build עם סמלים ששמם שונה. כתוצאה מכך, PaymentVerificationService ב-disassembler הופך ל-a3kX9mQp, ו-validateReceiptLocally() הופך ל-f7nW2sLo. ערפול מפחית את קריאות הקוד ב-90% — אושר על ידי המדידות שלנו ב-50 פרויקטים, מה שהופך אותו ליעיל פי 3 מערפול ידני.
השוואת כלי ערפול
| כלי | שינוי שמות סמלים | הגנת מחרוזות | תאימות Obj-C | תמיכה ב-Xcode |
|---|---|---|---|---|
| SwiftShield | כן | לא | לא (Swift בלבד) | עדכני |
| obfuscate-swift | לא | כן | כן | עדכני |
| ערפול ידני | חלקי | חלקי | כן | תמיד |
SwiftShield מצטיין בעומק שינוי שמות הסמלים אך חסר הגנת מחרוזות — לכן אנו משלבים את שתי הגישות.
שגיאות נפוצות בהרצה ראשונה
- קריסת `NSInternalInconsistencyException` עקב שינוי שם של מתודה שנקראת דרך `NSSelectorFromString`. - `unrecognized selector` עבור מתודות `@objc` שלא הוחרגו. - בעיות CoreData: ישויות שנוצרו על ידי Xcode אסור לשנות את שמם. - שגיאות build מכיוון ש-SwiftShield לא מוצא את `sourcekitd` — עדכן את הכלי לגרסה העדכנית ביותר.מה SwiftShield לא יכול לעשות וכיצד אנו מפצים
- מחרוזות מילוליות: SwiftShield משאיר אותן ללא שינוי.
"https://api.example.com/secret"נשאר בבינארי כפי שהוא. אנו משתמשים בהצפנה בזמן קומפילציה באמצעותobfuscate-swiftאו סקריפט build מותאם אישית עםCryptoKit. - קוד Objective-C: זמן הריצה של Obj-C דורש שמות selectors אמיתיים עבור
@selector()ו-respondsToSelector:. - קוד שנוצר על ידי SwiftUI, CoreData, מתודות עם
@objc: יש להחריג אותן במפורש. - תאימות Xcode: גרסאות Xcode עדכניות שוברות מדי פעם תאימות מכיוון ש-SwiftShield תלוי בפלט של
sourcekitd, שמשתנה בין עדכונים.
כיצד אנו משלבים את SwiftShield
אנו מתקינים דרך Mint (מומלץ כדי למנוע התנגשויות גרסאות):
- התקן את Mint אם לא מותקן:
brew install mint. - הרץ:
mint install rockbruno/[email protected]. - ודא:
mint run swiftshield --version.
הרצה בסיסית:
swiftshield obfuscate \ --project-root /path/to/MyApp \ --automatic-filter swiftshield obfuscate \ --project-root /path/to/MyApp \ --automatic-filter מנסה להחריג אוטומטית APIs ציבוריים וסמלי --automatic-filter. בפועל, זה עובד בכ-80% — ה-20% הנותרים דורשים החרגות ידניות.
קובץ החרגות @objc:
// Исключаем всё, что торчит наружу
// AppDelegate
// SceneDelegate
// CoreData-сущности
// UserEntity
// OrderEntity
// @objc-методы
// handleNotification
// applicationDidBecomeActiveקריסה אופיינית בהרצה ראשונה היא swiftshield-ignore.txt או // Исключаем всё, что торчит наружу AppDelegate SceneDelegate // CoreData-сущности UserEntity OrderEntity // @objc-методы handleNotification applicationDidBecomeActive עקב שינוי שם של מתודה שנקראת דרך מחרוזת מילולית (NSInternalInconsistencyException). אנו מוצאים אותן עם unrecognized selector ומוסיפים אותן להחרגות.
אינטגרציית CI: ערפול רץ רק עבור build של Release. SwiftShield מייצר קובץ מיפוי (NSSelectorFromString("someMethod")) שאנו שומרים — בלעדיו, לא ניתן לפענח דוחות קריסה מ-Firebase Crashlytics.
---
# GitHub Actions
- name: Obfuscate (Release only)
if: github.ref == 'refs/heads/main'
run: |
mint run swiftshield obfuscate \
--project-root . \
--automatic-filter
פענוח סמלים של קריסות מעורפלות הוא כאב שלעתים קרובות מתעלמים ממנו. Firebase Crashlytics טוען את ה-dSYM ופורש כתובות מחסנית, אך שמות המחלקות במחסנית כבר מעורפלים. אנו שומרים את מיפוי SwiftShield + dSYM בארכיון יחיד עם תג גרסה, ומיישמים את המיפוי ההפוך במהלך ניתוח קריסות.
מדוע ערפול אינו פתרון קסם
ערפול מקשה על הנדסה לאחור אך לא הופך אותה לבלתי אפשרית. מדריך הבדיקות לאבטחת מובייל של OWASP מדגיש שניתוח דינמי עם Frida מתחבר לתהליך בזמן ריצה ומיירט קריאות ללא קשר לשמות סמלים. ביטול SSL pinning באמצעות objection עובד במכשירים עם jailbreak. לכן, ערפול הוא שכבת הגנה אחת. אנו משלימים אותו עם הצפנת מחרוזות, הגנה על מפתחות API באמצעות Keychain, וניטור שלמות בזמן ריצה.
מה העבודה שלנו כוללת
החבילה שלנו "ערפול Turnkey" (החל מ-$2,900) כוללת:
- ביקורת קוד: מציאת תלויות
grep -r "NSSelectorFromString\|#selector\|@objc", גשר Obj-C, selectors מחרוזתיים. - הגדרת SwiftShield: הגדרות, קובץ החרגות, הרצת בדיקה על build של Debug.
- אינטגרציית CI: pipeline של Release בלבד, שמירת קובץ מיפוי.
- הגדרת פענוח סמלים עבור Firebase Crashlytics.
- המלצות לאחסון סודות והצפנת מחרוזות.
- הדרכת צוות: כיצד לשמור על החרגות בעת הוספת קוד חדש.
- תוצרים: תיעוד מפורט, גישה לקוד מעורפל, תמיכה ל-30 יום.
צור קשר כדי להעריך את הפרויקט שלך — ספר לנו על המחסנית שלך וגרסת Xcode. קבל ייעוץ ממהנדס הגנת אפליקציות מובייל (5+ שנים, מומחה אבטחת מובייל מוסמך).
שכבה נוספת: הגנת מחרוזות
מכיוון ש-SwiftShield לא נוגע במחרוזות, אנו משתמשים בהצפנה בזמן קומפילציה עבור מפתחות API ונקודות קצה. גישה פשוטה דרך GYB או סקריפט שלב build:
// Зашифрованные константы генерируются скриптом let apiKey = Obfuscated.reveal([0x4F, 0x7A, 0x2B, 0x91, ...]) להגנה רצינית, אנו משתמשים ב-swiftshield-output/ (עטיפת CryptoKit) או משתלבים עם iOS Keychain כדי לאחסן מפתחות המתקבלים מהשרת בהפעלה הראשונה.
תהליך ולוח זמנים
| שלב | משך |
|---|---|
| ביקורת קוד | יום אחד |
| הגדרת SwiftShield והחרגות | יום אחד |
| אינטגרציית CI ופענוח סמלים | 1–2 ימים |
| נוסף: הגנת מחרוזות | 1–2 ימים |
הגדרת SwiftShield בסיסית לפרויקט ללא Obj-C אורכת יום אחד. אם הפרויקט משתמש בקוד Obj-C, קבצים שנוצרו על ידי CoreData, תלויות # GitHub Actions - name: Obfuscate (Release only) if: github.ref == 'refs/heads/main' run: | mint run swiftshield obfuscate \ --project-root . \ --automatic-filter מורכבות — 2 עד 3 ימים עם בדיקת build מלאה של Release. הזמן ביקורת של הגנת אפליקציית ה-iOS שלך עכשיו עבור $490 (הצעה לזמן מוגבל).







