Используйте интерфейс моста 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
![enter image description here](https://i.stack.imgur.com/YT9Fv.png)
Готово.
Вы можете читать память с помощью функции process.ReadMemory
. Посмотрите пример снайпера выше.
Вы также можете попробовать запустить выполнение скрипта с помощью:
(lldb) command script import ~/path/to/script.py
Это описано здесь и здесь , .. ... но в моем случае это приводит к зависанию XCode. Он описан здесь
Код протестирован на Xcode 11.3.1.