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

276 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

前言

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

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

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

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

  • tweak侧的功能是hook app的原生功能
  • 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、后台Daemonblog.csdn.net/z929118967/…