当前位置: 首页 > 编程日记 > 正文

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

相关文章:

java http请求 工具类_Java 实现 Http 请求工具类

1 packagecom.demo.util;23 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 importjava.io.OutputStreamWriter;7 importjava.net.URL;8 importjava.net.URLConnection;910 public classHttpUtil {11 /**12 * 向指定URL发送GE…

Entity Framework学习三:查询、插入、更新和删除操作

1.LINQ过滤数据 var query from person in context.Peoplewhere person.FirstName.StartsWith("a")select person; var methodQuery context.People.Where(p > p.FirstName.StartsWith("a")); 两种不同的写法,效果一样。 多条件组合查找…

c/s开发基础自学纪录为主

1.常用属性 (1)Name属性:用来获取或设置窗体的名称。 (2)WindowState属性:用来获取或设置窗体的窗口状态。 (3)StartPosition属性:用来获取或设置运行时窗体的…

不错的威盾PHP加密专家解密算法

<?php /*********************************** *威盾PHP加密专家解密算法 http://www.my400800.cn ***********************************/ $filename"phpfilename.php";//要解密的文件 $lines file($filename);//0,1,2行 //第一次base64解密 $content"&quo…

java网络编程udp_java网络编程 UDP网络编程问题

为什么我的代码运行后&#xff0c;黑窗口&#xff0c;不显示一端发来的数据&#xff0c;而是黑窗口打印很多空格&#xff1f;请帮一下&#xff0c;初学者&#xff01;谢谢&#xff0c;下面是二个具有发送和接受功能的代码&#xff1f;发送端————importjava.net.*;imp...为什…

权限组件(10):三级菜单的展示和增删改查

效果图&#xff1a; 三级菜单的实现和一级、二级菜单差不多。需要注意的是增加三级菜单时&#xff0c;三级菜单是用户提交后在后台通过二级菜单的id添加的。 一、路由分发 rbac/urls.py ... from django.urls import re_pathfrom rbac.views import menu ...urlpatterns [...…

ROS知识(4)----初级教程之常见问题汇总

一、开机启动ROS的工作空间的路径设置失败 现象&#xff1a;在教程&#xff1a;http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage中的第5.1小节&#xff0c;运行以下命令失败&#xff1a; $ rospack depends1 beginner_tutorials 提示错误&#xff1a;[rospack] Error: …

sql server 海量数据速度提升:SQL优化-索引(11) 【转】

12、高效的TOP 事实上&#xff0c;在查询和提取超大容量的数据集时&#xff0c;影响数据库响应时间的最大因素不是数据查找&#xff0c;而是物理的I/0操作。如&#xff1a; select top 10 * from ( select top 10000 gid,fariqi,title from tgongwen where neibuyonghu办公室or…

java重定向带参数_急 求助重新封装重定向带参数问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是我写的代码 不知道行不行 求助package base.web.resolver.result;import java.util.HashMap;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.logging.log4j.…

Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)...

本文来自&#xff1a;曹胜欢博客专栏。转载请注明出处&#xff1a;http://blog.csdn.net/csh624366188 写在前面&#xff1a;由于前天项目老师建设局的项目快到验收阶段&#xff0c;所以&#xff0c;前天晚上通宵&#xff0c;昨天睡了大半天&#xff0c;下午我们宿舍聚会&#…

对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于前、后部分

问题描述&#xff1a;假设某个数组中只有数字 1 和 2&#xff0c;进行排序&#xff0c;使得数字 1 位于数组前部分&#xff0c;数字 2 位于后部分。 这道算法题其实不是很难&#xff0c;使用各种排序算法应该都能解出&#xff0c;但是若要考虑性能问题&#xff0c;那就得选择一…

@class和#import

class 作用&#xff1a; 可以简单的引用一个类 简单使用&#xff1a; class Dog; 仅仅是告诉编译器&#xff0c;Dog是一个类&#xff1b;并不会包含Dog这个类的所有内容 具体使用&#xff1a; 在.h文件中使用class引用一个类 在.m文件中使用#import包含这个类的.h文件 作用上的…

java登陆界面连接数据库_java 登陆界面怎么写,连接数据库后

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼界面是package 界面类;import javax.jws.soap.SOAPBinding.Use;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing…

C# 汉字编码GB2312转换

