吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 6384|回复: 17

[iOS逆向图文] IOS WeChat & Frida 逆向(一)

[复制链接]
xkang 发表于 2018-10-24 16:42 | 显示全部楼层 |阅读模式

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

废话不多说,本次教程包括基础环境搭建和使用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  
6B50C8BC-1698-4F27-8DD1-162AB5F74CB0.png
这样就可以看到手机里的所有进程了

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主文件
50011F53-4ACF-4E16-9CB8-D27123C1992D.png
C87BB833-334C-4EA4-864A-08D6E07DC9C9.png
class-dump 头文件  终端输入class-dump -H  XXX.app即可  也就是WeChat
然后进入文件夹 搜索相关StepCount(步数)最终找到这个头文件:WCDeviceStepObject.h
[C] 纯文本查看 复制代码
//
//     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代码
[C] 纯文本查看 复制代码
unsigned long -[WCDeviceStepObject m7StepCount](void * self, void * _cmd) {
    r0 = self->m7StepCount;
    return r0;
}


[C] 纯文本查看 复制代码
unsigned long -[WCDeviceStepObject hkStepCount](void * self, void * _cmd) {
    r0 = self->hkStepCount;
    return r0;
}


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

接下来编写HOOK代码  我们用Frida 去做  其实使用MonkeyDev会快很多  简单很多 贴一下代码吧  不做解释
[C] 纯文本查看 复制代码
CHDeclareClass(WCDeviceStepObject)

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


还是来看frida怎么做
JS 代码实现部分
[Java] 纯文本查看 复制代码
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[0]+" type:"+typeof args[0]);
          },
          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[0]+" value:"+newretval);
            send(newretval);
          }
        });

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




最后全部代码:
[Python] 纯文本查看 复制代码
import frida
import sys

session = frida.get_usb_device().attach(59390)//PID  frida-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[0]+" type:"+typeof args[0]);
          },
          onLeave: function(retval) {
            console.log("retval:"+retval+" type:"+typeof retval);
            newretval=ptr("0x5000");
            retval.replace(newretval);
            console.log("New retval-> type:"+typeof args[0]+" 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("[i] " + message['payload'])
    else:
        print(message)


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


保存为XX.py  然后终端运行一下  就OK了
上效果图  PS:我那天去西天顺便取了经
1540370241261.jpg
下一篇讲使用Frida 实现自动抢红包

不求别的  麻烦各位大佬   进来看看可好

评分

参与人数 14威望 +1 HB +58 THX +11 收起 理由
虚心学习 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
temp + 1 + 1
一个人的你好 + 1
VipDongle + 1
消逝的过去 + 1
冷亦飞 + 1
lies + 1
帅呆鹏 + 1
轮回 + 5 + 1
售野生奥特曼 + 5 + 1 [快捷评语] - 2018,狗年发发发,狗年旺旺旺!
syzh802618 + 3 + 1 [快捷评语] - 2018,狗年发发发,狗年旺旺旺!
insane + 5 + 1 惊险大佬!~~~~~~~~~~
李沉舟 + 6 + 1 [快捷评语] - 2018,狗年发发发,狗年旺旺旺!
Shark恒 + 1 + 30 + 1 不错不错,回头也学一学ios内容

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
hackysh 发表于 2022-2-11 18:56 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
李沉舟 发表于 2018-10-24 17:09 | 显示全部楼层

安卓日不动就去日ios,是指移动端的加密技术还没有发展到pc这种水平是吗?
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
syzh802618 发表于 2018-10-25 08:27 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| xkang 发表于 2018-10-25 09:27 | 显示全部楼层

本帖最后由 xkang 于 2018-10-25 09:28 编辑
李沉舟 发表于 2018-10-24 17:09
安卓日不动就去日ios,是指移动端的加密技术还没有发展到pc这种水平是吗?

移动端加密技术距离PC端还差那么一截  但也各有千秋  Android方面某些加密技术还是很成熟的
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Shark恒 发表于 2018-10-25 11:38 | 显示全部楼层

xkang 发表于 2018-10-25 09:27
移动端加密技术距离PC端还差那么一截  但也各有千秋  Android方面某些加密技术还是很成熟的

成熟也和PC没法比。安卓相对来讲还是比较弱的。不过安卓使用率似乎目前更高一些
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
gxcz123 发表于 2018-10-25 14:58 | 显示全部楼层

IOS现在没什么人越狱,还真的很少见人破这个平台
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| xkang 发表于 2018-10-26 09:06 | 显示全部楼层

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

也可以非越狱开发
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| xkang 发表于 2018-10-26 09:07 | 显示全部楼层

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

哈哈哈哈   国内PC  国外Android
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
拿着雪糕 发表于 2022-2-10 22:10 | 显示全部楼层

学习大佬经验

评分

参与人数 1HB +1 收起 理由
梯云纵 + 1

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
赞帖
2层
3层
4层
5层
6层
7层
8层
9层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表