🔏
AppSec & Pentest
Mobile
Mobile
  • Mobile
  • Pentesting Methodology
  • Programming
    • Аналитика
      • Some Papers
      • Примеры токенов/ключей и тп
      • Twitter ads
      • Branch.IO
      • Adjust
      • Amplitude Analytics
      • Paypal for Business
      • Emarsys
      • MobileAppTracker
      • AppsFlyer
        • About
        • Настройка аккаунта
        • Исследование кода
        • Examples
      • Fabric
      • Mixpanel Analytics
      • Facebook ads
      • Yandex
      • Firebase SDK
        • Intro
        • Примеры
        • Firebase Cloud Messaging
        • Компоненты
          • Firebase
          • FirebaseABTesting
          • FirebaseAnalytics[Interop]
          • FirebaseAppDistribution
          • FirebaseAuth[Interop]
          • FirebaseCore
          • FirebaseCoreDiagnostics[Interop]
          • FirebaseCrashlytics
          • FirebaseDatabase
          • FirebaseDynamicLinks
          • FirebaseFirestore[Swift]
          • FirebaseFunctions
          • FirebaseInAppMessaging
          • FirebaseInstallations
          • FirebaseInstanceID
          • FirebaseMessaging
          • FirebaseRemoteConfig
          • FirebaseStorage[Swift]
          • GoogleDataTransport
          • GoogleDataTransportCCTSupport
          • GoogleUtilities
          • GoogleUtilitiesComponents
      • Crashlytics
      • GTM: Google Tag Manager
      • Google Maps
      • Google Analytics
      • Flurry
      • HockeyApp
    • iOS
      • Материалы
      • iOS: SSL Pinning
      • ЯП
        • Swift
          • VIPER (Architecture)
          • Общее
          • UI
          • Производительность
          • Swift Style Guide
        • Swift Security
          • Примеры уязвимостей
      • Frameworks and Libraries
        • [Pentest] App extensions
          • About
          • Extension types
          • Static Analys
          • Dynamic Analys
        • [Pentest] App Notifications
        • Async
        • СDP
        • Core
        • Cryptography
        • Jailbreak Detection
        • Network
          • AFNetworking
          • Alamofire
          • HTTP Requests
        • Other
        • Push
        • RxSwift
        • Store Data
        • UI
          • SwiftUI
          • WebView in iOS App
          • UI
        • VPN Detection
      • XCode
        • Build Project
        • Build Project via Command Line
        • Install IPA
        • Templates
      • Другие инструменты
        • mint
      • Системы зависимостей пакетов
        • Carthage
        • CocoaPods
      • Troubleshooting
    • Android
      • Архитектура Android приложения
        • Архитектура Kotlin-приложения
        • Разница между Android Library, Android APP и Java Library
        • Basic
          • Activities
          • Broadcast Receivers
          • Content Providers
          • Custom URL Schemes
          • Intents
          • Notifications
          • PendingIntents
          • Permissions
          • Services
          • Android WebView
      • ЯП
        • Java
          • Bundle
        • Kotlin
          • Возвращение объектов в Intent
          • Call Native Functions
      • Frameworks
        • AndroidX
        • LiveData
        • Lifecycle
        • Background Tasks
          • DownloadManager
          • AlarmManager
          • Foreground Services (или просто Services)
          • WorkManager
        • Room
        • Data binding
          • Basic
        • NDK
          • Install and Build
          • OpenSSL
          • libgit2 build
        • Navigation
        • Работа с изображениями
          • Glide
        • Video/Audio
          • Communications
            • Jitsi
        • JS Engines
          • FB: Hermes
          • Duktape
        • DI: Dependency Injection
          • Зачем?
          • koin
          • kodein
          • dagger2
        • Retrofit / OkHTTP
          • Intro
          • Example Usage
            • Parse error body
            • Примеры обработчиков запросов
            • Структура модуля
            • HttpApi
            • ControllerApi
          • SSLPinning
        • Google Play Authorization
      • Automating build (android in docker)
      • Android Studio
        • Build Project
        • Составные части проекта
      • Технологии
        • LeakCanary
        • Mocking
        • Настройка резервного копирования
        • Remote Method Invocation
        • bundletool (aab -> apk)
      • Примеры приложений
        • Kotlin
      • API levels & NDK Version
    • PWA
    • Hybrid App
      • Frameworks
        • Frameworks List
        • Electron
        • React Native
      • Google Web Toolkit
      • Dart/Flutter
      • Kotlin
      • Game Develope
    • Рекомендации
      • Хранение PIN-кода и шифрование информации
      • Разработка приложения для людей с ограниченными возможностями
      • Secure Networking on iOS
    • AirWatch MDM
    • Дистрибьюция
      • AppCenter
      • App Store
      • App Store Connect
      • AppTester
      • Crashlytics
      • Cydia
      • Diawi
      • Google Play
      • Hockey App
      • TestFairy
      • TestFlight
      • Transporter.app
      • Firebase AppDistribution
  • Forensic
    • Bluetooth
    • NFC
    • GSM
    • SIM-cards
    • iOS
      • Инструменты и скрипты
        • Забор скриншотов с телефона
        • otool
        • lipo
        • plist reader
        • backup reader
        • libimobiledevice
        • Cydia Impactor
        • App Signature
      • Архитектура ОС
        • Шифрование приложений
        • Архитектура iOS приложения
        • iBoot
        • Secure Enclave (SEP)
        • Браузеры
      • Файловая система
        • Где что хранится
        • Мониторинг файловой системы
      • Create/Decrypt Backup
      • IPA dump
        • Frida IPA dump
        • iOS 11 и выше
        • Младше iOS 10
      • Jailbreak
      • DFU режим (режим восстановления и обновления)
    • Android
      • Файловая система
        • Android KeyStore
      • Общая информация о системе: Полезные тулзы и команды
      • Проверить подписи apk
      • Создание и восстановление резервной копии
      • Память процессов
      • Root
        • Common
        • A/B-разделы
        • Su
        • TWRP
  • Pentest
    • Уязвимости и Атаки
      • Изи баги
      • Common
      • iOS
      • Android
      • AppLinks
      • Auth
        • Biometrics bypass
        • PIN Bruteforce
        • Типичные ошибки реализации SMS-аутентификации
      • USSD Attack
      • Java Object Deserialization
      • Lack of binary protection (anti-debugging) controls
      • Disabled security features in binary libraries
      • Lack of exploit mitigations (e.g. PIE, ARC, or stack canaries)
      • Path disclosure in the binary
      • Runtime hacking exploits (e.g. exploits that are only possible in a jailbroken environment)
      • Snapshot/pasteboard leakage
      • User data stored unencrypted in the file system and/or external storage
      • Android Task Hijacking
      • WebView
        • Check list
        • Example Web View XSS in iOS app
        • CVE-2020-6506: uXSS in Android WebView
    • Кейсы
      • Общие
        • Firebase
        • Про сниффинг трафика HTTP2/gRPC
        • Dump memory
      • Android
        • Simple Library RCE for Android
        • Закинуть GApps на эмулятор
        • Android Dependency Check
        • Запрет скриншота и детект оверлея
        • Disable/Delete any app w/o root
      • iOS
        • App Transport Security
        • Info.plist
        • Смотреть логи
        • Установка IPA-образа на iOS без XCode, Cydia Impactor
        • Борьба со скриншотами
        • Блюринг изображений в менеджере окон
        • Установка неподписанных IPA
      • Hybrid Apps
        • Flutter SDK: RE/Capture Traffic
    • Bug Bounty
    • Настройка окружения
      • SASTs
      • Frida & Objection
      • Pentest WebView
      • iOS
        • Platform
        • Network
          • Запись траффика iOS
          • iOS SSL Unpinning
      • Android
        • Reverse Engineering
        • Platform
        • Network
          • Запись трафика Android
          • Android: SSL Unpinning
    • Mitigations
    • Books & Papers
    • Companies & People & Blogs
    • Инструменты и скрипты
      • Комбайны
      • Android
        • grep: Извлечение информации из APK
        • Более менее
        • Старая херня
          • Drozer
          • Разное
      • iOS
        • SAST
          • ipanema
          • iblessing
        • meetle
        • Static Analys with Frida
        • iFunBox
        • iOS Binary Analysis
        • needle
        • idb
        • ios emulator
        • passionfruit
        • Grapefruit ("NG passionfruit")
        • XPC Sniffing
        • SAST in MobSF
        • Поиск по файлам
      • hybrid app
        • Cordova
        • Xamarin
        • Electron
      • FBFlipper
      • truegaze
  • Reverse Engineering
    • Android
      • Tools
        • Decompilers
        • TODO: Androguard
        • TODO: AndroPyTool
        • TODO: LIEF-project
        • TODO: MobSF
        • JADX
        • dex2jar
        • Diff APKs, JARs,..
        • APKiD
        • enjarify
        • adb/fastboot
          • Install
          • Usage
          • Troubleshooting
          • На что можем влиять через adb (в поисках сервисов)
        • DexCalibur
      • Объединить несколько JAR
      • Build AOSP in Docker
      • Патчинг
      • Поиск уникальных строк в Smali
      • Защита от frida
    • iOS
      • CVEs
      • Tools
        • iRET
        • xcrun
        • otool: check binary encryption
      • Патчинг
      • Start iOS Debug Server
      • iOS Audio Framework
      • Facebook SDK
      • Swift
      • Attack Secure Boot of SEP
      • iOS Kernel Firmware
    • Tools
      • frida
        • Установка
        • Frida CLI
        • Запуск скриптов
        • Общие команды (JS API)
        • Frida Projects
        • Примеры
          • Материалы
          • Android
          • iOS
          • Unity/Mono
          • Общее
            • Вывод Callstack
            • Перехват инструкции по смещению
            • Перехват функции по имени
            • Перехват функции по смещению (sub_*)
      • objection
      • luject
      • emulators
    • Кейсы
      • Hybrid App
        • Intro
        • Hermes
        • Xamarin
        • React Native
        • Unity
        • Debug Hybrid App
    • Статьи
  • Administration
    • Инструменты
      • Android
        • uiautomatorviewer
        • jobb
        • archquery
        • apkanalyzer
        • avdmanager
        • emulator
        • perfetto
        • monkeyrunner
        • Настройка окружения
        • sdkmanager
