iOS逆向(4)-代码注入,窃取微信密码

利用LLDB对微信进行分析,然后利用分析的结果,再逐步讲解如何Hook微信的登录过程,截获微信密码。

在上一篇文章(APP重签名)中,已经介绍了如何对APP重签名,并且利用XCode将微信跑起来,既然到了这一步,就万万不能错过强大的LLDB。这篇文章就讲为大家讲解到如何利用LLDB对微信进行分析,然后利用分析的结果,再逐步讲解如何Hook微信的登录过程,截获微信密码。

老规矩,片头先给福利:点击下载Demo:HookWeChat,这次有两份代码。由于越狱版微信体积太大,受到github限制,所以并没有将它传到github,可以在下方链接单独下载

文中所需要用到的工具和文件:
越狱版本微信7.0.2 提取码: 2w87
MachOView 提取码: n3hy
yololib 提取码:e8qs
class-dump 提取码:v5ku

接下来我们会从一下几部,让微信脱下看似安全的外衣,裸露在大家面前。

  • Framework的作用
  • 初探MachO (原理分析)
  • 代码注入 (代码过程)
  • ViewDebug、LLDB、class-dump分析微信登录页面(原理分析)
  • Hook登录,自动获取密码 (代码过程)
  • 总结

1、Framework的作用(对Framework熟悉的同学可以跳过这一步)

什么是Framework这里就不多加叙述,我参考这个网站,非常详细,看不懂你直接@我。点这里:Framework最强讲解

废话不多说,接下来直接演示如何创建一个Framework,并且介绍跟咱们Hook微信有关的基础原理。

新建一个工程FrameworkDemo,新建一个Framework,取名FYHook


创建Framework(1).png
创建Framework(2).png

在新建出来的FYHook文件夹中新建InjectCode(继承NSObject)对象,并且新建代码:

+ (void)load {
    NSLog(@"来了,老弟");
}
新建InjectCode.png

直接运行,会发现来了,老弟被输出,证明用这种方法新建的Framework能够直接运行在我们的项目中。

NSLog字符串.png

2、初探MachO (如果不想看原理,可以直接跳到第三部 代码注入)

根据上篇文章APP重签名讲到的,我们可以使用XCode将微信跑起来,那么是不是将两者结合起来,就可以将我们的代码注入进微信的APP呢?

Step 1 先思考一个问题。

根据APP重签名中的结论,利用脚本可以便捷重签APP(因为我们用的WeChat举例,所以下面简称WeChat),那么我们在重签脚本的工程中,直接创建一个Framework,能不能让我们Framework中的代码在WeChat中运行?

很显然,这是不行的(有兴趣的可以试一下)!为什么?
这个问题下面会回答,先把这个问题记在心中。

Step 2 MachO作用

在我们用XCode新建HYHook的时候,其实XCode帮我们做了一部操作:创建HYHook时候,同时将HYHook链接到我们的项目中(这是后期的XCode新增功能,早年的XCode这一步是需要我们直接做的)

XCode自动链接.png

common+b Build一下,会发现在已经Build出来的文件中的Frameworks下已经有FYHook了,已经已经表明FYHook被Copy我们的ipa文件了。(如何看Build出来的文件?查看:APP重签名中Step 8 App重签名)
自动加入Frameworks已经MachO文件.png

但是FYHook在ipa文件中,并不代表着FYHook就可以被我们的可执行文件所执行,因为FYHook并没有没导报入我们的可执行文件,只有在这个可行执行文件的某一个地方做好标记,告知可执行文件,在适当的时候需要加载外部的FYHook,才能够正常运行。

而这个地方所说的可执行文件就是MachO文件(具体什么是MachO,这不是本片文章的重点内容,可以持续关注笔者之后的文章,下一章详细介绍这至关重要的MachO),我们可以利用工具MachOView来查看MachO中到底有什么内容。

Step 3 MachOView

MachOView.png

点击这里下载:MachOView 提取码: n3hy

用MachOView打开FrameworkDemo的MachO,可以看到如下图


查看MachO.png

可以看到其中的有个Load Commands组,这里面就包括所有需要被动态加载的库。也就是说,如果在Load Commands中没有对应的FYHook,就不会加载FYHook。

