iOS逆向入门实践 — 逆向微信,伪装定位(二)

iOS逆向入门实践 — 逆向微信,伪装定位(二)1.创建工程还是跟之前的步骤一致,创建工程,然后配置Makefile。注意创建工程时名字只能包含数字跟字母。Makefile上面引入的 FakeWeChatLocationManager.m 文件是主要代码实现的地方,分离出来好模块化。2.Reveal注入为了更好地定位代码,需要分析一下“附近的人”这个界面对应的类名是什么,然后进一步分析

大家好,又见面了,我是你们的朋友全栈君。

1. 创建工程

还是跟之前的步骤一致,创建工程,然后配置 Makefile。注意创建工程时名字只能包含数字跟字母。
23530make_file.png


Makefile

上面引入的 FakeWeChatLocationManager.m 文件是主要代码实现的地方,分离出来好模块化。

2. Reveal 注入

为了更好地定位代码,需要分析一下“附近的人”这个界面对应的类名是什么,然后进一步分析其实现。这时候需要用到 Reveal。

Reaveal 是一个超级强啊的 UI 分析工具。但是正常情况下,我们只能使用 Reveal 来检测调试自己的 APP,第三方的 APP 无法检测。不过,方法总比问题多。注入 Reveal 的手段就是通过编写 tweak 来链接 reveal 提供的动态库。

2.1 获取 libReveal.dylib

在 Reveal 菜单中找到 .dylib 文件:
52851reveal_menu.png

2.2 将 libReveal.dylib 导入目标的 Documents 目录

这是按照代码来确定的。导入的方式很多,可以使用PP助手也可以使用 ssh。但是毕竟PP助手,不用查找来查找去,比较直观:
60109pp.png
将库文件拖进去:
91956document.png
如果你的PP助手点开之后进入的是 APP 的安装目录而不是沙盒路径,那么就需要到 Cydia 安装一个叫 afc2add 的补丁了,解决越狱后用 usb 访问文件系统的问题。

2.3 创建 RevealUtil

代码来源于 Reveal 官网中关于安装的文档,这里将实际工作代码跟 xm 划分出来,是为了便于模块化我们的工程,让 tweak 只完成一个 hook 的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//
// RevealUtil.h
// temp
//
// Created by Pandara on 16/8/14.
// Copyright © 2016年 Pandara. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface RevealUtil : NSObject {
      
      
    void *_revealLib;
}

- (void)startReveal;
- (void)stopReveal;

@end

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
//// RevealUtil.m// temp//// Created by Pandara on 16/8/14.// Copyright © 2016年 Pandara. All rights reserved.//#import "RevealUtil.h"#import <dlfcn.h>@implementation RevealUtil- (void)startReveal {                if (NSClassFromString(@"IBARevealLoader") != nil) {                    return;    }        NSString *revealLibName = @"libReveal.dylib";    NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];    NSString *dylibPath = [documentDirectory stringByAppendingPathComponent:revealLibName];        _revealLib = NULL;    _revealLib = dlopen([dylibPath cStringUsingEncoding:NSUTF8StringEncoding], RTLD_NOW);    if (_revealLib == NULL) {                    char *error = dlerror();        NSLog(@"dlopen error: %s", error);    } else {                    //Post a notification to signal Reveal to start the service        [[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];    }}- (void)stopReveal {                if (_revealLib == NULL) {                    return;    }        [[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStop" object:nil];    if (dlclose(_revealLib) == 0) {                    _revealLib = NULL;    } else {                    char *error = dlerror();        NSLog(@"Reveal library could not be unloaded: %s", error);    }}@end

2.4 创建 Theos 工程

编写好加载 dylib 的源码之后,需要继续构建我们的 Theos 工程来 hook 住微信,好调用我们加载 Reveal 的代码。xm 文件代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
#import "RevealUtil.h"

%hook MicroMessengerAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
       
 %orig;

	RevealUtil *ru = [[RevealUtil alloc] init];
	[ru startReveal];

	return YES;
}
%end