Powered by GitBook
On this page
  • Common
  • JS API
  • Helpful functions
  • Swift
  • Swift Support
  • Swift example
  • ObjC
  • Alamofire SSL Pinning Disable
  • ASLR Bypass: Получение адреса функции

Was this helpful?

  1. Reverse Engineering
  2. Tools
  3. frida
  4. Примеры

iOS

Common

JS API

Получение объекта ios:

const webSocket = new ObjC.Object(args[2]);

Свойства объекта в Frida JS API:

$className - имя класса
$kind = {instance, class, meta-class}
$super - super-class method impl
$superClass - super-class as ObjC.Object instance
$class - class this object as ...
$methods - методы текущего и родительского классов
$ownMethods - методы текущего класса
$ivars - название полей

Доступ к приватным полям

for (k in objectClass.$ivars) {
    log("Test " + k);
    // out:
    // Test _test_property
}
prop = objectClass.$ivars._test_property

NSData

// NSData -> String:
const data = new ObjC.Object(args[2]);
Memory.readUtf8String(data.bytes(), data.length());

// NSData -> Binary Data
const data = new ObjC.Object(args[2]);
Memory.readByteArray(data.bytes(), data.length());

NSArray

// Enumeration by NSArray
const array = new ObjC.Object(args[2]);
const count = array.count().valueOf();

