原因是:系统日历设置为佛历
就是下面截图这个设置
怎么解决
1.先看蚂蚁的代码怎么判断的到期时间
先看关键代码
r13 = [[NSDate date] retain];
rbx = [[NSDateFormatter alloc] init];
[rbx setDateFormat:@"yyyy-MM-dd", 0x4];
var_1070 = rbx;
var_1040 = r13;
rax = [rbx stringFromDate:r13, 0x4];
2.可以看到没有把佛历转为公历
3.debug代码
传入的没问题,格式化后出现了问题
4.如何修改: hook NSDateFormatter一个方法即可
.h
//
// NSDateFormatter+PC.h
//
//
// Created by YYY on 2021/3/17.
// Copyright © 2021 Alibaba. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSDateFormatter (PC)
@end
NS_ASSUME_NONNULL_END
.m
//
// NSDateFormatter+PC.m
//
//
// Created by YYY on 2021/3/17.
// Copyright © 2021 Alibaba. All rights reserved.
//
#import "NSDateFormatter+PC.h"
#import <objc/runtime.h>
@implementation NSDateFormatter (PC)
+ (void)load{
Method originalMethod = class_getInstanceMethod([self class], @selector(stringFromDate:));
Method swizzledMethod = class_getInstanceMethod([self class], @selector(stringFromDateS:));
method_exchangeImplementations(originalMethod, swizzledMethod);
}
-(NSString *)stringFromDateS:(NSDate *)date{
// Printing description of date:
// 2021-03-17 08:33:54 +0000
NSString * dateL = [self stringFromDateS:date];
// Printing description of dateL:
// 2564-03-17 16:33:54:223
NSString *localIdentifierStr = [[NSLocale currentLocale] localeIdentifier];
//zh_CN@calendar=buddhist//佛教日历
//zh_CN@calendar=japanese//日本日历
//zh_CN//公历
//可能还有其他的
if ([localIdentifierStr containsString:@"buddhist"]) {
//如果是佛历 进行处理
NSDateFormatter *dateFormatter = self;
//单纯的写zh_CN
//th_TH(泰国就是用的佛历不用考虑)
//identifierArr 904个
NSArray *identifierArr = [NSLocale availableLocaleIdentifiers];
//语言就不判断了
NSArray *languageArr = [NSLocale preferredLanguages];
if ([identifierArr containsObject:@"zh"]||
[identifierArr containsObject:@"zh_Hans"]||
[identifierArr containsObject:@"zh_Hans_MO"]||
[identifierArr containsObject:@"zh_Hant"]||
[identifierArr containsObject:@"zh_Hans_HK"]||
[identifierArr containsObject:@"zh_Hant_TW"]) {
//包含中国则设置为中国 否则不变
[dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"zh_CN"]];
}
NSString *currentDateStr = [dateFormatter stringFromDateS:date];
return currentDateStr;
// Printing description of currentDateStr:
// 2021-03-17 16:47:22:656
}else{
return dateL;
}
}
@end
附:验证的完整代码
int _verifyLicense() {
rbx = [[NSBundle mainBundle] retain];
r12 = [[rbx infoDictionary] retain];
[rbx release];
rax = [r12 objectForKey:@"mPaaSLicense"];
rax = [rax retain];
var_1090 = rax;
r13 = [[rax objectForKey:@"SafeKeyboard"] retain];
var_1038 = r12;
r12 = [[r12 objectForKey:@"CFBundleIdentifier"] retain];
rbx = [r13 objectForKey:@"ExpireDate"];
r14 = [rbx retain];
objc_storeStrong(_s_safeKeyboardExpireDateStr, rbx);
var_1060 = r13;
rbx = [[r13 objectForKey:@"Trial"] retain];
var_1088 = r12;
var_1058 = r14;
var_1050 = rbx;
rax = [NSString stringWithFormat:@"%@%@%@%@%@", r12, @"SafeKeyboard", r14, @"1", rbx];
rsp = (rsp - 0x10) + 0x10;
rax = [rax retain];
rax = objc_retainAutorelease(rax);
var_1048 = rax;
rbx = [rax UTF8String];
CC_MD5(rbx, strlen(rbx), &var_1030);
r12 = [[NSMutableString stringWithCapacity:0x20] retain];
r14 = 0xfffffffffffffff0;
do {
rcx = *(int8_t *)(rbp + r14 + 0xffffffffffffefe0) & 0xff;
[r12 appendFormat:@"%02x", rcx, @"SafeKeyboard"];
r14 = r14 + 0x1;
} while (r14 != 0x0);
[var_1048 release];
rax = objc_retainAutorelease(r12);
var_1048 = rax;
var_1040 = [rax cStringUsingEncoding:0x4, rcx];
rbx = [[var_1060 objectForKey:@"Key", rcx] retain];
rax = [NSData alloc];
rcx = 0x0;
var_1080 = rbx;
rdx = rbx;
r13 = [[rax initWithBase64EncodedString:rdx options:rcx] retain];
objc_retainAutorelease(@"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArnA4bnw4akxQfIjiY8zX5WM1hmvWJVxUWR/leglkDHV2IwSNFaUn71zpK18YSSS1b/O2XJOAEeBkjF+a1Mi9hpyx2UFPA5XJRbeyzI8xY0tSpeERj3oJCsk4qlC4I3nqJNkhO3rCla6iUcp0D9mhLf1AEyUxhqVn0HHL8+m5EAKxS5KGL36GMqRNn…");
rbx = _BIO_new_mem_buf([@"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArnA4bnw4akxQfIjiY8zX5WM1hmvWJVxUWR/leglkDHV2IwSNFaUn71zpK18YSSS1b/O2XJOAEeBkjF+a1Mi9hpyx2UFPA5XJRbeyzI8xY0tSpeERj3oJCsk4qlC4I3nqJNkhO3rCla6iUcp0D9mhLf1AEyUxhqVn0HHL8+m5EAKxS5KGL36GMqRNn…" UTF8String], 0xffffffff);
if (rbx == 0x0) goto loc_1000beef2;
loc_1000bee66:
var_1030 = 0x0;
rdx = 0x0;
rcx = 0x0;
rax = _PEM_read_bio_RSA_PUBKEY(rbx, &var_1030, rdx, rcx);
var_1030 = rax;
if (rax == 0x0) {
printf("Failed to create RSA");
}
_BIO_free_all(rbx);
rbx = 0x0;
if (rbx == 0x0) goto loc_1000bef00;
loc_1000beea6:
var_1030 = 0x0;
rdx = 0x1000;
memset(&var_1030, 0x0, rdx);
if ([r13 length] << 0x3 <= sign_extend_64((*(int32_t *)(*(rbx + 0x20) + 0xc) << 0x5) + 0xffffffe0)) goto loc_1000bf112;
loc_1000beee9:
rdi = cfstring_R;
goto loc_1000bef07;
loc_1000bef07:
r12 = 0x0;
NSLog(rdi);
goto loc_1000bef11;
loc_1000bef11:
var_1078 = r13;
[r13 release];
r14 = objc_retainAutorelease([[NSString alloc] initWithData:r12 encoding:0x4]);
if (strcmp(var_1040, [r14 cStringUsingEncoding:0x4, 0x4]) != 0x0) {
NSLog(cfstring___hQ___v_);
r13 = 0xffffffff;
r15 = var_1038;
}
else {
r13 = [[NSDate date] retain];
rbx = [[NSDateFormatter alloc] init];
[rbx setDateFormat:@"yyyy-MM-dd", 0x4];
var_1070 = rbx;
var_1040 = r13;
rax = [rbx stringFromDate:r13, 0x4];
rax = [rax retain];
rax = objc_retainAutorelease(rax);
var_1068 = rax;
sscanf([rax UTF8String], "%ld-%ld-%ld");
sscanf([objc_retainAutorelease(var_1058) UTF8String], "%ld-%ld-%ld");
rax = var_10B8;
if (rax <= 0x1f) {
rcx = var_1098;
if ((rcx <= 0xc) && (var_10A8 + var_10B0 * 0x64 + 0x0 <= rax + rcx * 0x64 + var_10A0 * 0x2710)) {
r13 = [var_1050 intValue];
}
else {
NSLog(cfstring___hQ___v_);
r13 = 0xffffffff;
}
}
else {
NSLog(cfstring___hQ___v_);
r13 = 0xffffffff;
}
r15 = var_1038;
[var_1068 release];
[var_1070 release];
[var_1040 release];
}
[r14 release];
[r12 release];
[var_1078 release];
[var_1080 release];
[var_1048 release];
[var_1050 release];
[var_1058 release];
[var_1088 release];
[var_1060 release];
[var_1090 release];
[r15 release];
if (*___stack_chk_guard == *___stack_chk_guard) {
rax = r13;
}
else {
rax = __stack_chk_fail();
}
return rax;
loc_1000bf112:
var_1030 = 0x0;
r14 = [r13 length];
rax = objc_retainAutorelease(r13);
rax = [rax bytes];
rdx = &var_1030;
rcx = rbx;
r14 = _RSA_public_decrypt(r14, rax, rdx, rcx, 0x1);
_RSA_free(rbx);
if (r14 > 0x0) {
var_1030 = 0x0;
rcx = sign_extend_64(r14);
rdx = &var_1030;
r12 = [[NSData dataWithBytes:rdx length:rcx] retain];
}
else {
r12 = 0x0;
}
goto loc_1000bef11;
loc_1000bef00:
rdi = cfstring_R;
goto loc_1000bef07;
loc_1000beef2:
printf("Failed to create key BIO");
goto loc_1000bef00;
}