通过Tweak工程逆向微信改变定位信息

通过Tweak工程逆向微信改变定位信息

  1. 使用 ssh 连接手机
➜  ~ ssh root@ip -p 22

# 手机要和Mac 在同一个网段
# OpenSSH 的 root 默认密码是 alpine
  1. 使用 ps -e 搜索微信进程
➜  ~ ps -e | grep WeChat 

# ps -e 查看进程
# grep 过滤
  1. 使用 Cycript 动态注入代码
  • Cycript的使用

    • 使用recursiveDescription打印UIView对象
    [[UIApp keyWindow] recursiveDescription].toString()
    或者
    UIApp.keyWindow.recursiveDescription().toString()
    // 还可以借助View的nextResponder进行Controller的定位
    cy# [#0x14eb4ff30 nextResponder]
    
    • _printHierarchy - 直接打印所有UIViewController
    [[[UIWindow keyWindow] rootViewController] _printHierarchy].toString()
    
    • _autolayoutTrace - recursiveDescription的简化版,去掉了UIView的一些描述
    [[UIApp keyWindow] _autolayoutTrace].toString()
    
    • 获取bundle info
    [[NSBundle mainBundle] infoDictionary].toString()
    
# 确保 WeChat 进程在运行
➜  ~ cycript -p WeChat 

# 通过 NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 获取微信的 documents 目录

cy# NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
@["/var/mobile/Containers/Data/Application/777CE6C7-4909-48BD-8488-437B96945AD6/Documents"]

# 使用Cycript打印当前的Controller信息
cy# [[[UIWindow keyWindow] rootViewController] _printHierarchy].toString()

`<MMTabBarController 0x14e103c00>, state: appeared, view: <UILayoutContainerView 0x14eb44120>
   | <MMUINavigationController 0x14d802800>, state: disappeared, view: <UILayoutContainerView 0x14eb08810> not in the window
   |    | <NewMainFrameViewController 0x14e0e2600>, state: disappeared, view:  (view not loaded)
   | <MMUINavigationController 0x14e0f8a00>, state: disappeared, view: <UILayoutContainerView 0x14eb342d0> not in the window
   |    | <ContactsViewController 0x14e0eb800>, state: disappeared, view:  (view not loaded)
   | <MMUINavigationController 0x14e105000>, state: appeared, view: <UILayoutContainerView 0x14ead7ae0>
   |    | <FindFriendEntryViewController 0x14e0fae00>, state: disappeared, view: <MMUIHookView 0x14ef3a5a0> not in the window
   |    | <SeePeopleNearbyViewController 0x14f1a4e60>, state: appeared, view: <UIView 0x14f0ecda0>
   | <MMUINavigationController 0x14d8a6400>, state: disappeared, view: <UILayoutContainerView 0x14eae7cd0> not in the window
   |    | <MoreViewController 0x14d8bae00>, state: disappeared, view:  (view not loaded)`

# SeePeopleNearbyViewController 是和定位最像的,也是我们之后写tweak工程的hook的对象
  1. 使用 dumpdecrypted.dylib 砸壳
# 在 GitHub 上下载dumpdecrypted 然后进入该目录下,执行 make 命令编译出 dylib
➜  git clone https://github.com/stefanesser/dumpdecrypted.git


➜  ~ cd dumpdecrypted-master
➜  ~ make 

# 将 dumpdecrypted.dylib 拷贝到手机微信的 documents 目录下进行砸壳
➜  ~ dumpdecrypted-master scp ./dumpdecrypted.dylib root@192.168.6.107:/var/mobile/Containers/Data/Application/777CE6C7-4909-48BD-8488-437B96945AD6/Documents

# dumpdecrypted.dylib 具体用法是DYLD_INSERT_LIBRARIES=/PathFrom/dumpdecrypted.dylib /PathTo

iPhone:~ root# DYLD_INSERT_LIBRARIES=/var/mobile/Containers/Data/Application/777CE6C7-4909-48BD-8488-437B96945AD6/Documents/dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/9A71740B-6F65-4827-815F-063B8BE2833C/WeChat.app/WeChat 

# 当前目录下会生成砸壳后的文件,即WeChat.decrypted, 同时把该文件拷贝到电脑上,接下来我们要正式 dump 微信的可执行文件了
➜  WeChat scp root@192.168.6.107:/var/mobile/Containers/Data/Application/777CE6C7-4909-48BD-8488-437B96945AD6/Documents/WeChat.decrypted /Users/chenzhou/Desktop/WeChat

  1. 使用 class-dump 将 oc 运行时的信息导出
# 将 WeChat.decrypted 导出 oc 运行时信息
➜  header class-dump -s -S -H WeChat.decrypted ./header

Tweak练习

1. 定位目标文件

  • ps方法
```
ps -e | grep WeChat
```
  • find方法