for (let i = 0; i !== count; i++) {
  const element = array.objectAtIndex_(i);
}

NSDictionary

const dict = new ObjC.Object(args[2]);
const enumerator = dict.keyEnumerator();
const key;
while ((key = enumerator.nextObject()) !== null) {
    const value = dict.objectForKey_(key);
}

Structs

If args[0] is a pointer to a struct, and let’s say you want to read the uint32 at offset 4, you can do it as shown below:

Memory.readU32(args[0].add(4));

Helpful functions

function prints(s) {
    console.log(s);
}

function nsstring(s) {
    const { NSString } = ObjC.classes
    return NSString.stringWithString_(s)
}

function GetModules() {
    let modules = Process.enumerateModules();
    modules.forEach(function(item) {
        if (!item.path.includes("/System/Library") && !item.path.includes("/usr/lib")) {

            // prints(`Name: ${item.name}; Path: ${item.path}`);
        }
    });

    return modules;
}

function GetModule(name) {
    let modules = GetModules();

    return modules.filter(function(item) {
        return item.name == name
    })[0];
}

function ModuleExports(module) {

    let exports = module.enumerateExports();
    let funcs = exports.filter(function(item) {
        return item.type === 'function'
    });
    let vars = exports.filter(function(item) {
        return item.type === 'variable'
    });

    return {
        'funcs': funcs,
        'vars': vars
    }
}

function VarsTest(vars) {
    vars.forEach(function(item) {
        // prints(`Name: ${item.name}`);
    })
}

function GetVariableByName(vars, name) {
    return vars.filter(function(item) {
        return item.name === name
    })[0];
}

Swift

Swift Support

Начиная с 15.0.0 frida поддерживает swift.

$ frida -U MyApp
> Swift.available
true

Swift example

console.log("[+] Plugin started");
if (Swift.available) {
    try {
        console.log("[+] Swift Runtime Available");

        let modules = GetModules();  // См выше эту функцию, в разд Common
        let messProtoModule = GetModule("MessProto");  // См выше эту функцию, в разд Common
        let exports = ModuleExports(messProtoModule);  // См выше эту функцию, в разд Common

        let verifyCodeRequestInit = GetVariableByName(exports.vars, '$s9MessProto0B17VerifyCodeRequestVACycfC');  // См выше эту функцию, в разд Common
        // prints(`Name: ${verifyCodeRequestInit.name}, Address: ${verifyCodeRequestInit.address}`)

        let obj = new Swift.Object(verifyCodeRequestInit.address);
    }
    catch(err) {
        console.log("[!] Exception: " + err.message);
    }
}
else {
    console.log("Swift Runtime is not available!");
}