修改 Makefile 文件,将新增的文件添加到路径指定中,链接必要的 framework 以及 libz.dylib:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
THEOS_DEVICE_IP = 192.168.31.222
ARCHS = arm64
TARGET = iphone:9.3

include $(THEOS)/makefiles/common.mk

TWEAK_NAME = RevealUtil
RevealUtil_FILES = Tweak.xm RevealUtil.m
RevealUtil_FRAMEWORKS = UIKit CFNetwork
RevealUtil_LDFLAGS = -lz

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
	install.exec "killall -9 WeChat"

最后 make package install 一条龙将包安装到机器,成功之后,只要与 iOS 设备在同一局域网下,就可以对界面进行调试了:
49239reveal_wechat.png

2.5 寻找需要 hook 住的类名以及方法名称

打开 Reveal, 查看“附近的人”对应的类名是什么:
91152reveal.png
并不能直接查找到 ViewController 对应的类名,但是可以看到这个 tableView 里面的 cell 名称有 PeopleNearBy 这样的关键词。于是猜测 ViewController 也具备这样的关键词。在之前 class-dump 出的头文件中,果然找到这样一个类 PeopleNearByListViewController,但是从头文件中没有找到什么蛛丝马迹。

思考来思考去,还是应该从 hook 住 CLLocationManager 的 startUpdatingLocation 方法入手。

3 实现 FakeLocation

代码没什么难处,源码放在了 Github 仓库 上,下面解剖一下实现思路:

3.1 设置定位

这里用了最简陋的方法,就是弹出对话框输入经纬度(因为喜欢日本,所以顺手设置了东京的经纬度为默认值),点击确定后将数据保存到 NSUserDefault 。代码就不贴了,无非就是生成一个UIAlertController 然后显示出来。需要 hook 住 MicroMessengerAppDelegate 中的didFinishLaunchingWithOptions 方法来实现。

3.2 Fake 定位信息

Fake 定位信息实际上就如同上面所说, hook 住 CLLocationManager 的startUpdatingLocation 方法,然后直接读取存在 NSUserDefault 中的经纬度,直接返回给 delegate:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
%hook CLLocationManager
- (void)startUpdatingLocation {
      
      
    CGFloat lat = [[[NSUserDefaults standardUserDefaults] objectForKey:@"PD_FAKE_LOCATION_LAT"] doubleValue];
    CGFloat lng = [[[NSUserDefaults standardUserDefaults] objectForKey:@"PD_FAKE_LOCATION_LNG"] doubleValue];
    if (lat < 0.1 || lng < 0.1) {
      
      
        lat = 35.707013;
        lng = 139.730562;
    }
    
    CLLocation *tokyoLocation = [[CLLocation alloc] initWithLatitude:lat longitude:lng];

    CLLocation *cantonLocation = [[CLLocation alloc] initWithLatitude:23.127444 longitude:113.257217];

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
      
      
        [self.delegate locationManager:self didUpdateToLocation:tokyoLocation fromLocation:cantonLocation];
    });
#pragma clang diagnostic pop
}
%end

上面我用了 GCD 来延时,是因为之前直接使用 responseToSelector 来做 delegate 判断的时候发现没有不能通过条件,难道原代码中是 startUpdateingLocation 之后再 setDelegate 的吗?

3.3 打包安装

make package install 之后,搞定,因为 hook 住的是 CLLocationManager,所以作用范围比较大,效果如下:
79259IMG_0008.PNG


设置定位

309IMG_0005.PNG


附近的人

46180IMG_0007.PNG


朋友圈定位

4. 小结

现在提到的 APP 逆向,大多都是以编写功能 tweak 为目的的。而 tweak 的核心就是 hook,为了实现 hook,我们需要知道 APP 内部的一些实现,所以需要 class-dump,还有反编译。而这两个操作的前提,就是砸壳,先把能够分析的文件弄出来再说,要不都是扯淡。砸壳可以自己砸,也可以上第三方分发渠道下载,一般都是已经砸过壳的了,能省一些功夫。现在总算是一只脚跨入了逆向的门了,嗯,还剩一只脚。

