iOS 使用 lldb 断点加载调试工具如 Reveal-Lookin-Woodpecker
整体的 lldb 加载命令如下, 放在 ~/.lldbinit 文件内
### Reveal LLDB commands support - DO NOT MODIFY
command script import /Users/manajay/Library/Application\ Support/Reveal/RevealServerCommands.py
###
# Woodpecker commands begin
# path to your own woodpecker.py path
command script import ~/Documents/WoodPecker/woodpecker.py
command script add -f woodpecker.doload woodpecker
# Woodpecker commands end
# Lookin to your own lookin.py path
command script import ~/Documents/Lookin/lookin.py
command script add -f lookin.doload lookin
# Lookin commands end
主要是学习 Reveal 的加载脚本 RevealServerCommands.py , 这个是 Reveal App 包内部的文件, 参考后复刻简易版来 加载自己常用的其他工具, 比如 Lookin , Woodpecker 等, 将需要注入到 App 的 framework 使用 lldb 加载进去
注意这里主要是针对模拟器
先展示最终结果
Woodpecker load succeed
2022-05-21 22:52:43.990163+0800 LLDB[78677:7229760] LookinServer - Will launch. Framework version: 1.0.0
LookinServer load succeed
2022-05-21 22:52:44.897321+0800 LLDB[78677:7229760] INFO: Reveal Server started (Protocol Version 55).
Loading Reveal Server from /Users/LLDB/Library/Application Support/Reveal/RevealServer/RevealServer.xcframework/ios-arm64_i386_x86_64-simulator/RevealServer.framework/RevealServer...
Reveal Server was loaded successfully.
2022-05-21 22:52:44.929975+0800 LLDB[78677:7229760] LookinServer - Trying to connect ...
2022-05-21 22:52:44.930194+0800 LLDB[78677:7229760] LookinServer - Connected successfully on 127.0.0.1:47164
2022-05-21 22:52:44.930425+0800 LLDB[78677:7229760] INFO: Reveal Server started (Protocol Version 55).
Lookin
资源
需要脚本和 framework 如下, 放在 比如 ~/Documents/Lookin
文件夹下
LookinServer.framework
lookin.py
脚本
对应Lookin的lldb 脚本
#!/usr/bin/python
import lldb
import sys
import os
LookinSupportDirectory = os.path.expanduser("~/Documents/Lookin")
# Entry point
def __lldb_init_module(debugger, internal_dict):
# Install command
debugger.HandleCommand("command script add -f woodpecker.doload woodpecker")
def localLookinServerServerBinaryPath():
return os.path.join(LookinSupportDirectory, "LookinServer.framework/LookinServer")
def doload(debugger, command, exe_ctx, result, dict):
# path to the framework binary file
path = localLookinServerServerBinaryPath()
exists = os.path.exists(path)
if not exists:
print ("LookinServer framework not exists: {0}".format(path))
return
imagePath = lldb.SBFileSpec(path)
error = lldb.SBError()
process = exe_ctx.process
process.LoadImage(imagePath, error)
if error.Success():
print ("LookinServer load succeed")
else:
print(error)
lldb
然后在 ~/.lldbinit
中添加
# Lookin to your own lookin.py path
command script import ~/Documents/Lookin/lookin.py
command script add -f lookin.doload lookin
# Lookin commands end
断点
最后 iOS 项目中 添加符号断点
其中 Name 随意填写, 比如 加载 WoodPecker
Symbol 填写: UIApplicationMain
Action 选择 Debugger Command 内容填写: woodpecker
最后将最下面的 Options 勾选中, 断点后继续运行
注意: 断点最好 move 到 User 下, 这样多个项目可以共享
WoodPecker
资源
需要脚本和 framework 如下, 放在 比如 ~/Documents/WoodPecker
文件夹下
WoodPeckeriOS.framework
woodpecker.py
脚本
对应WoodPecker的lldb 脚本
#!/usr/bin/python
import lldb
import sys
import os
WoodPeckerSupportDirectory = os.path.expanduser("~/Documents/WoodPecker")
# Entry point
def __lldb_init_module(debugger, internal_dict):
# Install command
debugger.HandleCommand("command script add -f woodpecker.doload woodpecker")
def localWoodPeckerServerBinaryPath():
return os.path.join(WoodPeckerSupportDirectory, "WoodPeckeriOS.framework/WoodPeckeriOS")
def doload(debugger, command, exe_ctx, result, dict):
# path to the framework binary file
path = localWoodPeckerServerBinaryPath()
exists = os.path.exists(path)
if not exists:
print ("Woodpecker framework not exists: {0}".format(path))
return
imagePath = lldb.SBFileSpec(path)
error = lldb.SBError()
process = exe_ctx.process
process.LoadImage(imagePath, error)
if error.Success():
print ("Woodpecker load succeed")
else:
print(error)
lldb
然后在 ~/.lldbinit
中添加
# Woodpecker commands begin
# path to your own woodpecker.py path
command script import ~/Documents/WoodPecker/woodpecker.py
command script add -f woodpecker.doload woodpecker
# Woodpecker commands end
其中 Name 随意填写, 比如 加载 Lookin
Symbol 填写: UIApplicationMain
Action 选择 Debugger Command 内容填写: lookin
最后将最下面的 Options 勾选中, 断点后继续运行
注意: 断点最好 move 到 User 下, 这样多个项目可以共享
Discussion