Quantcast
Channel: Essence Sharing | 干货分享 - iOSRE
Viewing all articles
Browse latest Browse all 301

一个LLDB的Python脚本,断点每处objc_msgSend,从此不用辛辛苦苦的敲 n 或 n -c 了

$
0
0

@makemelike wrote:

大神请无视 T_T
整了个LLDBPython脚本,从此不用辛辛苦苦的敲nn -c。脚本的功能是:断点在每处objc_msgSend,然后打印参数。用法:
启动LLDB后,输入以下命令:
command script import /path/to/StepTo_objc_msgSend.py
help
iobjc_msgSend
iobjc_msgSended
iprint_args

脚本在iPhone 5S ARM64测试过,有BUG大家见谅改改就好,别鄙视小弟我哈。


StepTo_objc_msgSend.py

#!/usr/bin/python

import commands
import optparse
import lldb
import shlex
import re
import os

def iobjc_msgSend(debugger, command, result, internal_dict):
	interpreter = lldb.debugger.GetCommandInterpreter()
	returnObject = lldb.SBCommandReturnObject()
	thread = debugger.GetSelectedTarget().GetProcess().GetSelectedThread()
	thread.StepOver()
	while True:
		interpreter.HandleCommand('dis -p -c 10', returnObject)
		disassemble = returnObject.GetOutput();
		p = re.compile(r'->.*')
		m = p.search(disassemble)
		c = m.group(0)
		if 'objc_msgSend' in c :
			print 'objc_msgSend Hited!'
			print disassemble
			break
		else:
			thread.StepOver()

def iobjc_msgSended(debugger, command, result, internal_dict):
	iobjc_msgSend(debugger, command, result, internal_dict)
	interpreter = lldb.debugger.GetCommandInterpreter()
	returnObject = lldb.SBCommandReturnObject()
	thread = debugger.GetSelectedTarget().GetProcess().GetSelectedThread()
	thread.StepOver()
	print 'objc_msgSend Evaluated!'

	interpreter.HandleCommand('dis -s `$pc-0x8` -c 5', returnObject)
	disassemble = returnObject.GetOutput()
	print disassemble

	iprint_args(debugger, command, result, internal_dict)

	interpreter.HandleCommand('po $x0', returnObject)
	ret = returnObject.GetOutput().strip()
	print 'Return Value: %s' % ret


def iprint_args(debugger, command, result, internal_dict):
	interpreter = lldb.debugger.GetCommandInterpreter()
	returnObject = lldb.SBCommandReturnObject()
	interpreter.HandleCommand('po $x0', returnObject)
	arg1 = returnObject.GetOutput().strip()
	interpreter.HandleCommand('p (char *)$x1', returnObject)
	arg2 = returnObject.GetOutput().strip()

	print '-[%s %s]' % (arg1, arg2)

	functionName = '['
	functionName += '%s ' % arg1
	p = re.compile('"(.*)"')
	m = p.search(arg2)
	if m is not None:
		s = m.group(1)
		names = s.split(':')
		print names
		for i in range(len(names) - 1):
			interpreter.HandleCommand('po $x%d' % (i + 2), returnObject)
			value = returnObject.GetOutput().strip()
			name = names[i]
			functionName += ' %s:%s ' % (name, value)
	

	functionName += ']'
	print functionName


def __lldb_init_module(debugger, dict):

	names = ['iobjc_msgSend', 'iobjc_msgSended', 'iprint_args']
	helpTexts = ["Break at next objc_msgSend.", "Evaluate next objc_msgSend.", "Print current objc_msgSend arguments."]
	for i in range(len(names)):
		name = names[i]
		helpText = helpTexts[i]
		debugger.HandleCommand('command script add %s -f %s.%s' % (name, __name__, name))
		print 'The "%s" python command has been installed and is ready for use.' % name
		debugger.HandleCommand('command script add --help "{help}" --function {function} {name}'.format(help=helpText, function=name, name=name))

Posts: 6

Participants: 3

Read full topic


Viewing all articles
Browse latest Browse all 301

Trending Articles