xkang 发表于 2018-10-24 16:42

IOS WeChat & Frida 逆向(一)

一想到写图文就瑟瑟发抖,耗费大量时间,还。。。还没人看{:6_205:}
Hmmm,一句话叫 Android日不动就去IOS日,总有一个能日的他服服帖帖{:6_225:}

废话不多说,本次教程包括基础环境搭建和使用HOOK实现修改WeChat运动步数

因为代码量以及分析量巨大所以一篇讲不完分开讲
PS:真实原因我。。。我懒啊

教程目录:
(一)环境搭建以及实现步数修改
(二)实现自动抢红包
(三)实现消息防撤回
实现环境:
1.越狱iPhone一台以及Mac一台(黑苹果也行)
2.Xcode(貌似只有Mac版)
3.Frida(HOOK工具)
4.了解Objective-C 以及JS
5.Class-Dump (Dump Header)
6.砸壳工具(因为从App Store下载的应用都是加过一层保护壳的,也就是加密的)
7.MonkeyDev
8.Hopper(或者IDA)

首先iPhone越狱这个就不多讲了大家都会得嘛
安装Frida这个也不讲了请看我之前的帖子:安卓逆向——Frida Hook入门教学
https://www.52hb.com/thread-39372-1-1.html
(出处: 吾爱汇编论坛)
此处只需要安装即可不需要下载Frida-Server
在iPhone安装Frida越狱后打开Cydia
然后添加安装源:https://build.frida.re成功后搜索Frida点击安装即可
然后iPhone USB连接电脑终端输入frida-ps -Uai

这样就可以看到手机里的所有进程了

Class-Dump 下载:http://stevenygard.com/projects/class-dump/ 选择相应版本安装
砸壳工具下载:https://github.com/AloneMonkey/frida-ios-dump
或者更简单的去PP助手下载已经砸壳的软件即可

MonkeyDev安装:https://github.com/AloneMonkey/MonkeyDev 跟着教程走没啥难点

Xcode百度下载安装或者用App Store下载挺大的。。。。

Hopper用于反编译分析 也可以用IDA看自己喜欢

下面开干
砸壳好的然后在解压 得到一下几个文件Payload里面是我们需要分析的WeChat主文件


class-dump 头文件终端输入class-dump -HXXX.app即可也就是WeChat
然后进入文件夹 搜索相关StepCount(步数)最终找到这个头文件:WCDeviceStepObject.h
//
//   Generated by class-dump 3.5 (64 bit) (Debug version compiled Sep 17 2017 16:24:48).
//
//   class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2015 by Steve Nygard.
//

#import <MMCommon/MMObject.h>

@class NSMutableArray;

@interface WCDeviceStepObject : MMObject
{
    unsigned int beginTime;
    unsigned int endTime;
    unsigned int m7StepCount;
    unsigned int hkStepCount;
    NSMutableArray *allHKSampleSource;
}

@property(retain, nonatomic) NSMutableArray *allHKSampleSource; // @synthesize allHKSampleSource;
@property(nonatomic) unsigned int hkStepCount; // @synthesize hkStepCount;
@property(nonatomic) unsigned int m7StepCount; // @synthesize m7StepCount;
@property(nonatomic) unsigned int endTime; // @synthesize endTime;
@property(nonatomic) unsigned int beginTime; // @synthesize beginTime;
- (void).cxx_destruct;

@end

我们可以看到与步数相关的有两个
@property(nonatomic) unsigned int hkStepCount; // @synthesize hkStepCount;
@property(nonatomic) unsigned int m7StepCount; // @synthesize m7StepCount;
暂时不能确定是哪个   先去看看分析   将Payload里的WeChat拖进Hopper或者IDA
可以看到伪OC代码
unsigned long -(void * self, void * _cmd) {
    r0 = self->m7StepCount;
    return r0;
}

unsigned long -(void * self, void * _cmd) {
    r0 = self->hkStepCount;
    return r0;
}

发现其都返回R0   这样就没办法直接判断谁是的了只能都HOOK才能判断出来   

接下来编写HOOK代码我们用Frida 去做其实使用MonkeyDev会快很多简单很多 贴一下代码吧不做解释
CHDeclareClass(WCDeviceStepObject)

CHOptimizedMethod0(self, unsigned int, WCDeviceStepObject, m7StepCount){
   
    //返回类型unsigned int
    return 18888;
   
}
CHConstructor{
   
    NSLog(INSERT_SUCCESS_WELCOME);
    CHHook0(WCDeviceStepObject,m7StepCount);
}

