Как получить доступ к свойствам класса Swift и изменить их с помощью Frida на iOS?IOS

Программируем под IOS
Ответить
Anonymous
 Как получить доступ к свойствам класса Swift и изменить их с помощью Frida на iOS?

Сообщение Anonymous »

Я использую Frida для подключения к своему iOS-приложению на Swift под названием TestApp2. Я хочу прочитать и изменить счетчик свойств класса. Класс:
// ContentView.swift
class ContentViewModel: ObservableObject {
@Published var counter: Int = 0

func incrementCounter() {
counter += 1
}
}

Я успешно подключил метод ignoreCounter() и захватил указатель self, который, как я предполагаю, является указателем на экземпляр класса ContentViewModel:
// hook.js
const TARGET_SYMBOL = '$s8TestApp216ContentViewModelC16incrementCounteryyF';
const module = Process.findModuleByName('TestApp2');
const targetAddress = module.findExportByName(TARGET_SYMBOL);
var selfPtr = null

Interceptor.attach(targetAddress, {
onEnter: function(args) {
selfPtr = args[0]; // ContentViewModel instance pointer
console.log(`[+] Self pointer: ${selfPtr}`);
}
});

Я запускаю приведенный выше сценарий с помощью команды frida:
frida -U TestApp2 --auto-reload -l hook.js

Я открываю приложение и нажимаю кнопку «Увеличить», после чего во Фриде отображается следующий результат:
[iPhone::TestApp2 ]-> [+] Self pointer: 0x280eb0860

Вопрос
Как мне прочитать и изменить текущее значение счетчика с учетом этого указателя?
Что я пробовал
  • Использование оболочки Swift.Object:
[iPhone::TestApp2 ]-> var temp = new Swift.Object(selfPtr, "ContentViewModel");
[iPhone::TestApp2 ]-> temp.counter; // undefined
[iPhone::TestApp2 ]-> temp
{
"handle": "0x280eb0860" // not sure what to do with this handle
}
  • Доступ через Swift.classes:
[iPhone::TestApp2 ]-> Swift.classes.ContentViewModel
{
"$conformances": [
"ObservableObject"
],
"$fields": [
{
"isVar": true,
"name": "_counter", // the _counter variable name is shown but the value is not
"typeName": "Published"
}
],
"$methods": []
}
  • Прямое чтение памяти (пробуя разные смещения):
[iPhone::TestApp2 ]-> selfPtr.add(0x10).readS64() // not sure of correct offset
"10785265760"

Среда
  • iOS 15.8.5 (с джейлбрейком)
  • Frida 17.3.2
  • Класс Swift (не @objc)
Полный код TestApp2 для Контекст
Все приложение состоит только из этих двух файлов ниже.
ContentView.swift:
import SwiftUI
import Combine

class ContentViewModel: ObservableObject {
@Published var counter: Int = 0
func incrementCounter() {
counter += 1
}
}

struct ContentView: View {
@StateObject private var viewModel = ContentViewModel()

var body: some View {
VStack(spacing: 20) {
TextField("Counter", value: $viewModel.counter, format: .number)
.textFieldStyle(RoundedBorderTextFieldStyle())
.multilineTextAlignment(.center)
.frame(width: 100)

Button("Increment") {
viewModel.incrementCounter()
}
.buttonStyle(.borderedProminent)
}
.padding()
}
}

#Preview {
ContentView()
}

TestApp2App.swift
import SwiftUI

@main
struct TestApp2App: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... ida-on-ios
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»