iOS逆向学习笔记之--LLDB动态调试目标程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wj610671226/article/details/81175138

iOS逆向学习笔记之–LLDB动态调试目标程序

  • 配置debugserver

1、将手机中的debugserver拷贝到Mac电脑上(前提是手机作为测试机使用过)

scp root@192.168.0.15:/Developer/usr/bin/debugserver /Users/mac/Desktop/dump 

2、查看debugserver架构然后瘦身去除其他架构

macdeiMac:dump mac$ lipo -info debugserver 
Architectures in the fat file: debugserver are: armv7 armv7s arm64 
// 保留需要的架构(这里是4s)
lipo -thin armv7 debugserver -output /Users/mac/Desktop/debugserver

3、给debugserver签名
使用codesign添加task_for_pid权限
1、下载ent.plist文件(地址:http://iosre.com/ent.plist)
2、把ent.plist和debugserver放到同一目录下进行签名

macdeiMac:dump mac$ cd /Users/mac/Desktop/sign 
macdeiMac:sign mac$ codesign -s - --entitlements ent.plist -f debugserver
debugserver: replacing existing signature
// 查看签名信息
macdeiMac:sign mac$ ldid -e  debugserver
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/ PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.springboard.debugapplications</key>
    <true/>
    <key>run-unsigned-code</key>
    <true/>
    <key>get-task-allow</key>
    <true/>
    <key>task_for_pid-allow</key>
    <true/>
</dict> 
</plist>

3、将处理好的debugserver拷贝回越狱iOS设备

scp /Users/mac/Desktop/sign/debugserver root@192.168.2.122:/usr/bin/debugserver

说明:拷贝到”/usr/bin/”目录下具有全局使用权限,原有目录下/Developer/usr/bin/debugserver是不可写的无法覆盖。

  • lldb的使用(iOS设备和电脑位于同一局域网)

1、ssh到手机开启debugserver监听

debugserver *:9999 -a "caipudaquan"

2、在电脑端使用lldb

lldb
process connect connect://192.168.2.122:9999

效果如下:
这里写图片描述

这里写图片描述

常用命令:

查看ASLR偏移
image list -o -f 
br s -a '0x0000000000054000+0x0000000101dcbb0c'
设置断点
b function
br s –a address
br s –a 'ASLROffset+address'
br s -n touchesBegan:withEvent: // 函数名
br s -r 正则表达式
br s -s 动态库 -n 函数名
// 查看所有断点
br list
// 删除断点1
br delete 1
// 程序继续运行
c
// 查看函数调用堆栈
bt
// 使断点1失效
br dis 1
// 使断点1生效
br enable 1
x/s $x1  // 将寄存器x1处的内存以字符串的形式显示出来
register read  // 读取所有寄存器的值
register read $x0  // 读取某个寄存器的值
register write $x5 1 //  修改某个寄存器的值
si // 跳转当前指令的内部
ni // 跳过当前指令
finish // 返回上层调用栈
thread return // 不再执行下面的代码,直接从当前调用栈返回一个值
br list // 查看当前断点列表
br del // 删除当前所有的断点
help // 查看所有LLDB命令
apropos name // 搜索命令带有name的相关命令
memory read -force -f A $sp $fp // 打印内存中栈的值
x/10xg address // 用16进制显示该地址空间10个64位元素内容
// 给断点添加命令,在触发此断点的时候会执行自己添加的命令 例如此时有一个断点1
br com add 1
> po $r0
> po $r1
> c
> DONE

猜你喜欢

转载自blog.csdn.net/wj610671226/article/details/81175138