源码已经放在了 github 上,随便享用。

https://github.com/keji77/FakeWeChatLocation

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137387.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 达梦数据库_达梦的数据库什么水平

    达梦数据库_达梦的数据库什么水平达梦(DM8)数据库由实例和数据库共同组成。实例由一组正在运行的后台进程及其所fork出的一系列线程和分配内存组成。数据库是由一系列存放在操作系统上的文件组成。体系结构图大致为:本文只要针对体系结构中的实例,也就是达梦(DM8)数据库中内存结构与线程结构进行介绍。1.内存池达梦(DM8)实例内存池包括运行时内存和共享内存池组成,可以通过查询动态视图V$MEM_POOL查看当前数据库系统中所有内存池的状态:1.1共享内存池数据库运行时的主要内存池,由数据库参数文件dm.ini中的参数MEMO

    2022年10月19日
    2
  • [Err] 22001 – [SQL Server]将截断字符串或二进制数据。「建议收藏」

    [Err] 22001 – [SQL Server]将截断字符串或二进制数据。「建议收藏」问题描述:数据库插入数据时,报错[Err]22001-[SQLServer]将截断字符串或二进制数据。01000-[SQLServer]语句已终止。问题原因:添加的字符串长度,超过设置的varchar长度问题处理:减字符串长度,或增varchar长度…

    2022年10月6日
    1
  • java基本数据类型 think in java_Think in Java(一):Java基础[通俗易懂]

    java基本数据类型 think in java_Think in Java(一):Java基础[通俗易懂]一.OOP的特点(1)万物皆为对象;(2)程序是对象的集合,他们通过发送信息来告诉彼此所要做的;(3)每一个对象都有自己的由其它对象所构成的存储;(4)每一个对象都拥有它的类型;(5)某一特定类型的对象都能够接收相同的消息;二.Java比C++简单?(1)Java有垃圾回收器,不用手动销毁对象;(2)Java使用单根继承;(3)Java仅仅能以一种方式创建对象(在堆上创建);…

    2022年7月8日
    16
  • python可以自动回收垃圾吗_python多线程实现

    python可以自动回收垃圾吗_python多线程实现前言现在的高级语言如java,c#等,都采用了垃圾回收机制,而不再像c,c++里,需要用户自己管理内存。自己管理内存及其自由,可以任意申请内存,但这如同一把双刃剑,可能会造成内存泄漏,空指针等bug

    2022年7月30日
    19
  • dfile.encoding=utf-8 乱码_OrdosTF格式是什么格式

    dfile.encoding=utf-8 乱码_OrdosTF格式是什么格式解析ASN10x80问题所有X509证书都用一种ASN1格式,其为一种嵌套储存格式。ASN1规则繁琐,此文不说明,可以研究此链接。本文主要说明0x80问题,同事问起这问题,一时想不起来,现在在此备份。所有ASN1格式都是0x30开头,表示ASN1tag;0x82用来表示03C2的长度,先搁置;而03C2其用来表示后面数据长度,如下所示。308203C

    2022年9月12日
    2
  • Derek Wilson:三重缓冲,为什么我们爱它[通俗易懂]

    Derek Wilson:三重缓冲,为什么我们爱它[通俗易懂]什么是双重缓冲,垂直同步和三重缓冲?当电脑在显示器上显示东西时,它按照它的想法画一幅需要显示的图像(我们称之为缓冲区Buffer)并传输给显示器。在过去,只有一个缓冲区并不断的被电脑绘制和发送给显示器。这种做法有一些优势,但也有非常大的缺点。最值得注意的是,当物体在屏幕上进行了更新,他们往往会导致闪烁。计算机在绘制的同时发送内容。所有插图感谢劳拉.威尔逊提供。为了解决同一缓冲区

    2022年5月22日
    69

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号