蚂蚁安全键盘空白或应该显示安全键盘却显示的系统键盘的问题(iOS中时间佛历如何转换为公历)

 

原因是:系统日历设置为佛历

就是下面截图这个设置

怎么解决

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;
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值