吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13799|回复: 31
收起左侧

[iOS 原创] iOS 逆向学习QQ自动发消息

  [复制链接]
ShawnJi 发表于 2018-11-9 14:16
本帖最后由 ShawnJi 于 2019-8-7 16:36 编辑

iOS逆向_QQ自动发消息

[toc]

工具、开发环境
  • reveal
  • IDA Pro
  • class-dump
  • QQ(7.1.0PP助手上下载的脱壳版,当然appStore下载的QQ需要自己砸壳)
  • 测试环境:iphone6p,ios8.3
正题开始
1、准备工作:砸壳 、导出ipa到电脑 、class-dump导出头文件、IDA加载可执行文件

clutch砸壳:

               1、将下载好的clutch文件用pp助手copy到手机` /usr/bin/` 目录下   

               2、ssh到越狱手机上:`ssh root@你手机的ip`        

               3、`clutch -i `    //终端上将会列出手机上所有安装的未砸壳的app并带有序号

               4、根据你要砸壳的app序号砸壳即可:`clutch -d`    //d为app序号

               5、砸壳结束终端将会显示砸壳后的ipa存放的目录,用pp助手到相应目录将ipa导出即可

class-dump导出头文件:

                1、右击砸壳后的ipa包,打开方式-->归档实用工具-->解压后可以看到一个payload文件夹

                2、cd到payload目录下然后:`class-dump -H QQ.app -o QQ`//在payload目录下会生成一个QQ目录即为头文件

END:准备工作完毕。

2、从界面表现入手,寻找分析的一个切入点

1、手机打开QQ聊天室页面,电脑打开reveal,查看聊天页面的控制器:QQChatViewController

    ![reveal.png](https://github.com/ShawnJiFreeMan/AutoSendQQMsg/tree/master/image/reveal.png)

2、打开QQ头文件搜索QQChatViewController,在QQChatViewController下搜索关于发消息的关键词:message\msg\send..
发现一个可疑的函数:

   `- (_Bool)doSendTextMsg:(id)arg1 showText:(id)arg2 isLocation:(_Bool)arg3 resendModel:(id)arg4 hideFakeMsg:(_Bool)arg5;`

  发送一个消息发现arg2就是消息内容

3、在ida内搜索 QQChatViewController doSendTextMsg 方法

  ![ida1.png](https://github.com/ShawnJiFreeMan/AutoSendQQMsg/tree/master/image/ida1.png)

 从ida中发现首先初始化了一个QQMessageModel的类并设置了一系列属性,这里并不急着看到底设置了哪些属性继续向下看
  找到是谁调用了这个QQMessageModel,hook一下这个调用函数添加打印,发送一个消息看看打印信息里QQMessageModel
  的属性怎么设置自然就知道了 
3、hook发现的一些类,运用logify打印记录参数以及调用顺序
  • QQMessageModel //消息model
  • CIMEngine //调用其GetServerTimeDiff方法用于生成发送时间
  • QQMsgSyncManager //调用其getC2CSendMessageRandom方法用于生成MessageRandom,调用其getC2CSendMessageSeq方法用于生成MsgSeq
  • QQPlatform,C2CDBService_MultiTable,QQChatListManager...
  • 重点:QQF2FMessageSender类用于发送消息
4、制作插件
自动发消息核心代码:
    QQMessageModel *msgModel = [[%c(QQMessageModel) alloc] init];
    [msgModel setContent:@"AutoSendMsg"];
    [msgModel setLoadingState:YES];
    long long sendTime = [[%c(CIMEngine) GetInstance] GetServerTimeDiff];
    [msgModel setTime:sendTime];
    [msgModel setInOut:NO];
    [msgModel setRead:0];
    [msgModel setMsgType:0];
    [msgModel setMsgState:1];

    [msgModel setUin:@"这里是你发送对象的QQ号"];

    unsigned int msgRadom = [[%c(QQMsgSyncManager) sharedInstance] getC2CSendMessageRandom];
    [msgModel setMessageRandom:msgRadom];

    unsigned short msgSeq = [[%c(QQMsgSyncManager) sharedInstance] getC2CSendMessageSeq:[[msgModel uin] longLongValue]];
    [msgModel setMsgSeq:msgSeq];

    [msgModel setMsgUid:[%c(QQMessageModel) randomToUid:msgRadom]];

    QQPlatform *platform = [%c(QQPlatform) sharedPlatform];
    QQServiceCenter *serviceCenter = [platform QQServiceCenter];

    C2CDBService_MultiTable *multiTablwDB = [serviceCenter C2CMultiTableDB];
    [multiTablwDB insertSendMessage:msgModel];

    QQChatListManager *listManager = [[%c(QServiceFactory) sharedFactory] getMessageListService];
    [listManager addMessage:msgModel];

    [[%c(QQF2FMessageSender) getInstance] sendPbTextMessage:msgModel shareAppInfo:nil];

免费评分

参与人数 6吾爱币 +12 热心值 +6 收起 理由
暮寒 + 1 + 1 用心讨论,共获提升!
蹦达达 + 1 热心回复!
qtfreet00 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lookerJ + 1 热心回复!
沐澜祤 + 1 + 1 虽然看不懂但很流弊的样子
Cyntec + 1 + 1 能否做一期详细的图文教程,讲解一下后面插件制作的详情?

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

PJGeek 发表于 2018-11-9 14:46
看不懂 帮顶~
13551494196 发表于 2018-11-9 15:52
 楼主| ShawnJi 发表于 2018-11-9 15:58
本帖最后由 ShawnJi 于 2018-11-9 16:00 编辑
13551494196 发表于 2018-11-9 15:52
代码里面怎么还有表情

:符号,可能是识别错误
涵辰 发表于 2018-11-9 17:11
逆向学了半个月了,还是啥都不懂
jimo 发表于 2018-11-9 18:08
iOS逆向。很强的
cai_zm 发表于 2018-11-9 23:26
收下了。谢谢分享
zhangbaoyu 发表于 2018-11-10 00:16
强制临时会话 可以吗?
a1905 发表于 2018-11-10 10:17
还是啥都不懂
cfmr80 发表于 2018-11-10 17:30
再看看不然不懂啊
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 18:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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