本人在22年春节之前,从事iOS开发工作,之后转行不再撸码。
16年接触iOS逆向,从修改系统定位,到微信、QQ自动抢红包,OC代码实现的功能基本上能搞个大概。
后因并不专门从事安全、逆向方面工作,自己研究有难度且并无实际用处,便不再继续搞iOS逆向了。
0x01 背景
之前公司使用钉钉办公,出于学习、研究、装逼的目的逆向并编写了相关代码。
PS:代码是几年前所写,这并不是一个手把手教学的帖子,仅提供代码参考。
C语言代码
// See http://iphonedevwiki.net/index.php/Logos
#if TARGET_OS_SIMULATOR
#error Do not support the simulator, please use the real iPhone Device.
#endif
#import <UIKit/UIKit.h>
#pragma mark - 定义
#define kRedEnvelopTitle @"红包开关"
#define kRedEnvelopSwitch @"kRedEnvelopSwitch"
#define kLocationTitle @"位置开关"
#define kLocationSwitch @"kLocationSwitch"
#pragma mark - 设置
@interface DTSectionItem : NSObject
@property(copy, nonatomic) NSArray *dataSource; // @synthesize dataSource=_dataSource;
@end
@interface DTCellItem : NSObject
@property(copy, nonatomic) NSString *title; // @synthesize title=_title;
+ (id)cellItemForSwitcherStyleWithTitle:(id)arg1 isSwitcherOn:(_Bool)arg2 switcherValueDidChangeBlock:(id)arg3;
@end
#pragma mark - 红包
@interface DTRedEnvelopServiceIMP : NSObject
- (void)pickRedEnvelopCluster:(long long)arg1 clusterId:(id)arg2 successBlock:(id)arg3 failureBlock:(id)arg4;
@end
@interface WKBizConversation : NSObject
@property(retain, nonatomic) NSString *latestMessageJson; // @synthesize latestMessageJson=_latestMessageJson;
@end
#pragma mark - 定位
@interface LAActionResponse : NSObject
@property(copy, nonatomic) NSString *actionName; // @synthesize actionName=_actionName;
@property(copy, nonatomic) NSString *pluginName; // @synthesize pluginName=_pluginName;
@end
@interface LAActionRequest : NSObject
@property(readonly, copy, nonatomic) NSString *domain; // @synthesize domain=_domain;
@property(copy, nonatomic) NSString *url; // @synthesize url=_url;
@property(copy, nonatomic) NSDictionary *args; // @synthesize args=_args;
@property(nonatomic) __weak id ctnHandler; // @synthesize ctnHandler=_ctnHandler;
@end
#pragma mark - 设置
/// 在设置中增加抢红包开关、修改定位开关
%hook DTSettingListViewController
- (id)notificationCellItem {
BOOL redSwitchOn = [[NSUserDefaults standardUserDefaults] boolForKey:kRedEnvelopSwitch];
id redBlock = ^(DTCellItem *cellItem, id cell, UISwitch *aSwitch){
[[NSUserDefaults standardUserDefaults] setBool:aSwitch.on forKey:kRedEnvelopSwitch];
[[NSUserDefaults standardUserDefaults] synchronize];
};
DTCellItem *redItem = [NSClassFromString(@"DTCellItem") cellItemForSwitcherStyleWithTitle:kRedEnvelopTitle isSwitcherOn:redSwitchOn switcherValueDidChangeBlock:redBlock];
return redItem;
}
- (id)privacyCellItem {
BOOL locationSwitchOn = [[NSUserDefaults standardUserDefaults] boolForKey:kLocationSwitch];
id locationBlock = ^(DTCellItem *cellItem, id cell, UISwitch *aSwitch){
[[NSUserDefaults standardUserDefaults] setBool:aSwitch.on forKey:kLocationSwitch];
[[NSUserDefaults standardUserDefaults] synchronize];
};
DTCellItem *locationItem = [NSClassFromString(@"DTCellItem") cellItemForSwitcherStyleWithTitle:kLocationTitle isSwitcherOn:locationSwitchOn switcherValueDidChangeBlock:locationBlock];
return locationItem;
}
%end
#pragma mark - 红包
///定义全局红包service
static DTRedEnvelopServiceIMP *redEnvelopService = nil;
/// 初始化给红包service赋值
%hook DTRedEnvelopServiceIMP
- (id)init {
id obj = %orig;
redEnvelopService = obj;
return obj;
}
%end
///判断是否是红包消息
%hook DTConversationListDataSource
- (void)controller:(id)arg1 didChangeObject:(id)arg2 atIndex:(unsigned long long)arg3 forChangeType:(long long)arg4 newIndex:(unsigned long long)arg5 {
%orig;
BOOL switchOn = [[NSUserDefaults standardUserDefaults] boolForKey:kRedEnvelopSwitch];
if ([arg2 isKindOfClass:NSClassFromString(@"WKBizConversation")] && switchOn) {
WKBizConversation *conversation = (WKBizConversation *)arg2;
if (conversation.latestMessageJson.length > 0) {
NSData *conversationData = [conversation.latestMessageJson dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *conversationDic = [NSJSONSerialization JSONObjectWithData:conversationData options:NSJSONReadingMutableLeaves error:nil];
if (conversationDic.count > 0) {
NSString *attachmentsJson = conversationDic[@"attachmentsJson"];
if (attachmentsJson.length > 0) {
NSData *attachmentsJsonData = [attachmentsJson dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *attachmentsJsonDic = [NSJSONSerialization JSONObjectWithData:attachmentsJsonData options:NSJSONReadingMutableLeaves error:nil];
if (attachmentsJsonDic.count > 0) {
int contentType = [attachmentsJsonDic[@"contentType"] intValue];
if (contentType == 901 || contentType == 902 || contentType == 905) {
NSArray *attachments = attachmentsJsonDic[@"attachments"];
for (NSDictionary *dic in attachments) {
NSDictionary *extension = dic[@"extension"];
if (extension.count > 0) {
NSString *clusterid = extension[@"clusterid"];
long long sid = [extension[@"sid"] longLongValue];
if (clusterid.length > 0 && sid > 0) {
///调用抢红包函数
[redEnvelopService pickRedEnvelopCluster:sid clusterId:clusterid successBlock:nil failureBlock:nil];
}
}
}
}
}
}
}
}
}
}
%end
#pragma mark - 位置
%hook LAActionResponse
- (void)_callbackWithResult:(NSDictionary *)arg1 keep:(_Bool)arg2 errorCode:(long long)arg3 errorMessage:(id)arg4 {
BOOL locationSwitchOn = [[NSUserDefaults standardUserDefaults] boolForKey:kLocationSwitch];
if (!locationSwitchOn) {
%orig;
return;
}
if (![arg1 isKindOfClass:[NSDictionary class]]) {
%orig;
return;
}
if (![self.pluginName isEqualToString:@"device.geolocation"]) {
%orig;
return;
}
if (![self.actionName isEqualToString:@"get"] &&
![self.actionName isEqualToString:@"start"]) {
%orig;
return;
}
if (arg1[@"accuracy"]) {
/// 根据公司位置信息构造
NSString *latitude = @"公司纬度";
NSString *longitude = @"公司经度";
for (int i = 0; i < 7; i ++) {
///经纬度前几位写死保证能定位到公司,后几位随机生成。确保每次打卡经纬度不是一模一样的。
latitude = [NSString stringWithFormat:@"%@%d",latitude, arc4random()%10];
longitude = [NSString stringWithFormat:@"%@%d",longitude, arc4random()%10];
}
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:arg1];
[dict setValue:@"" forKey:@"address"];
[dict setValue:@"" forKey:@"city"];
[dict setValue:@0 forKey:@"cityAdcode"];
[dict setValue:@"中国" forKey:@"country"];
[dict setValue:@"" forKey:@"district"];
[dict setValue:[url=home.php?mod=space&uid=1441438]@000000[/url] forKey:@"districtAdcode"];
[dict setValue:@"" forKey:@"province"];
[dict setValue:@"" forKey:@"road"];
[dict setValue:@"" forKey:@"streetNumber"];
[dict setValue:latitude forKey:@"latitude"];
[dict setValue:longitude forKey:@"longitude"];
NSLog(@"========== arg1: %@ \n %@ \n %@", self.actionName, self.pluginName, dict);
///构造修改定位后的参数,调用原函数
%orig(dict.copy, arg2, arg3, arg4);
} else {
%orig;
}
}
%end版权声明:本文内容均来源于互联网 如有侵权联系删除