功能界面 源码&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace wordsConvert {public partial class Fo…

python批量爬取文档

最近项目需要将批量链接中的pdf文档爬下来处理&#xff0c;根据以下步骤完成了任务&#xff1a; 将批量下载链接copy到text中&#xff0c;每行1个链接&#xff1b;再读txt文档构造url_list列表&#xff0c;利用readlines返回以行为单位的列表&#xff1b;利用str的rstrip方法&a…

[Android]webview直接加载网页允许JS,进度条,当前应用内跳转

webview&#xff0c;用于在应用里面直接加载网页本代码参考了&#xff1a;官方的webview实例介绍&#xff1a;https://developer.android.com/guide/tutorials/views/hello-webview.html 加上进度条&#xff1a; http://blog.csdn.net/stoneson/article/details/6068089 整个源…

ubuntu 14.04 安装java_Ubuntu 14.04中安装Java

第三&#xff1a;在Ubuntu 和 Linux Mint上安装Java看了各种类型"java";的不同之后&#xff0c;让我们看如何安装他们。1)在Ubuntu和Linux Mint上安装JRE打开终端&#xff0c;使用下面的命令安装JRE&#xff1a;sudo apt-get install default-jre2)在Ubuntu和Linux M…

C# 生成系统唯一号

生成唯一号&#xff1a;思路&#xff0c;根据yymmddhhmmss自增长号唯一服务器号( SystemNo)生成唯一码&#xff0c;总长度19&#xff0c;例如&#xff1a;1509281204550000101. public class UniqueNumber{private static long num 0;//流水号private static object lockObj …

EBS上用过的一些接口表整理信息

AP接口表&#xff1a;AP_INVOICES_INTERFACEAP_INVOICE_LINES_INTERFACE涉及的请求&#xff1a;应付款管理系统开放接口导入涉及案例&#xff1a; 运费导AP、费用导APPO接口表&#xff1a;申请&#xff1a;PO_REQUISITIONS_INTERFACE_ALL涉及请求&#xff1a;导入申请采购&…

linux源码编译安装nginx

1.从nginx的官方网站下载nginx的安装源码包&#xff0c;要下载.gz格式的包才是linux安装包 网址http://nginx.org/download/ wget http://nginx.org/download/nginx-1.5.9.tar.gz 2.解压 tar -zxvf nginx-1.5.9.tar.gz yum -y install pcre-devel gcc gcc-c autoconf automak…

usr share里没有mysql_无法在ubuntu 12.04上安装mysql,找不到消息文件’/usr/share/mysql/errmsg.sys’...

尝试使用apt-get安装mysql但它失败了# apt-get install MysqL-serverReading package lists... DoneBuilding dependency treeReading state information... DoneThe following extra packages will be installed:MysqL-server-5.5Suggested packages:tinycaThe following NEW …

android:更改PagerTabStrip背景颜色,标题字体样式、颜色和图标,以及指示条的颜色...

1.更改PagerTabStrip背景颜色我们直接在布局中设置background属性可以&#xff1a;<android.support.v4.view.ViewPagerandroid:id"id/pager"android:layout_width"fill_parent"android:layout_height"fill_parent" ><android.support.…

敏捷开发日常跟进系列之二:燃尽图(中)

这是敏捷开发日常跟进系列的第二篇&#xff08;栏目目录&#xff09;。 迭代及燃尽图的目标 燃尽图的目标是完成迭代的目标&#xff0c;迭代的目标是什么呢&#xff1f; 1. 按产品经理的要求&#xff0c;交付计划会中计划的用户故事 2. 尽量完成1 之后还会看到&#xff0c;这个…

[python][jupyter notebook]之菜鸟安装[pyecharts]中Geo或Map显示问题

作为菜鸟&#xff0c;在学习使用pyecharts模块进入jupyter notebook的时候&#xff0c;又遇到了问题——那就是&#xff0c;可以使用一下代码&#xff0c;导入Geo和Map模块&#xff0c;但是弄了之后看不见地图。 from pyecharts import Geo from pyecharts import Map 所以&…

c语言多线程mysql_多线程读写mysql数据库

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼unsigned int __stdcall scan(PVOID pM){char ip[20];strcpy(ip, (char*)pM);MYSQL mysql;MYSQL_RES* result;//初始化mysql句柄mysql_init(&mysql);//连接mysql数据库if(!mysql_real_connect(&mysql,"localhost"…

[C#,Java,PHP] - IMAP文件夹名称编码和解码方法

[C#] 来源&#xff1a;http://www.oschina.net/code/snippet_110991_2237 // 编码private string IMAPEncode(string folder){string rtn "", base64;int index 0; Regex regAsis new Regex("\G(?:[\x20-\x25\x27-\x7e])"); Regex reg26 new Rege…

fzu 2150 Fire Game 【身手BFS】

称号&#xff1a;fzu 2150 Fire Game &#xff1a;给出一个m*n的图&#xff0c;‘#’表示草坪&#xff0c;‘ . ’表示空地&#xff0c;然后能够选择在随意的两个草坪格子点火。火每 1 s会向周围四个格子扩散&#xff0c;问选择那两个点使得燃烧全部的草坪花费时间最小&#xf…

K-Means聚类算法原理

来自&#xff1a;https://www.cnblogs.com/pinard/p/6164214.html K-Means算法是无监督聚类算法&#xff0c;它有很多变体。包括初始化优化K-Means&#xff0c;距离计算优化elkan K-Means算法和大样本优化Mini Batch K-Means算法。 1. K-Means原理 K-Means算法思想&#xff1a;…

safari java插件故障_safari flash插件故障怎么办 mac safari flash插件故障解决方法

近几日&#xff0c;许多网友都在关注safari flash插件故障怎么办 mac safari flash插件故障解决方法这个话题&#xff0c;那么safari flash插件故障怎么办 mac safari flash插件故障解决方法具体情况是怎么样的呢&#xff1f;safari flash插件故障怎么办 mac safari flash插件故…

Traveller项目介绍

Traveller&#xff0c;翻译为旅行家&#xff0c;是我用来实践最佳web技术的项目&#xff0c;主题是一个给旅行爱好者提供旅行信息的网站。 目标是组合现最流行的web技术&#xff0c;实现符合中国用户使用习惯的网站。 相关网址 Git&#xff1a;https://github.com/mingziday/Tr…