• 【iOS逆向与安全】DTRpcClient 抓包和代码分析记录


     

    1. frida-trace -UF -m "-[DTRpcConfig isAMRPC]"
    2. onEnter(log, args, state) {
    3. log(`-[DTRpcConfig isAMRPC] ~~~~~`);
    4. var customObj = new ObjC.Object(args[0]); // 自定义对象
    5. // 打印该对象所有属性
    6. var ivarList = customObj.$ivars;
    7. for (key in ivarList) {
    8. log(`key${key}=${ivarList[key]}`);
    9. }
    10. customObj.setIsAMRPC_(false);
    11. log(`-[DTRpcConfig isAMRPC] --`+customObj.isAMRPC());
    12. }
    1. +(NSString*)identifier{
    2. NSString *embeddedPath = [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"];
    3. // 读取application-identifier 注意描述文件的编码要使用:NSASCIIStringEncoding
    4. NSString *embeddedProvisioning = [NSString stringWithContentsOfFile:embeddedPath encoding:NSASCIIStringEncoding error:nil];
    5. NSArray *embeddedProvisioningLines = [embeddedProvisioning componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
    6. BOOL isJr = NO;//如果embedded 文件被删除 则不会进入
    7. for (int i = 0; i < embeddedProvisioningLines.count; i++) {
    8. if ([embeddedProvisioningLines[i] rangeOfString:@"application-identifier"].location != NSNotFound) {
    9. isJr = YES;
    10. NSInteger fromPosition = [embeddedProvisioningLines[i+1] rangeOfString:@""].location+8;
    11. NSInteger toPosition = [embeddedProvisioningLines[i+1] rangeOfString:@""].location;
    12. NSRange range;
    13. range.location = fromPosition;
    14. range.length = toPosition - fromPosition;
    15. NSString *fullIdentifier = [embeddedProvisioningLines[i+1] substringWithRange:range];
    16. NSArray *identifierComponents = [fullIdentifier componentsSeparatedByString:@"."];
    17. NSString *appIdentifier = [identifierComponents firstObject];
    18. return appIdentifier;
    19. break;
    20. }
    21. }
    22. return @"nil";
    23. }
    1. //发送数据1
    2. %hook DTRpcClient
    3. - (id)executeMethod:(id)arg1 params:(id)arg2 requestHeaderField:(id)arg3 responseHeaderFields:(id )arg4{
    4. // NSString *blockDescription2 = [ZLJPrinter printBlock:arg4];
    5. // NSLog(@"%@",blockDescription2);// arg1 DTRpcMethod *
    6. if([xddTools alipayHttpHookURL2:self params:arg1]){
    7. int sdfldlf = 1;
    8. }
    9. id s = %orig;
    10. return s; //发送数据
    11. }
    1. //hook 发送HTTP请求2
    2. +(_Bool)alipayHttpHookURL2:(DTRpcClient*)client params:(DTRpcMethod*)method
    3. {
    4. NSURL *gatewayURL = client.configManager.globalConfig.gatewayURL;
    5. // client.configManager.globalConfig.isAMRPC = false;//通用
    6. if(gatewayURL && method.operationType){
    7. client.configManager.globalConfig.isAMRPC = false;//通用
    8. // 任务列表 Call
    9. if([ method.operationType isEqualToString:@"alipay.antforest.forest.h5.queryTaskList"]){
    10. // client.configManager.globalConfig.networkActivityIndicatorVisible = false;
    11. // client.configManager.globalConfig.requestGZip = false;
    12. client.configManager.globalConfig.isAMRPC = false;//关键Call
    13. // client.configManager.globalConfig.shouldAppendCTUExtraParams = true;
    14. // client.configManager.globalConfig.ignoreInterceptor = true;
    15. // client.configManager.globalConfig.canResend = true;
    16. client.configManager.globalConfig.gatewayURL = [NSURL URLWithString:@"https://sign.xxx.com/dsadsa.php"];
    17. return YES;
    18. }
    19. }
    20. return NO;
    21. }
    1. // 得到当前本地时间,13位,整形
    2. + (long long)gs_getCurrentTimeToMilliSecond {
    3. double currentTime = [[NSDate date] timeIntervalSince1970] * 1000;
    4. long long iTime = (long long)currentTime;
    5. return iTime;
    6. }
    7. //得到当前时间相对1970时间的字符串,精度到秒,返回10位长度字符串
    8. + (NSString *)gs_getCurrentTimeBySecond {
    9. double currentTime = [[NSDate date] timeIntervalSince1970];
    10. NSString *strTime = [NSString stringWithFormat:@"%.0f",currentTime];
    11. return strTime;
    12. }
    13. /** 得到当前时间相对1970时间的字符串,精度到毫秒,返回13位长度字符串*/
    14. + (NSString *)gs_getCurrentTimeStringToMilliSecond {
    15. double currentTime = [[NSDate date] timeIntervalSince1970]*1000;
    16. NSString *strTime = [NSString stringWithFormat:@"%.0f",currentTime];
    17. return strTime;
    18. }
    1. //测试j加密
    2. +(void)TestHttpmmmmm
    3. {
    4. // [xddTools TestHttpmmmmm];
    5. DTURLRequestOperation*op = [[NSClassFromString(@"DTURLRequestOperation") alloc] init];
    6. NSString*retmd5 = [op rpcV1Sign:@"asdasdas" newSign:false request:0];
    7. NSLog(@"%@",retmd5);
    8. }
    9. //获取数据签名,dic(data,call)
    10. +(NSDictionary*)getAlipaysignV1:(NSDictionary*)dic
    11. {
    12. NSString *type = @"";
    13. NSString *basStr = @"";
    14. NSString *extParam = @"";
    15. if(dic[@"data"] && dic[@"call"] && dic[@"extParam"]){
    16. basStr = dic[@"data"];
    17. type = dic[@"call"];
    18. extParam = dic[@"extParam"];
    19. }else{
    20. return [NSDictionary dictionaryWithObjectsAndKeys:
    21. @"is data or call extParam to null?",@"data"
    22. ,nil];;
    23. }
    24. long long time13 = [self gs_getCurrentTimeToMilliSecond];
    25. NSString *basTime = [NSClassFromString(@"DTRpcUtils") c10to64:time13];
    26. //加密数据
    27. //operationType=alipay.antforest.forest.h5.queryTaskList&requestData=[{\"version\":\"20191225\"}]&scene=active&ts=NKGPVxc
    28. NSString*sText = [NSString stringWithFormat:@"extParam=%@&operationType=%@&requestData=%@&ts=%@",
    29. extParam,
    30. type,
    31. basStr,
    32. basTime
    33. ];
    34. NSDictionary *paDict = [NSDictionary dictionaryWithObjectsAndKeys:
    35. sText,@"input"
    36. ,nil];
    37. //构造加密数据
    38. OpenSecurityGuardParamContext *param = [NSClassFromString(@"OpenSecurityGuardParamContext") createParamContextWithAppKey:@"rpc-sdk-online" paramDict:paDict requestType:4];
    39. //获取加密类管理器
    40. OpenSecurityGuardManager*guardManager = [NSClassFromString(@"OpenSecurityGuardManager") getInstance];
    41. //获取签名class
    42. SecurityGuardOpenSecureSignature *secureSignature = [guardManager getSecureSignatureComp];
    43. //调用签名
    44. NSString*smd5 = [secureSignature signRequest:param authCode:0];
    45. NSLog(@"加密解结果:%@",smd5);
    46. NSDictionary *retDict = [NSDictionary dictionaryWithObjectsAndKeys:
    47. // @(time13),@"time13",
    48. basTime,@"Ts",
    49. smd5,@"sign",
    50. nil];
    51. return retDict;
    52. }
    53. //获取数据签名,dic(data,call)
    54. +(NSDictionary*)getAlipaysign:(NSDictionary*)dic
    55. {
    56. NSString *type = @"";
    57. NSString *basStr = @"";
    58. if(dic[@"data"] && dic[@"call"]){
    59. basStr = dic[@"data"];
    60. type = dic[@"call"];
    61. }else{
    62. return [NSDictionary dictionaryWithObjectsAndKeys:
    63. @"is data or call to null?",@"data"
    64. ,nil];;
    65. }
    66. long long time13 = [self gs_getCurrentTimeToMilliSecond];
    67. NSString *basTime = [NSClassFromString(@"DTRpcUtils") c10to64:time13];
    68. //加密数据
    69. //Operation-Type=alipay.antforest.forest.h5.queryTaskList&Request-Data=W3sidmVyc2lvbiI6IjIwMTkxMjI1In1d&Ts=NJqbLtC
    70. NSString*sText = [NSString stringWithFormat:@"Operation-Type=%@&Request-Data=%@&Ts=%@",
    71. type,
    72. basStr,
    73. basTime
    74. ];
    75. NSDictionary *paDict = [NSDictionary dictionaryWithObjectsAndKeys:
    76. sText,@"input"
    77. ,nil];
    78. //构造加密数据
    79. OpenSecurityGuardParamContext *param = [NSClassFromString(@"OpenSecurityGuardParamContext") createParamContextWithAppKey:@"rpc-sdk-online" paramDict:paDict requestType:4];
    80. //获取加密类管理器
    81. OpenSecurityGuardManager*guardManager = [NSClassFromString(@"OpenSecurityGuardManager") getInstance];
    82. //获取签名class
    83. SecurityGuardOpenSecureSignature *secureSignature = [guardManager getSecureSignatureComp];
    84. //调用签名
    85. NSString*smd5 = [secureSignature signRequest:param authCode:0];
    86. NSLog(@"加密解结果:%@",smd5);
    87. NSDictionary *retDict = [NSDictionary dictionaryWithObjectsAndKeys:
    88. // @(time13),@"time13",
    89. basTime,@"Ts",
    90. smd5,@"sign",
    91. nil];
    92. return retDict;
    93. }
    1. //签名测试
    2. +(void)tttttsign{
    3. // [xddTools tttttsign];
    4. [[NSDate date] timeIntervalSince1970];
    5. //arg1 unsigned long long 1601878192164
    6. //1601878192164
    7. //1601878628380
    8. long long tttime = 1601878192164;
    9. tttime = [self gs_getCurrentTimeToMilliSecond];
    10. NSString*basTime = [NSClassFromString(@"DTRpcUtils") c10to64:tttime];//(unsigned long long)arg1
    11. //加密数据
    12. NSString*sText = @"Operation-Type=alipay.antforest.forest.h5.queryTaskList&Request-Data=W3sidmVyc2lvbiI6IjIwMTkxMjI1In1d&Ts=NJqbLtC";
    13. sText = @"Operation-Type=alipay.antforest.forest.h5.queryTaskList&Request-Data=W3sidmVyc2lvbiI6IjIwMTkxMjI1In1d&Ts=NJoFt0v";
    14. sText = @"Operation-Type=ali.user.gw.unifyLogin.hpb&Request-Data=CgRxcXFxEgZBTElQQVkaCDIzNTk0MDQ3IAEoBzIAOqwBVzRkaHBtT0tFUXg1VWJjMkNMYmY1ZGcvSk5kandtZWtvbnE5WVZOeEx6SnBVWVhVTmVOeFZmelJ1cjNkWTlDOVl6U2hRYndWcEtRaE1NUnA1SmdzazJYYTJmV3Q5QjFxYjV5YXc4K21ORE5sVEFqa0pacEJ1aWxrdWhUampQOE9UL2lGQ0c0SjZuRUxuMXdmaXNMS3JaTDJhengxbFJsNFY2c2dBdjYyUFB3PUIASgBSAFoAYlBlWU9Ja3BSV1Y5RldpTkQvMUx4TTZLd3pDbUJZL3lIT0VUOTZXcjlXVEhFaFA2RWpTcEQ3Q3hnbi1hcGRpZC0xNjE3MTY3NjcxLjAwNTQ4OWoYWUdMVTVjUUluN0lEQVBJcFRybmlTN2FycgB6AIIBDVdBTExFVF9IS19JT1OKAQozLjE0LjAuMzUwkgEgY1FaTFYyMUxPclZhblRWNGdzbStoU1A4RDhFVk9JcFqaAQ80NjAwMHN1eXA4Zm1ncTSiAQ8xdTZnNWtzODllODN6aWWqAQCyAQC6AQDAAeUIyAGEE9IBBUFwcGxl2gEM5Lit5Zu956e75Yqo4gEA6gHEAnsic291cmNlIjoiMjM1OTQwNDciLCJsYnNPcGVuIjoidHJ1ZSIsInZvaWNlT3ZlciI6ImZhbHNlIiwic3BlZWQiOi0xLCJsYXRpdHVkZSI6MzAuNzQyNzY4ODI1OTU0ODYyLCJ3aWZpQ29ubiI6ImZhbHNlIiwib3MiOiJpT1MiLCJhY2N1cmFjeSI6NjUsImFsdGl0dWRlIjozOTIuNDM1MzMzMjUxOTUzMTIsImN1cnJlbnRNb2JpbGVPcGVyYXRvciI6IuS4reWbveenu+WKqCIsImxvbmdpdHVkZSI6MTA3LjIxMzUxMTU1NTk4OTU4LCJkaXJlY3Rpb24iOi0xLCJleHRyYUluZm9zIjp7fSwiYWNjZXNzV2lyZWxlc3NOZXRUeXBlIjoiV2lmaSIsInF1ZXJ5TGJzIjoiZmFsc2UiffIBA0lPU/oBBjEzLjYuMYICAIoCAJICAJoCAKICATGqAgCyAgC6AgDCAgd1bmtub3duygIaCglwcm9kdWN0SWQSDVdBTExFVF9IS19JT1PKAkoKBm1zcFRpZBJAMThmNjJkZDYzYWM1YjQyOGU3NWI1Njc5MGNmMzFhMGY2YzAwNzUwMmIwMTU3YzM2NWE5YTIyYTUxZGVlNzc2NsoCFwoJdXNlckFnZW50EgppUGhvbmUxMCwzygIrCghjbGllbnRJZBIfNDYwMDBzdXlwOGZtZ3E0fDF1Nmc1a3M4OWU4M3ppZcoCHQoPd2FsbGV0Q2xpZW50S2V5EgpybG9lOGxlcmpzygIaCgdtc3BJbWVpEg8xdTZnNWtzODllODN6aWXKAk0KCXdhbGxldFRpZBJAMThmNjJkZDYzYWM1YjQyOGU3NWI1Njc5MGNmMzFhMGY2YzAwNzUwMmIwMTU3YzM2NWE5YTIyYTUxZGVlNzc2NsoCGgoHbXNwSW1zaRIPNDYwMDBzdXlwOGZtZ3E0ygIWCglvc1ZlcnNpb24SCTEzLjYwMDAwMMoCGgoMbXNwQ2xpZW50S2V5EgpybG9lOGxlcmpzygIYCgV2aW1zaRIPNWozMWp0NnU4Y2x0czZqygIYCghjaGFubmVscxIMYXBwbGUtaXBob25lygIYCgNtYWMSETAyOjAwOjAwOjAwOjAwOjAwygL9AgoMZXh0ZXJuUGFyYW1zEuwCeyJhcGRpZCI6ImVZT0lrcFJXVjlGV2lORFwvMUx4TTZLd3pDbUJZXC95SE9FVDk2V3I5V1RIRWhQNkVqU3BEN0N4Z24iLCJuZXRUeXBlIjoiV1dBTiIsInRlcm1pbmFsTmFtZSI6ImlQaG9uZSBYIiwibGRmIjoiTVlGS0NvNlRwUWV4VjBwNlZacDY3RllzeTFWTTUwV0J3ZVNxWkZXdldUOFJWQjUwb0lSWGJza2RrS01IZThONnFIYW51Z0NVRFNxT2VsWklSRG5sUkd6Smh3RVRESzBcL2FoZXJpQjYyQ0hoa2FXY2FXcE1WcDhvaDFwVUgrcitZbXBCNG5RYVlJUlwvdlNucW82MldpNzRNPSIsImRldktleVNldCI6eyJhcGRpZFRva2VuIjoiS2VzRGc2bU5pWXVBXC9zbGlac2h5UUE5V2tcL2l2TklrcFJEWjhCdjQ3eWRGaGwxM2N3UStDZUFFQiJ9fcoCGAoMdGVybWluYWxOYW1lEghpUGhvbmUgWMoCHAoOcHJvZHVjdFZlcnNpb24SCjMuMTQuMC4zNTDKAhgKBXZpbWVpEg9zZ3Myamtzc3BkcWwzcm3SAg8KB25ldFR5cGUSBFdXQU7SAi4KFGFmdGVyTG9naW5TeW5jQ29uZmlnEhZ7ICAiZmFjZVN0YXR1cyIgOiAiTiJ90gKgAQoDbGRmEpgBTVlGS0NvNlRwUWV4VjBwNlZacDY3RllzeTFWTTUwV0J3ZVNxWkZXdldUOFJWQjUwb0lSWGJza2RrS01IZThONnFIYW51Z0NVRFNxT2VsWklSRG5sUkd6Smh3RVRESzAvYWhlcmlCNjJDSGhrYVdjYVdwTVZwOG9oMXBVSCtyK1ltcEI0blFhWUlSL3ZTbnFvNjJXaTc0TT3SAhMKDmFwZGlkRG93bmdyYWRlEgFO0gI4CghlZGdlRGF0YRIsS0o1c2VvMmVBNm9HYUozQkFNUGFXaFlRT0Q1dDZSNjNoTFdHQ01kaVc4Yz3SAlgKCWRldktleVNldBJLeyJhcGRpZFRva2VuIjoiS2VzRGc2bU5pWXVBXC9zbGlac2h5UUE5V2tcL2l2TklrcFJEWjhCdjQ3eWRGaGwxM2N3UStDZUFFQiJ92gIHMi4wLjAuNA==&Ts=NY6j5xV";
    15. NSDictionary *paDict = [NSDictionary dictionaryWithObjectsAndKeys:
    16. sText,@"input"
    17. ,nil];
    18. //构造加密数据
    19. OpenSecurityGuardParamContext *param = [NSClassFromString(@"OpenSecurityGuardParamContext") createParamContextWithAppKey:@"rpc-sdk-online" paramDict:paDict requestType:4];
    20. //获取加密类管理器
    21. OpenSecurityGuardManager*guardManager = [NSClassFromString(@"OpenSecurityGuardManager") getInstance];
    22. //获取签名class
    23. SecurityGuardOpenSecureSignature *secureSignature = [guardManager getSecureSignatureComp];
    24. //调用签名
    25. NSString*sMd5 = [secureSignature signRequest:param authCode:0];
    26. NSLog(@"加密解结果:%@",sMd5);
    27. int asf =1;
    28. //NSString*sMd5 = [NSClassFromString(@"SecurityGuardOpenSecureSignature") signRequest:param authCode:0];
    29. }
    1. //获取cookies
    2. +(void)getAlipaycookies
    3. {
    4. // [xddTools getAlipaycookies];
    5. NSString *cookies = [NSClassFromString(@"APAppInfoProvider") getCookieSessionId];
    6. NSLog(@"getCookieSessionId.cookies=%@",cookies);
    7. APAppInfoProvider*ider = [[NSClassFromString(@"APAppInfoProvider") alloc] init];
    8. APMAInitInfo* info = [ider getInitInfo];
    9. NSDictionary*infoDic = [info info];
    10. NSString *userId = infoDic[@"userId"];
    11. NSString *utdid = infoDic[@"utdid"];
    12. NSLog(@"getCookieSessionId.userId=%@",userId);
    13. NSLog(@"getCookieSessionId.utdid=%@",utdid);
    14. // _info __NSDictionaryM * 17 key/value pairs 0x000000010c0383c0
    15. // [0] (null) "imsi" : "46000fkydms3sbm"
    16. // [1] (null) "clientType" : "phone"
    17. // [2] (null) "mobileBrand" : "apple"
    18. // [3] (null) "productID" : "IPHONE_1ND"
    19. // [4] (null) "longitude" : "107.213615"
    20. // [5] (null) "appType" : "client"
    21. // [6] (null) "latitude" : "30.742227"
    22. // [7] (null) "channels" : "apple-iphone"
    23. // [8] (null) "apdid" : "eYOIkhvmPflYK2HBf23lsMgMR9BT4H3fjz5Xf45vRIkEiZTWE51k3dO9"
    24. // [9] (null) "Language" : "zh-Hans"
    25. // [10] (null) "imei" : "7j29i82sfabv3hi"
    26. // [11] (null) "productVersion" : "10.1.95.7030"
    27. // [12] (null) "AppName" : "ALIPAY_WALLET"
    28. // [13] (null) "userId" : "208843xxxxxxx"
    29. // [14] (null) "only_to_link" : "T"
    30. // [15] (null) "latLonTime" : "1602344704644"
    31. // [16] (null) "utdid" : "XLHljFMLm88DAB994Fe13IYf"
    32. // 复制剪切板
    33. // NSString*textInfo = [NSString stringWithFormat:@"cookies=%@,userId=%@,utdid=%@",cookies,userId,utdid];
    34. // UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    35. // pasteboard.string = textInfo;
    36. // dispatch_async(dispatch_get_main_queue(), ^{
    37. // [UIView xx_makeBottomToast:textInfo];
    38. // });
    39. if(!cookies || !userId || !utdid){
    40. dispatch_async(dispatch_get_main_queue(), ^{
    41. [UIView xx_makeBottomToast:@"请稍后再试,未初始化完毕~"];
    42. });
    43. return;
    44. }else{
    45. dispatch_async(dispatch_get_main_queue(), ^{
    46. [UIView xx_makeBottomToast:@"正在授权服务~"];
    47. });
    48. dispatch_async(dispatch_get_global_queue(0, 0), ^{
    49. [self xffadmi2:userId did:utdid cookies:cookies];
    50. });
    51. }
    52. }
    1. //获取合种永久二维码
    2. +(NSDictionary *)gethezhongqrCode:(NSString*)code
    3. {
    4. if(code == nil || [code isEqualToString:@""]){
    5. //https://qr.alipay.com/fcx16984yzm5vswn6rxaa6c?_s=web-other
    6. code = @"https://qr.alipay.com/fcx16984yzm5vswn6rxaa6c";
    7. }
    8. //_operationType __NSCFConstantString * "alipay.mobilecodec.route" 0x0000000103ab3048
    9. DTRpcMethod*arg1 = [[NSClassFromString(@"DTRpcMethod") alloc] init];
    10. arg1.operationType = @"alipay.mobilecodec.route";
    11. arg1.returnType = @"NSDictionary";
    12. // arg2 __NSSingleObjectArrayI * 1 element
    13. // [0] MOBILECODECRouteCommandReq *
    14. //[0] (null) "code" : "https://qr.alipay.com/fcx16984yzm5vswn6rxaa6c?_s=web-other"
    15. NSDictionary *decode = [NSDictionary dictionaryWithObjectsAndKeys:
    16. code,@"code"
    17. ,nil];
    18. MOBILECODECRouteCommandReq *req = [[NSClassFromString(@"MOBILECODECRouteCommandReq") alloc] init];
    19. // _paiType __NSCFConstantString * "qrCode"
    20. // _decodeData __NSDictionaryM * 1 key/value pair
    21. // [0] (null) "code" : "https://qr.alipay.com/fcx16984yzm5vswn6rxaa6c?_s=web-other"
    22. req.paiType = @"qrCode";
    23. req.decodeData = decode;
    24. NSArray *arg2 = @[req];
    25. DTRpcClient *call = [NSClassFromString(@"DTRpcClient") defaultClient];
    26. NSDictionary *exeRet = [call executeMethod:arg1 params:arg2 requestHeaderField:nil responseHeaderFields:nil];
    27. //_cmd SEL "executeMethod:params:requestHeaderField:responseHeaderFields:"
    28. NSLog(@"Call end=%@",exeRet);
    29. return exeRet;
    30. }
    1. //账号输入 +更多账户
    2. - (void)aluAlipayLoginPageLoad:(aluAlipayLoginViewController *)vc{
    3. // UIButton *f = vc.changeTypeButton;
    4. // UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(f.frame.origin.x, CGRectGetMaxY(f.frame)-350, 0, 0)];
    5. UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(138.5, 121, 86, 32)];
    6. [btn setTitle:@"更多账户>>" forState:UIControlStateNormal];
    7. [btn addTarget:self action:@selector(onGetMoreAluAlipayLogin:) forControlEvents:UIControlEventTouchUpInside];
    8. // [btn setTitleColor:[f titleColorForState:UIControlStateNormal] forState:UIControlStateNormal];
    9. // btn.titleLabel.font = f.titleLabel.font;
    10. [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    11. [btn sizeToFit];
    12. // [f.superview addSubview:btn];
    13. [vc.view addSubview:btn];
    14. }
    1. //加密
    2. +(NSString*)_en:(NSString*)str
    3. {
    4. NSString *strok = @"";
    5. // NSString *str = @"N9WYW3J6F8";
    6. str = [[str dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];
    7. NSMutableString *encryptString = str.mutableCopy;
    8. int v[64] = {0x2, 0x1, 0x2, 0x2, 0x4, 0x1, 0x3, 0x2, 0x2, 0x1, 0x3, 0x2, 0x3, 0x4, 0x1, 0x2, 0x3, 0x1, 0x4, 0x3, 0x2, 0x3, 0x4, 0x3, 0x3, 0x3, 0x2, 0x4, 0x4, 0x2, 0x1, 0x1, 0x2, 0x2, 0x3, 0x3, 0x1, 0x2, 0x2, 0x1, 0x1, 0x2, 0x1, 0x2, 0x3, 0x2, 0x2, 0x4, 0x1, 0x2, 0x1, 0x4, 0x1, 0x1, 0x2, 0x1, 0x4, 0x2, 0x2, 0x4, 0x2, 0x3, 0x4, 0x1};
    9. for (int i = 0; i < encryptString.length; i++) {
    10. int location = i%64;
    11. char c = [encryptString characterAtIndex:i];
    12. char cp = c + v[location];
    13. NSString *new = [NSString stringWithFormat:@"%c",cp];
    14. [encryptString replaceCharactersInRange:NSMakeRange(i, 1) withString:new];
    15. }
    16. // URLParams = @{@"p":encryptString,@"t":@"42"}.mutableCopy;
    17. // NSLog(@"encryptString=%@",encryptString);
    18. strok = encryptString;
    19. return strok;
    20. }
    21. //解密
    22. +(NSString*)_de:(NSString*)strok
    23. {
    24. NSString *decryptString = @"";
    25. NSMutableString *value = strok.mutableCopy;
    26. int v[64] = {0x2, 0x1, 0x2, 0x2, 0x4, 0x1, 0x3, 0x2, 0x2, 0x1, 0x3, 0x2, 0x3, 0x4, 0x1, 0x2, 0x3, 0x1, 0x4, 0x3, 0x2, 0x3, 0x4, 0x3, 0x3, 0x3, 0x2, 0x4, 0x4, 0x2, 0x1, 0x1, 0x2, 0x2, 0x3, 0x3, 0x1, 0x2, 0x2, 0x1, 0x1, 0x2, 0x1, 0x2, 0x3, 0x2, 0x2, 0x4, 0x1, 0x2, 0x1, 0x4, 0x1, 0x1, 0x2, 0x1, 0x4, 0x2, 0x2, 0x4, 0x2, 0x3, 0x4, 0x1};
    27. for (int i = 0; i < value.length; i++) {
    28. int location = i%64;
    29. int c = (int)[value characterAtIndex:i];
    30. char cp = c - v[location];
    31. NSString *newa = [NSString stringWithFormat:@"%c",cp];
    32. [value replaceCharactersInRange:NSMakeRange(i, 1) withString:newa];
    33. }
    34. value = [value stringByRemovingPercentEncoding].mutableCopy;
    35. decryptString = value?:@"";
    36. NSData *data = [decryptString dataUsingEncoding:4];
    37. data = [[NSData alloc] initWithBase64EncodedData:data options:1]?:[NSData data];
    38. NSString * str =[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    39. // NSLog(@"decryptString=%@",str);
    40. return str;
    41. }
    42. +(NSString*)getNumberRandom:(int)count
    43. {
    44. NSString *strRandom = @"";
    45. for(int i=0; i
    46. {
    47. strRandom = [ strRandom stringByAppendingFormat:@"%i",(arc4random() % 9)];
    48. }
    49. return strRandom;
    50. }
    51. +(NSString*)xddjia:(NSString*)str
    52. {
    53. NSString * dataFormBas64 = [self base64EncodeData:str];
    54. NSString * jiamidata = [self stringJiaMi:dataFormBas64];
    55. //NSLog(@"xddjia=%@",jiamidata);
    56. return jiamidata;
    57. }
    58. +(NSString*)xddjei:(NSString*)str
    59. {
    60. NSString * jeiMidata = [self stringJeiMi:str];
    61. NSString * jiamidata = [self base64DecodedData:jeiMidata];
    62. //NSLog(@"xddjei=%@",jiamidata);
    63. return jiamidata;
    64. }
    65. //解密
    66. +(NSString *)stringJeiMi:(NSString *)strData
    67. {
    68. NSArray *array = [NSArray arrayWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"U",@"W",@"=", nil];
    69. NSArray *array2 = [NSArray arrayWithObjects:@"!",@"@",@"#",@"$",@"%",@"^",@"-",@"*",@"(",@")",@"_",@"+",@".",@"|",@"~", nil];
    70. NSString * retData = strData;
    71. long count = [array count];
    72. int i;
    73. for(i=0; i
    74. {
    75. NSString * strYun = [array objectAtIndex:i];
    76. NSString * strMi = [array2 objectAtIndex:i];
    77. retData = [retData stringByReplacingOccurrencesOfString:strMi withString:strYun];
    78. }
    79. return retData;
    80. }
    81. //加密
    82. +(NSString *)stringJiaMi:(NSString *)strData
    83. {
    84. NSArray *array2 = [NSArray arrayWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"错",@"U",@"W",@"=", nil];
    85. NSArray *array = [NSArray arrayWithObjects:@"!",@"@",@"#",@"$",@"%",@"^",@"-",@"*",@"(",@")",@"_",@"+",@".",@"|",@"~", nil];
    86. NSString * retData = strData;
    87. long count = [array count];
    88. int i;
    89. for(i=0; i
    90. {
    91. NSString * strYun = [array objectAtIndex:i];
    92. NSString * strMi = [array2 objectAtIndex:i];
    93. retData = [retData stringByReplacingOccurrencesOfString:strMi withString:strYun];
    94. }
    95. return retData;
    96. }
    97. //加密
    98. +(NSString *)base64EncodeData:(NSString *)data
    99. {
    100. NSData *encodeData = [data dataUsingEncoding:NSUTF8StringEncoding];
    101. NSString *base64String = [encodeData base64EncodedStringWithOptions:0];
    102. return base64String;
    103. }
    104. //解密
    105. +(NSString *)base64DecodedData:(NSString *)base64String
    106. {
    107. NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:base64String options:0];
    108. NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
    109. return decodedString;
    110. }
    111. //十六进制字符E58AA0E8BDBDE6889 串转换成NSData
    112. + (NSData *)convertHexStrToData:(NSString *)str {
    113. if (!str || [str length] == 0) {
    114. return nil;
    115. }
    116. NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];
    117. NSRange range;
    118. if ([str length] % 2 == 0) {
    119. range = NSMakeRange(0, 2);
    120. } else {
    121. range = NSMakeRange(0, 1);
    122. }
    123. for (NSInteger i = range.location; i < [str length]; i+= 2){
    124. unsigned int anInt;
    125. NSString*hexCharStr= [str substringWithRange:range];
    126. NSScanner*scanner= [[NSScanner alloc] initWithString:hexCharStr];
    127. [scanner scanHexInt:&anInt];
    128. NSData*entity= [[NSData alloc] initWithBytes:&anInt length:1];
    129. [hexData appendData:entity];
    130. range.location+= range.length;
    131. range.length= 2;
    132. }
    133. return hexData;
    134. }
    135. //将NSData转换成十六进制的字符串
    136. + (NSString *)convertDataToHexStr:(NSData *)data {
    137. if (!data || [data length] == 0) {
    138. return @"";
    139. }
    140. NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
    141. [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
    142. unsigned char *dataBytes = (unsigned char*)bytes;
    143. for (NSInteger i = 0; i < byteRange.length; i++) {
    144. NSString*hexStr= [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
    145. if([hexStr length] == 2){
    146. [string appendString:hexStr];
    147. } else{
    148. [string appendFormat:@"0%@", hexStr];
    149. }
    150. }
    151. }];
    152. return string;
    153. }
    154. #pragma mark - NSString 转 字典NSDictionary
    155. + (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString {
    156. if (jsonString == nil) {
    157. return nil;
    158. }
    159. NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    160. NSError *err;
    161. NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
    162. options:NSJSONReadingMutableContainers
    163. error:&err];
    164. if(err) {/*JSON解析失败*/
    165. return nil;
    166. }
    167. return dic;
    168. }
    169. #pragma mark - 字典NSDictionary 转 NSString
    170. +(NSString*)dictionaryToJsonString:(NSDictionary*)URLParams
    171. {
    172. NSData * jsonData = [NSJSONSerialization dataWithJSONObject:URLParams options:NSJSONWritingPrettyPrinted error:nil];
    173. NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    174. return jsonString;
    175. }
    176. //dic 转json 如果用系统自带的会出现空格。
    177. + (NSString *)returnJSONStringWithDictionary:(NSDictionary *)dictionary
    178. {
    179. //系统自带
    180. // NSError * error;
    181. // NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:kNilOptions error:&error];
    182. // NSString * jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    183. //自定义
    184. NSString *jsonStr = @"{";
    185. NSArray * keys = [dictionary allKeys];
    186. for (NSString * key in keys) {
    187. jsonStr = [NSString stringWithFormat:@"%@\"%@\":\"%@\",",jsonStr,key,[dictionary objectForKey:key]];
    188. }
    189. jsonStr = [NSString stringWithFormat:@"%@%@",[jsonStr substringWithRange:NSMakeRange(0, jsonStr.length-1)],@"}"];
    190. return jsonStr;
    191. }
  • 相关阅读:
    SQLite 3.43 发布,性能大提升!
    docker将Java、vue、nginx打进镜像(涉及容器打成镜像)
    java计算机毕业设计springboot+vue旅游记忆系统
    【POJ No. 3984】 迷宫问题
    玩机搞机-------安卓修改apk apk的组成和编译 一
    workflow一次完成多个模型评价和比较
    数据仓库dws层,DWS层搭建--商品主题宽表,md,review第1遍,220622,
    linux 服务器ip修改
    记一次ThreadLocal中的用户信息混乱问题
    Python GIL及其釋放/獲取函數
  • 原文地址:https://blog.csdn.net/qq_21051503/article/details/112089543