还是来看frida怎么做
JS 代码实现部分
if (ObjC.available)
{
    try
    {
      var className = "WCDeviceStepObject";//类名
      var funcName = "- m7StepCount";//方法名主要方法名一定要全 注意名字前面的"-"
      var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');
      console.log("[*] Class Name: " + className);
      console.log("[*] Method Name: " + funcName);
      Interceptor.attach(hook.implementation, {
          onEnter: function(args) {//函数索引是从0开始算的
            console.log("param:"+args+" type:"+typeof args);
          },
          onLeave: function(retval) {
            console.log("retval:"+retval+" type:"+typeof retval);//retval 永远是一个对象
            newretval=ptr("0x5000");//注意此处为NativePointer,并非实际的步数值真实值为unsigned int型            retval.replace(newretval);
            console.log("New retval-> type:"+typeof args+" value:"+newretval);
            send(newretval);
          }
      });

    }
    catch(err)
    {
      console.log("[!] Exception2: " + err.message);
    }
}
else
{
    console.log("Objective-C Runtime is not available!");
}




最后全部代码:
import frida
import sys

session = frida.get_usb_device().attach(59390)//PIDfrida-ps-Uai
script_string = """
if (ObjC.available)
{
    try
    {
      var className = "WCDeviceStepObject";
      var funcName = "- m7StepCount";
      var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');
      console.log("[*] Class Name: " + className);
      console.log("[*] Method Name: " + funcName);
      Interceptor.attach(hook.implementation, {
          onEnter: function(args) {
            console.log("param:"+args+" type:"+typeof args);
          },
          onLeave: function(retval) {
            console.log("retval:"+retval+" type:"+typeof retval);
            newretval=ptr("0x5000");
            retval.replace(newretval);
            console.log("New retval-> type:"+typeof args+" value:"+newretval);
            send(newretval);
          }
      });

    }
    catch(err)
    {
      console.log("[!] Exception2: " + err.message);
    }
}
else
{
    console.log("Objective-C Runtime is not available!");
}
"""


script = session.create_script(script_string)


def on_message(message, data):
    if message['type'] == 'error':
      print("[!] " + message['stack'])
    elif message['type'] == 'send':
      print(" " + message['payload'])
    else:
      print(message)


script.on('message', on_message)
script.load()
sys.stdin.read()

保存为XX.py然后终端运行一下就OK了
上效果图PS:我那天去西天顺便取了经{:6_216:}

下一篇讲使用Frida 实现自动抢红包

不求别的麻烦各位大佬   进来看看可好{:6_218:}

hackysh 发表于 2022-2-11 18:56


[快捷回复]-感谢楼主热心分享!

李沉舟 发表于 2018-10-24 17:09

安卓日不动就去日ios,是指移动端的加密技术还没有发展到pc这种水平是吗?

syzh802618 发表于 2018-10-25 08:27

感谢楼主分享

xkang 发表于 2018-10-25 09:27

本帖最后由 xkang 于 2018-10-25 09:28 编辑

李沉舟 发表于 2018-10-24 17:09
安卓日不动就去日ios,是指移动端的加密技术还没有发展到pc这种水平是吗?
移动端加密技术距离PC端还差那么一截但也各有千秋Android方面某些加密技术还是很成熟的

Shark恒 发表于 2018-10-25 11:38

xkang 发表于 2018-10-25 09:27
移动端加密技术距离PC端还差那么一截但也各有千秋Android方面某些加密技术还是很成熟的
成熟也和PC没法比。安卓相对来讲还是比较弱的。不过安卓使用率似乎目前更高一些

gxcz123 发表于 2018-10-25 14:58

IOS现在没什么人越狱,还真的很少见人破这个平台

xkang 发表于 2018-10-26 09:06

gxcz123 发表于 2018-10-25 14:58
IOS现在没什么人越狱,还真的很少见人破这个平台

也可以非越狱开发

xkang 发表于 2018-10-26 09:07

Shark恒 发表于 2018-10-25 11:38
成熟也和PC没法比。安卓相对来讲还是比较弱的。不过安卓使用率似乎目前更高一些

哈哈哈哈   国内PC国外Android

拿着雪糕 发表于 2022-2-10 22:10

学习大佬经验
页: [1] 2 3
查看完整版本: IOS WeChat & Frida 逆向(一)