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
在新建出来的FYHook文件夹中新建InjectCode(继承NSObject)对象,并且新建代码:
+ (void)load {NSLog(@"来了,老弟?");
}
复制代码
直接运行,会发现来了,老弟?
被输出,证明用这种方法新建的Framework能够直接运行在我们的项目中。
2、初探MachO (如果不想看原理,可以直接跳到第三部 代码注入)
根据上篇文章APP重签名讲到的,我们可以使用XCode将微信跑起来,那么是不是将两者结合起来,就可以将我们的代码注入进微信的APP呢?
Step 1 先思考一个问题。
根据APP重签名中的结论,利用脚本可以便捷重签APP(因为我们用的WeChat举例,所以下面简称WeChat),那么我们在重签脚本的工程中,直接创建一个Framework,能不能让我们Framework中的代码在WeChat中运行?
很显然,这是不行的(有兴趣的可以试一下)!为什么? 这个问题下面会回答,先把这个问题记在心中。
Step 2 MachO作用
在我们用XCode新建HYHook的时候,其实XCode帮我们做了一部操作:创建HYHook时候,同时将HYHook链接到我们的项目中(这是后期的XCode新增功能,早年的XCode这一步是需要我们直接做的)
common
+b
Build一下,会发现在已经Build出来的文件中的Frameworks下已经有FYHook了,已经已经表明FYHook被Copy我们的ipa文件了。(如何看Build出来的文件?查看:APP重签名中Step 8 App重签名) 但是FYHook在ipa文件中,并不代表着FYHook就可以被我们的可执行文件所执行,因为FYHook并没有没导报入我们的可执行文件,只有在这个可行执行文件的某一个地方
做好标记,告知可执行文件,在适当的时候需要加载外部的FYHook,才能够正常运行。
而这个地方所说的可执行文件就是MachO
文件(具体什么是MachO,这不是本片文章的重点内容,可以持续关注笔者之后的文章,下一章详细介绍这至关重要的MachO),我们可以利用工具MachOView来查看MachO中到底有什么内容。
Step 3 MachOView
点击这里下载:MachOView 提取码: n3hy
用MachOView打开FrameworkDemo的MachO,可以看到如下图
可以看到其中的有个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 提取码:e8qs
将下载下来的yololib.zip解压后得到的yololib放在目录/usr/local/bin下,这样我们在终端中就可以使用yololib命令了
以下命令就是将FYHook注入WeChat的命令
// yololib 「MachO路径」 「FYHook相对MachO的路径」
yololib WeChat Frameworks/FYHook.framework/FYHook
复制代码
3、代码注入
Step 1 建立重签脚本工程
新建工程,取名InjectFrameWork,过程可参照上一篇文章(APP重签名) 最后得到如下工程:
Step 2 创建Framework文件
新建一个Framework文件,取名FYHook,在FYHook中新建文件InjectCode,在InjectCode加入之前提到的同样的load代码, 等到如下工程:
Step 3 修改源文件的MachO文件
找到WeChat的MachO文件,打开终端,进入此目录下 执行命令
// yololib 「MachO路径」 「FYHook相对MachO的路径」
yololib WeChat Frameworks/FYHook.framework/FYHook
复制代码
Step 4 重新打包WeChat.ipa
zip -ry WeChat.ipa Payload
复制代码
Step 5 加入新的WeChat.ipa,运行工程
将新得到的WeChat.ipa重新加入APP文件(这一步其实可以只加入文件,而不用加入工程),删除原来的Wechat7.0.2越狱.ipa。
common
+ R
运行代码,会发现微信跑起来了,我们的来了,老弟?
也被输出了!
Step 6 新的思考
之前分析了我们创建了FYHook,但是没有对MachO注入,得到的答案是来了,老弟?
不能被输出,WeChat能跑起来。
那么如果我们对MachO注入FYHook,却没有创建对应的FYHook.framework,会怎么样呢?
这就留给大家思考,再去验证了,有答案的同学也能下方留言,并说出原因哦。
4、 ViewDebug、LLDB、class-dump分析微信登录页面
Step 1 ViewDebug
XCode跑起微信之后,跳转到登录页面,利用ViewDebug查看具体的详细的UI
可以看到,登录按钮是一个FixTitleColorButton对象,他的Target的名字存在地址0x280afaa40中,他的Action名字存在地址0x280afac00中。 用同样的方法查看账号密码的输入框,会发现他们都属于一个对象,叫做WCUITextField
Step 2 LLDB
利用LLDB查看登录按钮具体的Target和Action名称
得知: 登录按钮处于WCAccountMainLoginViewController这个页面之中 登录按钮的点击方法叫做onNext
Step 3 class-dump
class-dump,是可以把Objective-C运行时的声明的信息导出来的工具。其实就是可以导出.h文件。用class-dump可以把未经加密的app的头文件导出来。
点击这下载命令行工具:class-dump 提取码:v5ku 同样的,将class-dump拷贝到Mac的目录/usr/local/bin下,这样我们在终端中就可以使用yololib命令了
运行命令将WeChat所有的头文件导出来。
// class-dump -H 「app的MachO文件」 -o 「输入的目录」
class-dump -H WeChat -o /Users/dengbin/Code/GitHub/HookWeChat/InjectFrameWork/APP/WeChat-H
复制代码
Step 4 找到输入框里面的内容
利用文本工具,例如Sublime查看WeChat的头文件,找到前面发现的WCAccountMainLoginViewController
发现里面确实有方法- (void)onNext;
,还有长得很像账号输入框,密码输入框的对象_textFieldUserNameItem
,_textFieldUserPwdItem
。
接下来就是找到密码输入框里面的字符串了,可以发现这两个都是WCAccountTextFieldItem对象,所有我们继续在导出的文件里面找到WCAccountTextFieldItem
在其中只发现一个tips对象m_labelTip,没有发现对应的textfiled,但是可以看到WCAccountTextFieldItem是继承于WCBaseTextFieldItem的,所以继续查找WCBaseTextFieldItem
从这就可以看到一个m_textField对象,这是个WCUITextField对象,疑似我们的目标textField,继续查看WCUITextField
果然,这就是一个UITextField文件,那么我们就可以通过text字段取出其string。
接下来在用LLDB试试看,验证下我们的猜想:
随便在账号栏输入:qwerty
然后在密码栏输入:123456
po [(WCAccountMainLoginViewController *)0x1128bbc00 valueForKey:@"_textFieldUserPwdItem"]
po [(WCAccountTextFieldItem *)0x28328e880 valueForKey:@"m_textField"]
po [(WCUITextField *)0x112163a00 text]
复制代码
其中第一个地址0x1128bbc00是在前两部利用ViewDubg找到的。
可以发现最后确实找到了我们输入的密码123456
,证明我们的分析是正确的。
5、Hook登录,自动获取密码
接下来又是代码Coding了。原理分析完,其实代码就很简单了,直接上代码:
+ (void)load {NSLog(@"来了,老弟?");Method onNext = class_getInstanceMethod(objc_getClass("WCAccountMainLoginViewController"), sel_registerName("onNext"));//1.保存原始的IMPold_onNext = method_getImplementation(onNext);//2.SETmethod_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之前,我们加上我们自己的方法,比如代码中的,在账号栏中直接输入密码。
运行后结果如图:
我这用的是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文件进行详细的讲解。请持续关注,觉得有帮助的点个收藏,留言评估了哦。
转载于:https://juejin.im/post/5c850fd85188257e8f616bf7
iOS逆向(4)-代码注入,非越狱窃取微信密码相关推荐
- 2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程——使用theos tweak 注入hook修改游戏执行代码上传动态头像
2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程--使用theos tweak 注入hook修改游戏执行代码上传动态头像 开篇 需求&最终效果 环境要求与即将使用的 ...
- iOS远程真机之非越狱iOS设备的远程控制实现原理
通过iOS设备控制PC可能较为常见,App Store也有不少类似的应用,但是通过PC控制iOS相信大家很难在网上找到解决方案,能找到的也大部分是需要依赖越狱来实现. 安卓提供了强大的adb工具,能轻 ...
- 找个搞IOS逆向的大佬写个越狱插件,接单的联系,APP没加密,有可参照,有接单的大佬请联系下
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...
- iOS逆向之旅---在iPhone上开发微信自动跳一跳插件
感谢「杜泽旭」同学投稿,也欢迎广大安全逆向爱好者积极投稿,分享不仅是一种精神也是一种快乐,本文涉及到的iOS应用开发安全逆向问题可以去小密圈咨询他,包括微信,抖音等各种问题! 现在已有的实现方法基本是 ...
- iOS逆向之反HOOK的基本防护
iOS逆向之Method Swizzle iOS逆向之fishHook原理探究 iOS逆向之fishHook怎么通过符号找字符串 学习完上面的文章后,深感fishhook之强大,既然fishhook能 ...
- iOS 逆向编程(三)实操越狱详细流程
一.使用 CheckRa1n 越狱 常见越狱工具可以看这篇 iOS 逆向编程(二)越狱入门知识 我的手机是 iPhone 5s 版本为 ios 12.4.6 (推荐先看) 如果嫌麻烦,直接下面有推荐手 ...
- iOS 逆向 - 收藏集 - 掘金
分分钟让你在 微信运动 霸占榜首 - iOS - 掘金 为了纪念我失去的已越狱iPad, 不得不写点什么. 所以...以下内容 不需要越狱. 微信运动 6万步是什么概念,我不知道,因为我没走过,不过有 ...
- 专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook
专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook. 注意!本文所有操作均在以下环境下成功进行,不同平台或环境可能存在某些问题,欢迎大家在issue中提出问题以及相互 ...
- iOS 非越狱下的代码注入
目录 免责声明 非越狱下的代码注入步骤 使用 ViewDebug 和导出的 Objective-C 类的头文件分析目标 App Objective-C 方法常见的 Hook 方式 免责声明 本文为一篇 ...
最新文章
- 使用级联样式表的好处在于_现在都在使用益阳云终端解决方案了,原因就在于这些好处...
- python后端工程师 数据爬虫
- Linux操作系统下如何利用SSH进行远程控制
- Halcon知识: 矩形测量
- 腾讯云数据库闪耀曼哈顿,CynosDB回馈开源社区
- 在Web中如何运用JavaScript实现打印功能
- HTML5文件上传插件 Huploadify V2.1发布
- python爬虫简单实例
- 【从零开始学GIS再到精通GIS】专题图制作-地图渲染-地图整饰
- TinyPNG批量智能图片压缩器无限制版(支持Mac/Win)
- CnPack应用总结
- Android组件化开发,组件间的Activity页面跳转。
- 云有约 | 首攻RSA,天空卫士“秀肌肉”怎么样了?
- JSON解决乱码问题
- python vbs_vbs和python
- JointJS中文文档
- u盘格式化后如何恢复数据,三步轻松恢复!
- 论文笔记【A Comprehensive Study of Deep Video Action Recognition】
- qs.stringify
- zipkin ui界面详解