2014-12-09 15:09:46 zss_ing 阅读数 4395
  • iOS逆向开发案例

    本套课程相信能够帮助到想学习逆向的你,为你节约大量的时间,将时间充分运用到实践的过程中,并非在逆向的“门前”爬坑。在这个系列里,我们从密码学入手,了解常见加密算法,通过数字签名等技术学习iOS应用签名。剖析原理,通过重签名技术绕过系统检测开启逆向之旅。

    7774 人正在学习 去看看 李文瀚

       iOS app加密&探究爱加密iOS app加密原理。做安卓开发的一定都了解有爱加密安卓加密技术以及原理,不知道的我这里重新讲解下:

        常见的安卓加密方法有:伪加密、混淆保护、运行时验证、爱加密apk加密四个方法。在这里每个方法我就不详细说了,想了解的可以看下这篇大牛的博客:http://blog.csdn.net/chengyingzhilian/article/details/38372601

        爱加密安卓应用加密原理是通过对DEX源文件进行加壳保护,隐藏源代码;对资源文件,主配置文件进行指纹校验保护,来防止二次打包。废话不多说,今天是来研究爱加密iOS app加密原理的!

        虽说安卓是开源,iOS是闭源,但是都是代码,总是有相通之处的。所以我觉得黑客的破解技术也是类似的。那么,相对应的iOS app加密原理会不会也是相似的呢?楼主也是前段时间听说爱加密出了iOS app加密,出于好奇,在他们网站潜伏了好久,研究下来iOS app加密原理,给各位iOS app开发者一个参考。都说对症下药,iOS app加密肯定也是有针对性的,他们针对的就是iOS app存在的安全风险。首先,我们来了解下iOS app存在的安全风险

         iOS app存在的安全风险包括:

        1、内购破解

        插件法(仅越狱)、iTools工具替换文件法(常见为存档破解)、八门神器修改iOS app源代码

        2、网络安全风险

        截获网络请求,破解通信协议并模拟客户端登录,伪造用户行为,对iOS app用户数据造成危害

        3、应用程序函数PATCH破解

       利用FLEX 补丁软件通过派遣返回值来对iOS app进行patch破解

        4、源代码安全风险

        通过使用ida等反汇编工具对ipa进行逆向汇编代码,导致核心代码逻辑泄漏与被修改,影响iOS app安全

        爱加密iOS app加密是针对iOS的技术原理和破解原理,分别从本地数据、方法体/方法名、URL编码、程序结构、网络传输数据等几个方面对iOS app进行加密。下面是具体解析:

        1、本地数据加密

        iOS app加密技术一:对NSUserDefaultssqlite存储文件数据加密,保护帐号和关键信息

        2URL编码加密

       iOS app加密技术二:对程序中出现的URL进行编码加密,防止URL被静态分析

       3、网络传输数据加密

       iOS app加密技术三:对客户端传输数据提供加密方案,有效防止通过网络接口的拦截获取数据

        4、方法体,方法名高级混淆

        iOS app加密技术四:对应用程序的方法名和方法体进行混淆,保证源码被逆向后无法解析代码

        5、程序结构混排加密

        iOS app加密技术五:对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低

       下面是爱加密iOS app加密前后对比图

 

        虽说爱加密iOS app加密技术没有十分高深,但至少在国内填补了iOS app加密的空白!(支持国产啊)从去年开始,移动互联网圈内涌现了不少从事移动应用安全服务的公司,其中不乏互联网大佬,这些公司更多的重心一直都在安卓应用安全,提供的服务都是为安卓应用加密服务,没有对iOS app提供安全加密服务的公司。爱加密此举可谓全球首创,勇气可嘉!

        以上只是本人在爱加密体验的一把iOS app加密,有iOS app加密需求的小伙伴们请自行前往爱加密官网-iOS app加密页面,友情告知下地址:http://www.ijiami.cn/ios

 

2018-11-28 17:17:30 li897636595 阅读数 1262
  • iOS逆向开发案例

    本套课程相信能够帮助到想学习逆向的你,为你节约大量的时间,将时间充分运用到实践的过程中,并非在逆向的“门前”爬坑。在这个系列里,我们从密码学入手,了解常见加密算法,通过数字签名等技术学习iOS应用签名。剖析原理,通过重签名技术绕过系统检测开启逆向之旅。

    7774 人正在学习 去看看 李文瀚

1、创建类 SecurityUtility
2、.h文件代码:

#import <Foundation/Foundation.h>

