逆向使用lldb调试命令(cycript)

使用MonkeyDev安装运行任意第三app逆向调试,更方便,更强大@AloneMonkey

在iOS的逆向开发中cycript与Reveal是不可缺少的分析第三方app的利器,利用它们可以很快的定位到UI,找到对应的控制器,进而缩小了代码的区域。最近实用lldb进行调试,发现lldb也可以达到类似的效果。

首先需要在非越狱设备调试任意第三方app参考这篇文章

这边还是以微信作为例子:

UNADJUSTEDNONRAW_thumb_1.jpg

这边要达到的效果是找到登录按钮所在内存地址,并且找到所属控制器,修改登录按钮的文字。开始吧!

开始之前先简单介绍一下lldb常用命令,p & po — 打印变量或者对象

因为LLDB支持前缀匹配,因此你可以将print简写为p或者pri,而print则代表expression --;po则代表expression -O --,意为print object,打印对象。输入p指令可打印其对象类型、内存地址以及该对象的值等具体信息,而po指令则是打印其调用description方法得到的值。

(注:打印集合类型对象时,p指令会省略具体的值,只提示集合的数量等信息,因此若需查看集合中的值应使用 po指令,如下图所示:)

  • 打印NSString:

  • 打印NSDictionary:

expression

expression命令的作用是执行一个表达式,并将表达式返回的结果输出。expression的完整语法是这样的:

expression <cmd-options> -- <expr>

<cmd-options>:命令选项,一般情况下使用默认的即可,不需要特别标明。

--: 命令选项结束符,表示所有的命令选项已经设置完毕,如果没有命令选项,--可以省略

<expr>: 要执行的表达式

说expression是LLDB里面最重要的命令都不为过。因为他能实现2个功能。

  • 我们在代码运行过程中,可以通过执行某个表达式来动态改变程序运行的轨迹。

  • 假如我们在运行过程中,突然想把self.view颜色改成红色,看看效果。我们不必写下代码,重新run,只需暂停程序,用expression改变颜色,再刷新一下界面,就能看到效果

/ /改变颜色
  (lldb) expression -- self.view.backgroundColor = [UIColor redColor]
  // 刷新界面
  (lldb) expression -- (void)[CATransaction flush]

也就是说我们可以通过expression来打印东西。

假如我们想打印self.view:

 (lldb) expression -- self.view
 (UIView *) $1 = 0x00007fe322c18a10

命令就介绍这个几个有用到的,其他的可以自行百度,下面就来调试吧!

  • 先用xcode调试界面:

WechatIMG9126.jpeg
WechatIMG9127.jpeg

以上两张截图中其实已经包含了很多的我们想要的信息,包括UI的布局结构,层次,每个UIView对应的内容地址,以及父控件或容器.选中一下登录按钮,你回发现xcode右边的调试界面中如下内容:

WechatIMG9128.jpeg

包含了很多有用的信息,包括按钮的类名,内存地址以及Action和Target等

这样的话可以通过调用UIButton的nextResponder方法一直找到其所在的控制器,怎么去调用这个方法?,这时候lldb的expression命令就派上用场了,(e 0x105651b50)登录按钮的内存地址,执行以下命令:

e 0x105651b50

会打印出:

(long) $188 = 4385479504

其中$188就代表登录按钮对象,当然你可以直接使用0x105651b50(即登录按钮对象),改变登录按钮的文字试试:

e [$188 setTitle:@"飘金" forState:UIControlStateNormal]

结果报错如下:

WechatIMG9130.jpeg

这是因为缺少UIKit库

e @import UIKit

引入UIKit库在试试,What??还是错!

WechatIMG9131.jpeg

这是因为$188只是代表登录按钮所在内存地址,lldb并不知道他是什么类型对象,试着把$188强转换类型:

WechatIMG9132.jpeg

由图可知是登录按钮FixTitleColorButton类型

//0x105651b50和$188是一样的,e [(FixTitleColorButton *)0x105651b50 setTitle:@"飘金" forState:UIControlStateNormal]是一样的效果,你可以试试!
e [(FixTitleColorButton *)$188 setTitle:@"飘金" forState:UIControlStateNormal]

这回没有报错,也没有提示任何信息,但是UI 界面中也没看到任何变化,试着刷新界面的命令:

expression  (void)[CATransaction flush]

命令执行后也没有任何任何输出,单步调试下一步:

c

执行后看看UI界面:

UNADJUSTEDNONRAW_thumb_16.jpg

成功了,expression很强大,可以执行OC代码(和cycript一样,你可以通过方法recursiveDescription打印UIView结构,并且查看到每个UIView的相关信息),我们可以这样来定义一个变量

:

//获取到UIApplication对象,其中必须要在变量前加"$",后面引用定义好的对象时要带上"$",如下引用是$app
 e UIApplication *$app = [UIApplication sharedApplication]
//获取到keyWindow,引用时是$keyWindow
 e UIWindow *$keyWindow = $app.keyWindow
//获取到登录按钮
e FixTitleColorButton *$loginButton = (FixTitleColorButton *)0x15dd11770
//$loginButton只是0x000000015dd11770的别名
e $loginButton
(FixTitleColorButton *) $loginButton = 0x000000015dd11770

找出登录按钮所在控制器,利用nextResponder方法

(lldb) po [$loginButton nextResponder]
<UIView: 0x15dd0e080; frame = (0 582; 375 65); autoresize = W+TM; layer = <CALayer: 0x174039640>>

(lldb) po [(UIView *)0x15dd0e080 nextResponder]
<UIView: 0x15de27410; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x17022f760>>

(lldb) po [(UIView *)0x15de27410 nextResponder]
<WCAccountLoginFirstViewController: 0x15e80dc00>

这边看到控制器是WCAccountLoginFirstViewController,有个小技巧,当你不知道界面元素是哪一种类型的UI子类时你可以一并强转成UIView,因为控件都是UIView的子类.

利用lldb强大的命令行还可以在方法打断点的时候看到入参等信息,强大的地方很多,在逆向中起到很大的作用,很多有趣有用的功能等待大家去发现,可以多去试试!

个人博客地址

简书地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 转载 与调试器共舞 - LLDB 的华尔兹: https://objccn.io/issue-19-2/ 推荐:i...
    F麦子阅读 3,278评论 0 10
  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThi...
    木易林1阅读 941评论 0 4
  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThi...
    paraneaeee阅读 1,129评论 0 7
  • LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xc...
    CoderSC阅读 1,302评论 0 2
  • 1.动力是努力的来源. 今天上午在来学校的路上,看见肖老师跟我发微信说周娟(他最得意的学生)说我的作品有进步,当时...
    灵江雪阅读 162评论 0 0