iOS小技能:【发红包】使用tweak和lua脚本结合进行实现

简介: 我们开发的大部分越狱程序,都是编译成动态链接库(`例如:介绍的越狱程序(Tweak)开发,就是动态链接库。`),然后通过越狱平台的MobileSubstrate(iOS7上叫CydiaSubstrate)来加载进入目标程序(Target),通过对目标程序的挂钩(Hook),来实现相应的功能。

前言

我们开发的大部分越狱程序,都是编译成动态链接库(例如:介绍的越狱程序(Tweak)开发,就是动态链接库。),然后通过越狱平台的MobileSubstrate(iOS7上叫CydiaSubstrate)来加载进入目标程序(Target),通过对目标程序的挂钩(Hook),来实现相应的功能。

Theos是越狱开发的主要工具,一般使用Theos中的tweak来为目标程序添加小插件,通过替换或者增加方法,达到自己的特殊目的。

接下来举个例子来让你进一步了解开发过程。

使用tweak和lua脚本结合进行实现:

  • tweak侧的功能是hookapp的原生功能
  • lua 是实现模拟用户点击
  • 通信通过剪切板
tweak 通过剪切板和lua脚本进行通信

其实后面我继续研究,把lua侧的功能全部用tweak实现了。 这里分享的是一个思路。

  • 逆向分析的工具:- 利用cy 获取对应的处理方法及利用hopper查看伪代码

I、tweak侧的步骤

1.1 步骤A1 --点击“发红包”按钮


//------------------------------执行发送红包任务--------------------------------

%hook NewMainFrameViewController
/*打开来聊天对话框 开始执行发送红包的动作A1*/
- (void)openMessageContentView:(id)arg1 
              startSendMessage:(BOOL)arg2 
                    msgWrapToAdd:(id)arg3 
                      animated:(BOOL)arg4 
         jumpToFirstUnreadNode:(BOOL)arg5 
                      indexPath:(id)arg6
{


    %log();
    %orig;
    

    if (hongbaoQueue.count <= 0) 
    {
        /* code */
        return;
    }

    UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];    
    [pasteboard setString:@"A1"];
}

%end

1.2 、步骤A2 置发送红包金额


*发红包界面*/
%hook WCRedEnvelopesMakeRedEnvelopesViewController
/*A2 步骤: 设置发送红包金额*/
- (void)viewDidLoad
{
    %log();
    %orig;

    if (hongbaoQueue.count <= 0) 
    {
        /* code */
        return;
    }
    
    NSMutableDictionary *dict = hongbaoQueue[0];
    NSString *moneyNum = dict[@"moneyNum"];
    
    NSString *string = [NSString stringWithFormat:@"%@:%@",@"A2",NON(moneyNum)];
    UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];    
    [pasteboard setString:string];
    NSLog(@"pasteboard:%@",pasteboard.string);
}

1.2.1 通知服务器红包发送成功:调用服务器接口


//点击塞钱进红包按钮
- (void)OnMakeWCRedEnvelopesButtonClick
{
    %orig;

    // //设置红包返点发送成功

    // NSLog(@"设置红包返点发送成功:%@",response);

}

1.3 A3,返回回到主界面




/*A3,从WCRedEnvelopesMakeRedEnvelopesViewController 发红包界面返回回到主界面   */
- (void)viewWillDisappear:(BOOL)arg1
{
    %orig;
    UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
    [pasteboard setString:@"A3"];
    NSLog(@"pasteboard:%@",pasteboard.string);
}

1.4 执行发送红包的任务 组装发送信息并 执行A1 步骤


%new 
- (void)doSendHongBaoTask
{
    NSMutableDictionary *dict = hongbaoQueue[0];
    NSString *wx_Id = dict[@"sendTo"];
    NSLog(@"发送红包对象:%@", wx_Id);
    id MainFrameLogic = [objc_getClass("MainFrameLogicController") new];
    id NewMainFrame = [objc_getClass("NewMainFrameViewController") new];

    CContactMgr *contactManager = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CContactMgr") class]];
    CContact *contact = [contactManager getContactByName:wx_Id];
            
    //页面跳转
    id data = objc_msgSend(MainFrameLogic, @selector(getSessionInfoByContact:), contact);
    objc_msgSend(NewMainFrame, @selector(openMessageContentView:startSendMessage:msgWrapToAdd:animated:jumpToFirstUnreadNode:indexPath:), data, NO, NULL, YES, NO, NULL);
}

II 、关键代码