@interface SecurityUtility : NSObject

//SHA256加密
+ (NSString*)sha256HashFor:(NSString *)input;

@end

3、.m文件代码:

#import "SecurityUtility.h"
#import <CommonCrypto/CommonDigest.h>

@implementation SecurityUtility

//SHA256加密
+ (NSString*)sha256HashFor:(NSString*)input{
    const char* str = [input UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(str, (CC_LONG)strlen(str), result);
    
    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
    {
        [ret appendFormat:@"%02x",result[i]];
    }
    ret = (NSMutableString *)[ret uppercaseString];
    return ret;
}
@end

4、测试

NSString *str = [SecurityUtility sha256HashFor:@"dashidahsidias"];
NSLog(@"str:%@", str);

5、测试结果

str:03D8540484EEC7519B1493776B5D4159AC7631E9A52769488F796C55A3FD9136
2017-12-29 16:50:47 linlinyin1991 阅读数 1043
  • iOS逆向开发案例

    本套课程相信能够帮助到想学习逆向的你,为你节约大量的时间,将时间充分运用到实践的过程中,并非在逆向的“门前”爬坑。在这个系列里,我们从密码学入手,了解常见加密算法,通过数字签名等技术学习iOS应用签名。剖析原理,通过重签名技术绕过系统检测开启逆向之旅。

    7774 人正在学习 去看看 李文瀚

AES:对称加密算法

AES是一种对称加密算法,加密和解密密钥为同一个,密钥的长度最少支持为128、192、256,分组长度128位。

我们项目中是AES加密完成之后再用Base64加密一下,所以解密的时候就需要先解密Base64,再进行AES解密,Base64这步并不是必须的。

关键代码

//定义加密密钥长度类型
typedef NS_ENUM(NSInteger, AESType) {
    AES128 = 0,
    AES192,
    AES256
};

//AES加密实现
+ (NSString *)aesEncrypt:(NSString *)string key:(NSString *)key {
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    NSData * result = [self aes:data key:key mode:kCCEncrypt type:AES128];
    if (result.length == 0) {return @"";}
    NSString *resultStr = nil;
    NSData * aesData = [NSData dataWithBytes:(const void *)result.bytes length:result.length];
    NSData *tmpData = [aesData base64EncodedDataWithOptions:0];
    resultStr = [[NSString alloc] initWithData:tmpData encoding:NSUTF8StringEncoding];;
    if (resultStr.length == 0) {return @"";}
    return resultStr;
}
//AES解密
+ (NSString *)aesDecrypt:(NSString *)string key:(NSString *)key {
    NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];
    NSData* result = [self aes:data key:key mode:kCCDecrypt type:AES128];
    NSString * resultStr = nil;
    if (result.length == 0) {return @"";}
    resultStr = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
    if (resultStr.length == 0) {return @"";}
    return resultStr;
}
//加解密算法实现
+ (NSData *)aes:(NSData *)data key:(NSString *)key mode:(CCOperation)operation type:(AESType)type {
    NSInteger size;
    switch (type) {
        case AES128:
            size = kCCKeySizeAES128;
            break;
        case AES192: {
            size = kCCKeySizeAES192;
        }
            break;
        case AES256: {
            size = kCCKeySizeAES256;
        }
            break;
        default:
            size = kCCKeySizeAES128;
            break;
    }
    char keyPtr[size + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = data.length;
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void * buffer = malloc(bufferSize);
    size_t numBytesDecrypted = 0;
    NSString * initIv = [self iv];
    char ivPtr[size + 1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [initIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    NSData * result;
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          size,
                                          ivPtr,
                                          data.bytes,
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesDecrypted);
    if (cryptStatus == kCCSuccess) {
        result = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
        return result;

    } else {
        free(buffer);
        return nil;
    }
}

//偏移量
+ (NSString *)iv {
    if (self.aesType == AES128) {
        return @"8841054029634287";
    }
    if (self.aesType == AES192) {
        return @"884105402963428788410540";
    }
    if (self.aesType == AES256) {
        return @"88410540296342878841054029634287";
    }
    return @"";
}

源码下载链接

2015-12-23 10:26:14 CodingFire 阅读数 5588
  • iOS逆向开发案例

    本套课程相信能够帮助到想学习逆向的你,为你节约大量的时间,将时间充分运用到实践的过程中,并非在逆向的“门前”爬坑。在这个系列里,我们从密码学入手,了解常见加密算法,通过数字签名等技术学习iOS应用签名。剖析原理,通过重签名技术绕过系统检测开启逆向之旅。

    7774 人正在学习 去看看 李文瀚

**

关于iOS开发中使用到的AES加密和SHA256加密的使用

**
笔者在前段时间就这个问题跟后台的人对接了很久,最后终于确定问题是我们的加密方式虽然都为同一种,但却存在本质的区别。下面我简单描述下区别,并附上主要代码:
1. 常用AES加密说明
我们在开发中常用的AES为AES128和AES256,两者的区别在于256补码方式更加安全一点,按照一个字节为八位,采用的加密keyAES128为128/8=16位,AES256为256/8=32位,说到这里,需要注意一个参数:kCCOptionPKCS7Padding,这里java那里有多少种笔者没研究过,但是知道有另外一个叫:kCCOptionPKCS5Padding,但是iOS只有一种,也就是上面的所说的kCCOptionPKCS7Padding,那这怎么办呢?这里说下加密的key,这个参数跟加密key有关,上面有提到,AES128为16位加密key,AES256为32位加密key,正常来说,只要key满足这个要求,不管你用kCCOptionPKCS7Padding还是kCCOptionPKCS5Padding都是没区别的,但是当key少于这个数的时候,就需要进行补码了,这样区别就出来了,kCCOptionPKCS7Padding是缺几位,就补几个几,如:缺3位,补3个3,缺5位,补5个5,kCCOptionPKCS5Padding是缺几位就补几个0,如:缺3位,就补3个0.在使用中还有一个参数可以设置,iv向量,这个都是要自己设定的,也可不做设置,感兴趣的朋友可以自己去了解下iv向量,这里不做过多说明。
下面附上AES256和AES128加密代码片段供参考:

 - (NSData *)aes256_encrypt:(NSString *)key   //加密
{
    char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          keyPtr, kCCBlockSizeAES128,
                                          NULL,
                                          [self bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);
    return nil;
}
- (NSData *)AES128EncryptWithKey:(NSString *)key {//加密
    char keyPtr[kCCKeySizeAES128+1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    char ivPtr[kCCKeySizeAES128+1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          ivPtr,
                                          [self bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);
    return nil;
}

可以看到AES128有个iv向量,可手动设置。

2.下面来说下SHA256加密,这个相对于AES加密就简单很多了,百度上也有很多,但是笔者在使用的时候,从网上复制的代码,被坑的不轻,分明是SHA256,结果成了SHA的其他加密结果,看了下代码才知道原来网上的写错了,这里仅附上SHA256的代码,不多作说明。

//sha256加密方式
- (NSString *)getSha256String:(NSString *)srcString {
    const char *cstr = [srcString cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:srcString.length];

    uint8_t digest[CC_SHA256_DIGEST_LENGTH];

    CC_SHA256(data.bytes, data.length, digest);

    NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];

    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
        [result appendFormat:@"%02x", digest[i]];
    }

    return result;
}

从上述代码可以看到里面有256字样,至于SHA的其他加密方式则是直接把参数替换为对应的数字就行了,有兴趣的朋友可以在使用中自己试试。
第一次发博客,有写的不好的,还请见谅。

2018-11-19 11:35:44 u012106239 阅读数 615
  • iOS逆向开发案例

    本套课程相信能够帮助到想学习逆向的你,为你节约大量的时间,将时间充分运用到实践的过程中,并非在逆向的“门前”爬坑。在这个系列里,我们从密码学入手,了解常见加密算法,通过数字签名等技术学习iOS应用签名。剖析原理,通过重签名技术绕过系统检测开启逆向之旅。

    7774 人正在学习 去看看 李文瀚

这两天公司有这样两个需求,一个是从前端(h5)交互,获取到一个字符串,要求对这个字符串进行,SHA256计算摘要(也相当于加密),之后得到的是uint8_t类型的字节数组,然后对字节数组进行RSA公钥加密。在base64编码,返回给前端(h5 ios也是前端),最终数据还是给后台。另一个需求就是---公钥验签,就是后台给了txt文件,里面有加签和加密过的文本字符串,需要把这个文本字符串处理下,和原来数据验签,看看是不是被修改过。

1.需求一:获取去字符串----SHA256计算摘要----RSA加密---base64编码。

哈希值用作表示大量数据的固定大小的唯一值。数据的少量更改会在哈希值中产生不可预知的大量更改。所以为啥要SHA256。

SHA256的时候遇到一个坑,后台要的数据是SHA256之后的字节数组。网上大部分SHA256之后都是字符串,菜鸟,之前没了解过字节数组。

#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonHMAC.h>


- (NSData *)sha256:(NSString *)shaStr {
    NSData *data = [shaStr dataUsingEncoding:NSUTF8StringEncoding];
    uint8_t digest[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(data.bytes, (CC_LONG)data.length, digest);
    NSData *adata = [[NSData alloc] initWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
    return adata;
}

这个将 bytes-----> NSData,这个方法可以,解决后台给你的字符串中含有中文。我就是用的这个方法

- (NSString *)sha256:(NSString *)inputString{
    NSData *data = [inputString dataUsingEncoding:NSUTF8StringEncoding];
    uint8_t digest[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(data.bytes,(unsigned int)data.length,digest);
    NSMutableString *outputString = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH];
    for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
        [outputString appendFormat:@"%hhu",digest[i]];
    }
    return [outputString lowercaseString];
}

这里是将bytes数据中的数字,%hhu---数字类型,你可打印下,是一串数字。

在网上看的方法中还有转化为,%02x---16进制,然后拼接为16进制的字符串,之前我就是用的这个,怎么处理都是验签失败,因为后台要的是bytes数组。当然这个他可以转换---(此处省略--cao---)

网上还有封装好的sha1,sha256等等。可以去找找。这里sha256就弄好了。注意后台要的什么数据,鸡鸡疼。

2.接下来就是RSA加密:这里有个链接可以去下载:RSA。我用的是在网上找了一段代码,因为只要公钥加密的。

//RSA 加密
- (NSData*)rsaEncryptData:(NSData*)data {
    //获取公钥
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"aaa" ofType:@"der"];
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];
    SecKeyRef key = [self getPublicKeyRefrenceFromeData:certData];
    size_t cipherBufferSize = SecKeyGetBlockSize(key);
    uint8_t *cipherBuffer = malloc(cipherBufferSize * sizeof(uint8_t));
    size_t blockSize = cipherBufferSize - 11;
    size_t blockCount = (size_t)ceil([data length] / (double)blockSize);
    NSMutableData *encryptedData = [[NSMutableData alloc] init];
    for (int i=0; i<blockCount; i++) {
        unsigned long bufferSize = MIN(blockSize , [data length] - i * blockSize);
        NSData *buffer = [data subdataWithRange:NSMakeRange(i * blockSize, bufferSize)];
        OSStatus status = SecKeyEncrypt(key, kSecPaddingPKCS1, (const uint8_t *)[buffer bytes], [buffer length], cipherBuffer, &cipherBufferSize);
        
        if (status != noErr) {
            return nil;
        }
        
        NSData *encryptedBytes = [[NSData alloc] initWithBytes:(const void *)cipherBuffer length:cipherBufferSize];
        [encryptedData appendData:encryptedBytes];
    }
    
    if (cipherBuffer){
        free(cipherBuffer);
    }
    return encryptedData;
}

这里的公钥是后台给的。der格式证书,cer好像打不开(不确定),这个你可以让他给你der格式的公钥,不麻烦的。

SecKeyRef,这个是就公钥类行。

//根据路径的data获取本地der证书的公钥
-(SecKeyRef) getPublicKeyRefrenceFromeData:(NSData*)derData
{
    SecCertificateRef myCertificate = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)derData);
    SecPolicyRef myPolicy = SecPolicyCreateBasicX509();
    SecTrustRef myTrust;
    OSStatus status = SecTrustCreateWithCertificates(myCertificate,myPolicy,&myTrust);
    SecTrustResultType trustResult;
    if (status == noErr) {
        status = SecTrustEvaluate(myTrust, &trustResult);
    }
    SecKeyRef securityKey = SecTrustCopyPublicKey(myTrust);
    CFRelease(myCertificate);
    CFRelease(myPolicy);
    CFRelease(myTrust);
    return securityKey;
}

这个方法就是获取本地公钥。网上有的是把这个公钥换成data或者是字符串了,这个看情况使用的地方。这里RSA加密就可以弄好了。

3.把加密后的数据转化为base64字符串。

static NSString *base64_encode_data(NSData *data){
    data = [data base64EncodedDataWithOptions:0];
    NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return ret;
}

把这个base64字符串传给后台或者h5传过去就可以了。

需求二,放在下篇了,要不有点乱。

ios sha256加密

阅读数 295

iOS AES 256加密

阅读数 534

ios加密

阅读数 162

ios常用加密

博文 来自: wtj900
没有更多推荐了,返回首页