```
find -name sshd
```
  • 固定目录下查找

    AppStore App全部位于"/var/mobile/Containers/Bundle/Application/"下,
    系统App全部位于"/Application/"下
    
    daemon的配置文件位于
    "/System/Library/LaunchDaemons/"
    "/Library/LaunchDaemons"
    "/Library/LaunchAgents/"
    
    iPhone:/Library/LaunchDaemons root# cat com.openssh.sshd.plist
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    
    <dict>
        <key>Label</key>
        <string>com.openssh.sshd</string>
    
        <key>Program</key>
        <string>/usr/libexec/sshd-keygen-wrapper</string>
    
        <key>ProgramArguments</key>
        <array>
            <string>/usr/sbin/sshd</string>
            <string>-i</string>
        </array>
    
        <key>SessionCreate</key>
        <true/>
    
        <key>Sockets</key>
        <dict>
            <key>Listeners</key>
            <dict>
                <key>SockServiceName</key>
                <string>ssh</string>
            </dict>
        </dict>
    
        <key>StandardErrorPath</key>
        <string>/dev/null</string>
    
        <key>inetdCompatibility</key>
        <dict>
            <key>Wait</key>
            <false/>
        </dict>
    </dict>
    
    </plist>
    

2. 获取头文件信息和bundleID

  • 砸壳

  • 通过Class-dump获取头文件

  • 获取bundleID (com.tencent.xin)

    # 获取签名信息
    codesign -dvvv WeChat
    
    ➜  WeChat codesign -dvvv WeChat
    Executable=/Users/chenzhou/Desktop/WeChat/WeChat
    Identifier=com.tencent.xin
    Format=Mach-O thin (arm64)
    CodeDirectory v=20200 size=573071 flags=0x0(none) hashes=17901+5 location=embedded
    Hash type=sha256 size=32
    CandidateCDHash sha1=8d143bece3fe1119f3c20b16a176c46c9aeeb408
    CandidateCDHash sha256=536a548754f895c8bfc71f568bf915be1e7470d3
    Hash choices=sha1,sha256
    CDHash=536a548754f895c8bfc71f568bf915be1e7470d3
    Signature size=4297
    Authority=Apple iPhone OS Application Signing
    Authority=Apple iPhone Certification Authority
    Authority=Apple Root CA
    Info.plist=not bound
    TeamIdentifier=88L2Q4487U
    Sealed Resources=none
    Internal requirements count=1 size=96
    

3. 分析头文件编写tweak代码

  • 创建tweak工程

    ➜  tweak /opt/theos/bin/nic.pl
    NIC 2.0 - New Instance Creator
    ------------------------------
      [1.] iphone/activator_event
      [2.] iphone/application_modern
      [3.] iphone/cydget
      [4.] iphone/flipswitch_switch
      [5.] iphone/framework
      [6.] iphone/ios7_notification_center_widget
      [7.] iphone/library
      [8.] iphone/notification_center_widget
      [9.] iphone/preference_bundle_modern
      [10.] iphone/tool
      [11.] iphone/tweak
      [12.] iphone/xpc_service
    Choose a Template (required): 11
    Project Name (required): WeChatReProject
    Package Name [com.yourcompany.wechatreproject]: com.iosre.wechatreproject
    Author/Maintainer Name [chenzhou]: chuck
    [iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.tencent.xin
    [iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: WeChat
    Instantiating iphone/tweak in wechatreproject/...
    Done.
    
  • 编写Makefile文件

    THEOS_DEVICE_IP = 192.168.6.107
    DEBUG = 1
    ARCHS = armv7 arm64 
    TARGET = iphone:latest:8.0 
    
    include $(THEOS)/makefiles/common.mk
    
    TWEAK_NAME = WeChatReProject
    WeChatReProject_FILES = Tweak.xm
    WeChatReProject_FRAMEWORKS = UIKit
    
    include $(THEOS_MAKE_PATH)/tweak.mk
    
    after-install::
        install.exec "killall -9 WeChat"
    
    clean::
        rm -rf ./packages/*
    
  • 编写Tweak.xm

    // 通过Cycript来定位附近的人界面,一步步确定定位函数,来进行hook,修改Location信息
    #import <UIKit/UIKit.h>
    #import <CoreLocation/CoreLocation.h>
    #import <CoreLocation/CLLocation.h>
    
    @interface SeePeopleNearByLogicController
    - (void)onRetrieveLocationOK:(id)arg1;
    @end
    
    %hook  SeePeopleNearByLogicController
    
    - (void)onRetrieveLocationOK:(id)arg1 {
        CLLocation *location = [[CLLocation alloc] initWithLatitude:32.0104049582 longitude:112.1436524391];
        %orig(location);
    
        UIAlertView *alertView = [[UIAlertView alloc] 
        initWithTitle:[@"onRetrieveLocationOK" 
        stringByAppendingString:[[NSString alloc] 
        initWithFormat:@"location is %@", location]] 
        message:nil 
        delegate:self 
        cancelButtonTitle:@"ok" 
        otherButtonTitles:nil];
    
        [alertView show];
    }
    
    %end
    

4. 打包工程并安装

```
make clean 
make 
make package install 
``` 
  • 最后在附近的人里看到的信息就是CLLocation的位置的附近的人的信息
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容