调用新增的方法,采用运行时

  • 请求接口的例子

        id WCRedEnvelopesLogicMgr = [objc_getClass("WCRedEnvelopesLogicMgr") new];
        NSData *res = objc_msgSend(WCRedEnvelopesLogicMgr, @selector(ApiPost:Param:),@"http://=1.0.0", param);
        NSDictionary *response = [NSJSONSerialization JSONObjectWithData:res options:0 error:NULL];
  • 发送消息的例子

            NSString *fromUser = [objc_getClass("SettingUtil") getLocalUsrName:0];

            objc_msgSend(gMessageMgr, @selector(sendTextMessageFromUser:toUser:content:), fromUser, toUser, content);

2.1 满足发红包的条件,给用户发送红包


重点部分,获取发送数据的时间、和执行任务的时间

  • 只有当微信启动的时候才进行数据查询和发送
Nov  1 16:27:27 iPhone WeChat[1530] <Notice>: [RedRobert] Tweak.xm:34 DEBUG: -[<CMessageMgr: 0x16bc9d60> init]
  • 或者可以定时发送

    NSString *time =  [TaokeHttpTool getFormatCurrDatetime];
    NSLog(@"time:%@",time);
    if (![time hasPrefix:@"1623"]/* condition */)
    {
        return;

        /* code */
    }
%hook BaseMsgContentViewController


清除数据,执行下一个红包任务
==============

 (void)onBackButtonClicked:(id)arg1
{
    %log();
    %orig;

    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    [pasteboard setString:@""];
    NSLog(@"pasteboard:%@", pasteboard.string);

    if (hongbaoQueue.count > 0) {
        [hongbaoQueue removeObjectAtIndex:0];
        NSLog(@"删除成功");
    }

    //启动发红包任务队列
    if (hongbaoQueue.count > 0) {
        id WCRedEnvelopesLogicMgr = [objc_getClass("WCRedEnvelopesLogicMgr") new];
        objc_msgSend(WCRedEnvelopesLogicMgr, @selector(doSendHongBaoTask));
        NSLog(@"启动发红包任务队列");
    }
}

%end

III、see also

3.1 逆向分析笔记

  • /查看输入的密码/

%hook TenpayPasswordCtrl

- (void)numberKeyBoardClicked:(id)arg1{


    // %log();
    return %orig;
}
/*查看输入的密码*/
- (void)appendPsw:(id)arg1{
        %log();
    return %orig;

}
%end
  • lua 获取用户点击的坐标


                    --test
--获取用户点击的坐标 
         -- x,y = catchTouchPoint();

        -- sysLog("tcatchTouchPoint"..x..","..y);



        --end test
         x,y = catchTouchPoint();--等待用户输入

3,2 本文涉及的主要类

#"<WCRedEnvelopesMakeRedEnvelopesViewController: 0x18c3c200>"
  • 点击 塞钱进红包
OnMakeWCRedEnvelopesButtonClick
  • 创建订单数据

WCRedEnvelopesControlData setM_dicPrepayRequestOrderInfo:

  • 发红包界面
%hook WCRedEnvelopesMakeRedEnvelopesViewController

3.3 其他参考

iOS程序类型:Application、Dynamic Library、后台Daemonhttp://blog.csdn.net/z929118967/article/details/76914929

目录
相关文章
|
6月前
|
存储 NoSQL Redis
Redis的Lua脚本有什么作用?
Redis Lua脚本用于减少网络开销、实现原子操作及扩展指令集。它能合并操作降低网络延迟,保证原子性,替代不支持回滚的事务。通过脚本,代码复用率提高,且可自定义指令,如实现分布式锁,增强Redis功能和灵活性。
251 1
|
5月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
228 0
|
1月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
29 2
|
2月前
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
3月前
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
|
6月前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
228 0
|
6月前
|
算法 NoSQL Java
springboot整合redis及lua脚本实现接口限流
springboot整合redis及lua脚本实现接口限流
266 0
|
5月前
|
JSON 监控 数据格式
使用Lua代码扩展上网行为管理软件的脚本功能
本文介绍了如何使用Lua脚本增强上网行为管理,包括过滤URL、记录用户访问日志、控制带宽和自动提交监控数据到网站。Lua是一种轻量级语言,适合编写扩展脚本。文中提供多个示例代码,如URL过滤器、用户活动日志记录器和带宽控制器,帮助用户根据需求定制网络管理功能。通过这些示例,用户可以快速掌握Lua在上网行为管理中的应用。
174 4
|
5月前
|
NoSQL API Redis
使用Redis Lua脚本实现高级限流策略
使用Redis Lua脚本实现高级限流策略
199 0
|
5月前
|
消息中间件 NoSQL Java
Spring Boot中使用Redis和Lua脚本实现延时队列
Spring Boot中使用Redis和Lua脚本实现延时队列
下一篇
无影云桌面