Как создать дамп всей памяти для iOS приложения, работающего в режиме отладки в XCode - PullRequest
2 голосов
/ 30 мая 2020

У меня есть приложение, работающее в режиме отладки в Xcode. Я хочу проверить всю память приложения (стек и кучу). Я знаю, что могу использовать lldb для создания дампов. Я использую следующую команду:

(lldb) memory read --outfile filename address

например.

(lldb) memory read --outfile /tmp/mem-dump.txt --force --count 10000 0x000000010d051000

, но мне нужно указать начальный адрес и размер памяти. Я не знаю, как найти области памяти, которые занимает мое приложение, чтобы сделать дамп. Есть ли возможность найти адресное пространство памяти? Может быть, существует другой способ сделать дамп (не используя lldb)? Я не использую взломанное устройство.

1 Ответ

2 голосов
/ 11 июня 2020

Используйте интерфейс моста lldb python скрипта. Он позволяет получить доступ к информации об области памяти и самим данным памяти, даже если приложение работает на физическом устройстве, а не на симуляторе. Никаких изменений в приложении не требуется.

Для доступа к памяти:

  • Скопируйте и сохраните следующий сценарий python на свой Ma c. Назовем его mem.py
import lldb

def processAllMemoryRegions():
    process = lldb.debugger.GetSelectedTarget().GetProcess()
    memoryRegionInfoList = process.GetMemoryRegions()
    numberOfMemoryRegions = memoryRegionInfoList.GetSize()
    memoryRegionIndex = 0
    while (memoryRegionIndex < numberOfMemoryRegions):
        memoryRegionInfo = lldb.SBMemoryRegionInfo()
        success = memoryRegionInfoList.GetMemoryRegionAtIndex(memoryRegionIndex, memoryRegionInfo)
        if success:
            print("Processing: "+str(memoryRegionIndex+1)+"/"+str(numberOfMemoryRegions))
            processOneMemoryRegion(process, memoryRegionInfo)
        else:
            print("Could not get memory at index: "+str(memoryRegionIndex))    
        memoryRegionIndex = memoryRegionIndex+1

def processOneMemoryRegion(process, memoryRegionInfo):
    begAddressOfMemoryRegion = memoryRegionInfo.GetRegionBase()
    endAddressOfMemoryRegion = memoryRegionInfo.GetRegionEnd()
    if memoryRegionInfo.IsReadable():
        print("Beg address of a memory region: "+stringifyMemoryAddress(begAddressOfMemoryRegion))
        print("End address of a memory region: "+stringifyMemoryAddress(endAddressOfMemoryRegion))
        error = lldb.SBError()
        regionSize = endAddressOfMemoryRegion-begAddressOfMemoryRegion
        memoryData = process.ReadMemory(begAddressOfMemoryRegion, regionSize, error)
        if error.Success():
            #do something with memoryData (bytearray) eg. save it to file
            pass
        else:
            print("Could not access memory data.")
    else:
        print("Memory region is not readable.")

def stringifyMemoryAddress(memoryAddress):
    return '0x{:016x}'.format(memoryAddress)
  • Остановить выполнение приложения на точке останова

В окне lldb

  • Введите: script

  • Импортируйте python script: exe c (open ('/ absolute / path / to / mem.py'). Read ())

  • Введите: processAllMemoryRegions ()

enter image description here

Готово.

Вы можете читать память с помощью функции process.ReadMemory. Посмотрите пример снайпера выше.

Вы также можете попробовать запустить выполнение скрипта с помощью:

(lldb) command script import  ~/path/to/script.py

Это описано здесь и здесь , .. ... но в моем случае это приводит к зависанию XCode. Он описан здесь

Код протестирован на Xcode 11.3.1.

...