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

栏目: IOS · 发布时间: 5年前

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

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

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

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

文中所需要用到的 工具 和文件:

越狱版本微信7.0.2 提取码: 2w87

MachOView 提取码: n3hy

yololib 提取码:rvy3

class-dump 提取码:icss

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

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

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

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

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

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

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

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

+ (void)load {
    NSLog(@"来了,老弟:grin:");
}
复制代码
iOS逆向(4)-代码注入,窃取微信密码

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

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

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

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

Step 1 先思考一个问题。

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

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

Step 2 MachO作用

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

iOS逆向(4)-代码注入,窃取微信密码
common + b Build一下,会发现在已经Build出来的文件中的Frameworks下已经有FYHook了,已经已经表明FYHook被Copy我们的ipa文件了。(如何看Build出来的文件?查看: APP重签名中Step 8 App重签名

)

iOS逆向(4)-代码注入,窃取微信密码
但是FYHook在ipa文件中,并不代表着FYHook就可以被我们的可执行文件所执行,因为FYHook并没有没导报入我们的可执行文件,只有在这个可行执行文件的 某一个地方

做好标记,告知可执行文件,在适当的时候需要加载外部的FYHook,才能够正常运行。

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

Step 3 MachOView

iOS逆向(4)-代码注入,窃取微信密码
点击这里下载: MachOView

提取码: n3hy

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

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

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

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

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

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

Step 4 将FYHook标记入MachO中

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

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

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

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

// yololib 「MachO路径」 「FYHook相对MachO的路径」
yololib WeChat Frameworks/FYHook.framework/FYHook
复制代码

3、代码注入

Step 1 建立重签脚本工程

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

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

Step 2 创建Framework文件

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

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

Step 3 修改源文件的MachO文件

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

// yololib 「MachO路径」 「FYHook相对MachO的路径」
yololib WeChat Frameworks/FYHook.framework/FYHook
复制代码
iOS逆向(4)-代码注入,窃取微信密码

Step 4 重新打包WeChat.ipa

zip -ry WeChat.ipa Payload
复制代码
iOS逆向(4)-代码注入,窃取微信密码

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

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

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

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

Step 6 新的思考

之前分析了我们创建了FYHook,但是没有对MachO注入,得到的答案是 来了,老弟:grin: 不能被输出,WeChat能跑起来。

那么如果我们对MachO注入FYHook,却没有创建对应的FYHook.framework,会怎么样呢?

这就留给大家思考,再去验证了,有答案的同学也能下方留言,并说出原因哦。

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

Step 1 ViewDebug

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

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

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

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

Step 2 LLDB

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

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

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

Step 3 class-dump

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

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

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

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

// class-dump -H 「app的MachO文件」 -o 「输入的目录」
class-dump -H WeChat -o /Users/dengbin/Code/GitHub/HookWeChat/InjectFrameWork/APP/WeChat-H
复制代码
iOS逆向(4)-代码注入,窃取微信密码
iOS逆向(4)-代码注入,窃取微信密码

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

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

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

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

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

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

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

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

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

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

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

接下来在用LLDB试试看,验证下我们的猜想:

随便在账号栏输入:qwerty

然后在密码栏输入:123456

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

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

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

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

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

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

+ (void)load {
    NSLog(@"来了,老弟:grin:");
    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之前,我们加上我们自己的方法,比如代码中的,在账号栏中直接输入密码。

运行后结果如图:

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

我这用的是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文件进行详细的讲解。请持续关注,觉得有帮助的点个收藏,留言评估了哦。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Go Web 编程

Go Web 编程

[新加坡]Sau Sheong Chang(郑兆雄) / 黄健宏 / 人民邮电出版社 / 2017-11-22 / 79

《Go Web 编程》原名《Go Web Programming》,原书由新加坡开发者郑兆雄(Sau Sheong Chang)创作、 Manning 出版社出版,人名邮电出版社引进了该书的中文版权,并将其交由黄健宏进行翻译。 《Go Web 编程》一书围绕一个网络论坛 作为例子,教授读者如何使用请求处理器、多路复用器、模板引擎、存储系统等核心组件去构建一个 Go Web 应用,然后在该应用......一起来看看 《Go Web 编程》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具