利用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)-代码注入,非越狱窃取微信密码相关推荐

  1. 2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程——使用theos tweak 注入hook修改游戏执行代码上传动态头像

    2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程--使用theos tweak 注入hook修改游戏执行代码上传动态头像 开篇 需求&最终效果 环境要求与即将使用的 ...

  2. iOS远程真机之非越狱iOS设备的远程控制实现原理

    通过iOS设备控制PC可能较为常见,App Store也有不少类似的应用,但是通过PC控制iOS相信大家很难在网上找到解决方案,能找到的也大部分是需要依赖越狱来实现. 安卓提供了强大的adb工具,能轻 ...

  3. 找个搞IOS逆向的大佬写个越狱插件,接单的联系,APP没加密,有可参照,有接单的大佬请联系下

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  4. iOS逆向之旅---在iPhone上开发微信自动跳一跳插件

    感谢「杜泽旭」同学投稿,也欢迎广大安全逆向爱好者积极投稿,分享不仅是一种精神也是一种快乐,本文涉及到的iOS应用开发安全逆向问题可以去小密圈咨询他,包括微信,抖音等各种问题! 现在已有的实现方法基本是 ...

  5. iOS逆向之反HOOK的基本防护

    iOS逆向之Method Swizzle iOS逆向之fishHook原理探究 iOS逆向之fishHook怎么通过符号找字符串 学习完上面的文章后,深感fishhook之强大,既然fishhook能 ...

  6. iOS 逆向编程(三)实操越狱详细流程

    一.使用 CheckRa1n 越狱 常见越狱工具可以看这篇 iOS 逆向编程(二)越狱入门知识 我的手机是 iPhone 5s 版本为 ios 12.4.6 (推荐先看) 如果嫌麻烦,直接下面有推荐手 ...

  7. iOS 逆向 - 收藏集 - 掘金

    分分钟让你在 微信运动 霸占榜首 - iOS - 掘金 为了纪念我失去的已越狱iPad, 不得不写点什么. 所以...以下内容 不需要越狱. 微信运动 6万步是什么概念,我不知道,因为我没走过,不过有 ...

  8. 专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook

    专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook. 注意!本文所有操作均在以下环境下成功进行,不同平台或环境可能存在某些问题,欢迎大家在issue中提出问题以及相互 ...

  9. iOS 非越狱下的代码注入

    目录 免责声明 非越狱下的代码注入步骤 使用 ViewDebug 和导出的 Objective-C 类的头文件分析目标 App Objective-C 方法常见的 Hook 方式 免责声明 本文为一篇 ...

最新文章

  1. 使用级联样式表的好处在于_现在都在使用益阳云终端解决方案了,原因就在于这些好处...
  2. python后端工程师 数据爬虫
  3. Linux操作系统下如何利用SSH进行远程控制
  4. Halcon知识: 矩形测量
  5. 腾讯云数据库闪耀曼哈顿,CynosDB回馈开源社区
  6. 在Web中如何运用JavaScript实现打印功能
  7. HTML5文件上传插件 Huploadify V2.1发布
  8. python爬虫简单实例
  9. 【从零开始学GIS再到精通GIS】专题图制作-地图渲染-地图整饰
  10. TinyPNG批量智能图片压缩器无限制版(支持Mac/Win)
  11. CnPack应用总结
  12. Android组件化开发,组件间的Activity页面跳转。
  13. 云有约 | 首攻RSA,天空卫士“秀肌肉”怎么样了?
  14. JSON解决乱码问题
  15. python vbs_vbs和python
  16. JointJS中文文档
  17. u盘格式化后如何恢复数据,三步轻松恢复!
  18. 论文笔记【A Comprehensive Study of Deep Video Action Recognition】
  19. qs.stringify
  20. zipkin ui界面详解

热门文章

  1. Android开发学习笔记:WebView 一
  2. BZOJ 2190: [SDOI2008]仪仗队( 欧拉函数 )
  3. Junit的安装与使用
  4. C++对象的内存布局1---基础篇----C++ 虚函数表解析
  5. Partial Class部分类
  6. 将网站程序放在tmpfs下
  7. 在ASP.NET 2.0中使用样式、主题和皮肤
  8. PE文件和COFF文件格式分析--MS-DOS 2.0兼容Exe文件段
  9. 【Go】Go基础(二):学习网址汇总
  10. nginx http 服务器搭建