ObjC

Alamofire SSL Pinning Disable

// frida -U -l afnetwork_sslbypass.js --no-pause -f my.test.app
 
console.log("[*] Started: SSL Unpinning");
if (ObjC.available) {
    /* AFNetwork */
    if (ObjC.classes.AFSecurityPolicy) {
        Interceptor.attach(ObjC.classes.AFSecurityPolicy['- setSSLPinningMode:'].implementation, {
            onEnter: function (args) {
                send("[*] Replacing AFSecurityPolicy setSSLPinningMode = 0 was " + args[2]);
                args[2] = ptr('0x0');
            }
        });
        Interceptor.attach(ObjC.classes.AFSecurityPolicy['- setAllowInvalidCertificates:'].implementation, {
            onEnter: function (args) {
                send("[*] Replacing AFSecurityPolicy setAllowInvalidCertificates = 1 was " + args[2]);
                args[2] = ptr('0x1');
            }
        });   
    }
}
else
{
    console.log("Objective-C Runtime is not available!");
}
console.log("[*] Completed: SSL Unpinning");

ASLR Bypass: Получение адреса функции

var modules_dict = {};

// save module addresses for bypass ASLR on iOS
function get_modules_dict() {
    var native_modules = Process.enumerateModulesSync();
    var i;
    for (i = 0; i < native_modules.length; i++)
    {
        modules_dict[native_modules[i].path] = {name: native_modules[i].name, path: native_modules[i].path, base: parseInt(native_modules[i].base.toString(), 16), size: parseInt(native_modules[i].size, 10), slide: -1, min: -1, max: -1};
    }

    // unsigned long _dyld_image_count();
    var dyldImageCountPtr = Module.findExportByName("libSystem.B.dylib", "_dyld_image_count");
    var dyldImageCount = new NativeFunction(dyldImageCountPtr, 'int', []);

    // unsigned long _dyld_get_image_vmaddr_slide(unsigned long image_index);
    var dyldImageVMAddrSlidePtr = Module.findExportByName("libSystem.B.dylib", "_dyld_get_image_vmaddr_slide");
    var dyldImageVMAddrSlide = new NativeFunction(dyldImageVMAddrSlidePtr, 'ulong', ['ulong']);

    //pointer _dyld_get_image_name(ulong);
    var dyldImageNamePtr = Module.findExportByName("libSystem.B.dylib", "_dyld_get_image_name");
    var dyldImageName = new NativeFunction(dyldImageNamePtr, 'pointer', ['ulong']);

    var count = dyldImageCount();
    for (i=0; i<count; i++)
    {
        var imgName = Memory.readCString(dyldImageName(i));
        var imgAddr = dyldImageVMAddrSlide(i);
        modules_dict[imgName]['slide'] = parseInt(imgAddr.toString(), 10);
        modules_dict[imgName]['min'] = modules_dict[imgName]['base'];
        modules_dict[imgName]['max'] = modules_dict[imgName]['base'] + modules_dict[imgName]['size'];
    }
    return modules_dict;
}
// Get original address for iOS binary
function find_module_offset_by_addr(orig_addr, lookup_func_name)
{
    var mp;
    for (mp in modules_dict)
    {
        if (orig_addr >= modules_dict[mp]['min'] && orig_addr <= modules_dict[mp]['max'])
        {
            var func_name = '';
            if (lookup_func_name === true)
            {
                func_name = " " + DebugSymbol.fromAddress(orig_addr)['name'];
            }
            var dbg_str = " (B:" + modules_dict[mp]['base'] + "|S:" + modules_dict[mp]['slide'] + "|O:" + orig_addr + ")";
            return orig_addr.sub(modules_dict[mp]['slide']) + " " + modules_dict[mp]['name'] + "+" + (orig_addr - modules_dict[mp]['min']).toString(16) + func_name; // + dbg_str;
        }
    }
    return "[DBGS]" + DebugSymbol.fromAddress(orig_addr);
    //return "UNKNOWN!" + orig_addr
}

/*
* Example usage
*/

if (ObjC.available) {	

   var module = "SDSearch";
   var functionName = "sbf_wasabit";

   var sbf_wasabit_ptr = Module.findExportByName(module, functionName);

   modules_dict = get_modules_dict();

   console.log("Wasabit module offset: " + find_module_offset_by_addr(sbf_wasabit_ptr)); // По полученному адресу можно осуществлять поиск в IDA
}
PreviousAndroidNextUnity/Mono

Last updated 3 years ago

Was this helpful?

Документация:

https://github.com/frida/frida-swift-bridge/blob/master/docs/api.md