在上图中可以看到FYHook已经被加入了Load Commands,并且图右侧也标记了FYHook所属的目录(和MachO文件同级的Frameworks下FYHook.framework中 ,FYHook.framework其实是个文件夹,里面的FYHook也是个MachO

所以这里就得到了「为什么我们直接将FYHook加入我们的从重签脚本工程,不能直接运行FYHook」的答案。
因为在在我们Build出来的MachO文件中的Load Commands中没有加入FYHook的路径。所以无法运行FYHook中的代码。

那么我们直接将FYHook加入我们Build出的MachO文件行吗?
显然也是不行的,因为我们Build出的MachO文件始终会被原始包(WeChat)中的MachO给替换掉。我们需要将FYHook加入原始包(WeChat)中的MachO中。

Step 4 将FYHook标记入MachO中

这里我们就需要用到终端命令行工具:yololib 提取码:e8qs

将下载下来的yololib.zip解压后得到的yololib放在⁨目录/usr⁩/local⁩/bin⁩下,这样我们在终端中就可以使用yololib命令了

yololib.png

以下命令就是将FYHook注入WeChat的命令

// yololib 「MachO路径」 「FYHook相对MachO的路径」
yololib WeChat Frameworks/FYHook.framework/FYHook

3、代码注入

Step 1 建立重签脚本工程

新建工程,取名InjectFrameWork,过程可参照上一篇文章(APP重签名)
最后得到如下工程:

重签工程.png

Step 2 创建Framework文件

新建一个Framework文件,取名FYHook,在FYHook中新建文件InjectCode,在InjectCode加入之前提到的同样的load代码,
等到如下工程:


创建Framework(3).png

Step 3 修改源文件的MachO文件

找到WeChat的MachO文件,打开终端,进入此目录下
执行命令

// yololib 「MachO路径」 「FYHook相对MachO的路径」
yololib WeChat Frameworks/FYHook.framework/FYHook
yololib注入成功.png

Step 4 重新打包WeChat.ipa

zip -ry WeChat.ipa Payload
重新打包WeChat.ipa.png

Step 5 加入新的WeChat.ipa,运行工程

将新得到的WeChat.ipa重新加入APP文件(这一步其实可以只加入文件,而不用加入工程),删除原来的Wechat7.0.2越狱.ipa。


新WeChat.ipa.png

新WeChat.ipa-2.png

common + R运行代码,会发现微信跑起来了,我们的来了,老弟也被输出了!

Step 6 新的思考

之前分析了我们创建了FYHook,但是没有对MachO注入,得到的答案是来了,老弟不能被输出,WeChat能跑起来。
那么如果我们对MachO注入FYHook,却没有创建对应的FYHook.framework,会怎么样呢?
这就留给大家思考,再去验证了,有答案的同学也能下方留言,并说出原因哦。

4、 ViewDebug、LLDB、class-dump分析微信登录页面

Step 1 ViewDebug

XCode跑起微信之后,跳转到登录页面,利用ViewDebug查看具体的详细的UI


ViewDebug.png

可以看到,登录按钮是一个FixTitleColorButton对象,他的Target的名字存在地址0x280afaa40中,他的Action名字存在地址0x280afac00中。
用同样的方法查看账号密码的输入框,会发现他们都属于一个对象,叫做WCUITextField


账号输入框WCUITextField.png

Step 2 LLDB

利用LLDB查看登录按钮具体的Target和Action名称


LLDB查看Target和Action.png

得知:
登录按钮处于WCAccountMainLoginViewController这个页面之中
登录按钮的点击方法叫做onNext

Step 3 class-dump

class-dump,是可以把Objective-C运行时的声明的信息导出来的工具。其实就是可以导出.h文件。用class-dump可以把未经加密的app的头文件导出来。

点击这下载命令行工具:class-dump 提取码:v5ku
同样的,将class-dump拷贝到Mac的目录/usr⁩/local⁩/bin⁩下,这样我们在终端中就可以使用class-dump命令了

class-dump目录.png

运行命令将WeChat所有的头文件导出来。

// class-dump -H 「app的MachO文件」 -o 「输入的目录」
class-dump -H WeChat -o /Users/dengbin/Code/GitHub/HookWeChat/InjectFrameWork/APP/WeChat-H
class-dump.png

WeChat-H.png

Step 4 找到输入框里面的内容

利用文本工具,例如Sublime查看WeChat的头文件,找到前面发现的WCAccountMainLoginViewController


WCAccountMainLoginViewController.png

发现里面确实有方法- (void)onNext;,还有长得很像账号输入框,密码输入框的对象_textFieldUserNameItem,_textFieldUserPwdItem

接下来就是找到密码输入框里面的字符串了,可以发现这两个都是WCAccountTextFieldItem对象,所有我们继续在导出的文件里面找到WCAccountTextFieldItem


WCAccountTextFieldItem.png

在其中只发现一个tips对象m_labelTip,没有发现对应的textfiled,但是可以看到WCAccountTextFieldItem是继承于WCBaseTextFieldItem的,所以继续查找WCBaseTextFieldItem


WCBaseTextFieldItem.png

从这就可以看到一个m_textField对象,这是个WCUITextField对象,疑似我们的目标textField,继续查看WCUITextField

WCUITextField.png

果然,这就是一个UITextField文件,那么我们就可以通过text字段取出其string。

接下来在用LLDB试试看,验证下我们的猜想:
随便在账号栏输入:qwerty
然后在密码栏输入:123456

po [(WCAccountMainLoginViewController *)0x1128bbc00 valueForKey:@"_textFieldUserPwdItem"]
po [(WCAccountTextFieldItem *)0x28328e880 valueForKey:@"m_textField"]
po [(WCUITextField *)0x112163a00 text]

其中第一个地址0x1128bbc00是在前两部利用ViewDubg找到的。


找到输入的密码.png

可以发现最后确实找到了我们输入的密码123456,证明我们的分析是正确的。

5、Hook登录,自动获取密码

接下来又是代码Coding了。原理分析完,其实代码就很简单了,直接上代码:


+ (void)load {
    NSLog(@"来了,老弟");
    Method onNext = class_getInstanceMethod(objc_getClass("WCAccountMainLoginViewController"), sel_registerName("onNext"));
    //1.保存原始的IMP
    old_onNext = method_getImplementation(onNext);
    //2.SET
    method_setImplementation(onNext, (IMP)my_next);
}

IMP (*old_onNext)(id self,SEL _cmd);

void my_next(id self,SEL _cmd){
    // 获取密码
    NSString *pwd = [[[self valueForKey:@"_textFieldUserPwdItem"] valueForKey:@"m_textField"] performSelector:@selector(text)];
    NSString *accountTF = [[[self valueForKey:@"_textFieldUserNameItem"] valueForKey:@"m_textField"] performSelector:@selector(text)];
    NSLog(@"密码是!%@",pwd);
    // 将密码追加在账号栏的后面
    [[[self valueForKey:@"_textFieldUserNameItem"] valueForKey:@"m_textField"] performSelector:@selector(setText:) withObject:[NSString stringWithFormat:@"%@+%@",accountTF,pwd]];
    //调用原来的方法
    old_onNext(self,_cmd);
}

稍微解释一下,在前面我们发现登录的响声事件是onNext,所有我们利用Objective-C的Runtime特性,对onNext进行方法替换,在响应原有的onNext之前,我们加上我们自己的方法,比如代码中的,在账号栏中直接输入密码。
运行后结果如图:


运行结果.PNG

我这用的是setIMP和getIMP的方式,对原方法进行HOOK,其实方法有多种:如:class_replaceMethod(),method_exchangeImplementations(),这里只是举一个例子供大家参考。

这篇文章的所有代码都可以在这下载到:HookWeChat

6、总结:

  • 先对APP重签名,让APP能在XCode运行起来
  • 利用yololib注入Framework,让APP可以运行我们直接的代码
  • 利用ViewDebug、LLDB、class-dump分析登录事件和密码框所在位置
  • 利用Runtime的MethodSwizzle,Hook登录事件

这次只是简单的微信的一个静态页面进行了初步接触,虽然思路简单,但这运用到的工具,却是无数大神前辈们为我们铺好的路,感谢!

MachO文件在本文中只是初略的提及,其实在我们逆向过程中MachO是一个至关重要的存在,如:

  • 对app的砸壳,其实就是对MachO解密
  • 所有的方法名,静态字符串都是存在MachO中
  • app的架构(arm64,arm7...)也是在MachO中区分的
  • app加载其实也是对MachO的一步步操作
  • ...

所以,在下篇文章,笔者将会对MachO文件进行详细的讲解。请持续关注,觉得有帮助的点个收藏,留言鼓励哦。

警告!
非越狱状态,玩逆向微信不要真的登录,有被警告甚至封号风险

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

推荐阅读更多精彩内容