用LLDB+Hopper调试的时候,经常要切来切去对比。由于ASLR存在,每次都要用计算器算一下,非常低下!
网上找到这篇文章 http://www.poboke.com/study/enhanced-lldb-debugger-with-python-script.html,直接在lldb里换算是个好主意。
受到他的启发,我们也可以把lldb里面的地址转换为hopper里的地址。稍微修改了一下源码
#!/usr/bin/python
#coding:utf-8
import lldb
import commands
import optparse
import shlex
import re
# 获取ASLR偏移地址
def get_ASLR():
# 获取'image list -o'命令的返回结果
interpreter = lldb.debugger.GetCommandInterpreter()
returnObject = lldb.SBCommandReturnObject()
interpreter.HandleCommand('image list -o', returnObject)
output = returnObject.GetOutput();
# 正则匹配出第一个0x开头的16进制地址
match = re.match(r'.+(0x[0-9a-fA-F]+)', output)
if match:
return match.group(1)
else:
return None
# Super breakpoint
def sbr(debugger, command, result, internal_dict):
#用户是否输入了地址参数
if not command:
print >>result, 'Please input the address!'
return
ASLR = get_ASLR()
if ASLR:
#如果找到了ASLR偏移,就设置断点
debugger.HandleCommand('br set -a "%s+%s"' % (ASLR, command))
else:
print >>result, 'ASLR not found!'
# Get Address
def adr(debugger, command, result, internal_dict):
#用户是否输入了地址参数
if not command:
print >>result, 'Please input the address!'
return
ASLR = get_ASLR()
if ASLR:
print >>result, format(eval("%s-%s" % (command, ASLR)), '#04x')
else:
print >>result, 'ASLR not found!'
# And the initialization code to add your commands
def __lldb_init_module(debugger, internal_dict):
# 'command script add sbr' : 给lldb增加一个'sbr'命令
# '-f sbr.sbr' : 该命令调用了sbr文件的sbr函数
debugger.HandleCommand('command script add sbr -f sbr.sbr')
debugger.HandleCommand('command script add adr -f sbr.adr')
print 'The "sbr/adr" python command has been installed and is ready for use.'
sbr是拿hopper中的地址下断点,adr是转换为hopper中的地址。
!!!逆向调试LLDB下不了符号断点!!!
!!!逆向调试LLDB下不了符号断点!!!
!!!逆向调试LLDB下不了符号断点!!!
重要的事情说三遍。所以才有了这个插件下地址断点!或者用符号表恢复工具,瞬间又高大上了~
然而通过Runtime也能拿到函数地址
现在不借助反汇编器也可以下断点了!!!
http://iosre.com/t/lldb-oc/6711
http://blog.imjun.net/2016/08/25/iOS%E7%AC%A6%E5%8F%B7%E8%A1%A8%E6%81%A2%E5%A4%8D-%E9%80%86%E5%90%91%E6%94%AF%E4%BB%98%E5%AE%9D/