ios代码混淆-字符串加密的优点和其他破解方法

47 篇文章 4 订阅
22 篇文章 5 订阅

程序运行效果

这个例子是一个输入密码9527就会登录,否则显示"密码错误,重新输入"
请添加图片描述

代码使用明文字符串的缺点

oc代码

下面代码是点击登录按钮以后执行判断.

- (IBAction)btn1Click:(id)sender {
    if ([self.tf.text isEqualToString:@"9527"]){
        self.label1.text = @"请输入密码";
        VC1 *vc = [[VC1 alloc]init];
        [self.navigationController pushViewController:vc animated:true];
    }else{
        self.label1.text = @"密码错误,重新输入";
    }
}

hopper中的反汇编可以找到 “密码错误,重新输入”,如下图:
在这里插入图片描述
通过2次查看引用找到下面汇编代码
在这里插入图片描述
再向上查看,找到真实密码9527,如下图:
在这里插入图片描述
这样通过明文的字符串"密码错误,重新输入",就找到了相关代码.

把代码中的字符串加密,字符串明文用注释表示

通过 按位异或的运算规则,A^ B = C , C ^ B = A ,也就是 一个值异或固定的一个数字,连续2次,会还原会本身.

下面加密函数,同时也是解密函数

-(void)showEncryptStr:(char *) str{
    for (int i=0; i< strlen(str); i++) {
        str[i] = str[i]^9;
        printf("'%c',",str[i]);
    }
    NSLog(@"\n===============");
}

先用明文调用这个方法,然后查看打印结果:

    char str1[100] = "密码错误,重新输入";
    [self showEncryptStr:str1];

打印结果是:

'\354','\246','\217','\356','\251','\210','\340','\235','\220','\341','\246','\246','%','\340','\216','\204','\357','\237','\271','\341','\267','\232','\354','\214','\254',

把这个打印结果当成字符串存储起来,这个就是密文字符串了.然后再用加密解密函数调用一次,重新打印字符串,会发现变成明文

char str1[100] = {'\354','\246','\217','\356','\251','\210','\340','\235','\220','\341','\246','\246','%','\340','\216','\204','\357','\237','\271','\341','\267','\232','\354','\214','\254'};
    [self showEncryptStr:str1];
    NSLog(@"str1=%s",str1);
NSLog(@"str1=%s",str1);的打印结果:
str1=密码错误,重新输入

把整个程序用字符串加密重新做

注意看下面密文字符串上面用 明文写了注释,因为注释不会被编译,所以不用担心被反汇编的时候找到

- (IBAction)btn1Click:(id)sender {
    if ([self.tf.text isEqualToString:@"9527"]){
        self.label1.text = @"请输入密码";
        VC1 *vc = [[VC1 alloc]init];
        [self.navigationController pushViewController:vc animated:true];
    }else{
        //str1是"密码错误,重新输入" 注释不会被编译,所以不用担心被反汇编工具发现
        char str1[100] = {'\354','\246','\217','\356','\251','\210','\340','\235','\220','\341','\246','\246','%','\340','\216','\204','\357','\237','\271','\341','\267','\232','\354','\214','\254'};
        NSLog(@"str1=%s",str1);

        [self showEncryptStr:str1];
        self.label1.text = [NSString stringWithUTF8String:str1];
    
    }
}

打印出来str1的密文是:

str1=즏\340\235\220ᦦ%\340\216\204ᷚ쌬

使用hopper找不到字符串"密码错误,重新输入"了.如下图
在这里插入图片描述

如何破解字符串加密造成的无法定位

我们还可以通过其他方法定位,直接看hopper中的函数名和汇编代码,也可以用theos tweak 添加hook里面打印log 再用debugserver去逆向定位到具体某个变量和寄存器

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS中使用公钥字符串进行RSA加密的步骤如下: 1. 将公钥字符串转换为NSData类型。 ``` NSString *publicKeyString = @"-----BEGIN PUBLIC KEY-----\n...公钥字符串...\n-----END PUBLIC KEY-----"; NSData *publicKeyData = [publicKeyString dataUsingEncoding:NSUTF8StringEncoding]; ``` 2. 创建SecKey对象。 ``` NSMutableDictionary *publicKeyAttributes = [[NSMutableDictionary alloc] init]; [publicKeyAttributes setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; [publicKeyAttributes setObject:@(2048) forKey:(__bridge id)kSecAttrKeySizeInBits]; [publicKeyAttributes setObject:publicKeyData forKey:(__bridge id)kSecValueData]; [publicKeyAttributes setObject:(__bridge id)kSecAttrKeyClassPublic forKey:(__bridge id)kSecAttrKeyClass]; SecKeyRef publicKey; OSStatus status = SecItemAdd((__bridge CFDictionaryRef)publicKeyAttributes, (CFTypeRef *)&publicKey); ``` 3. 使用SecKey对象进行加密。 ``` NSData *plainData = [@"要加密的数据" dataUsingEncoding:NSUTF8StringEncoding]; size_t cipherBufferSize = SecKeyGetBlockSize(publicKey); uint8_t *cipherBuffer = malloc(cipherBufferSize); memset(cipherBuffer, 0, cipherBufferSize); OSStatus status = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, [plainData bytes], [plainData length], cipherBuffer, &cipherBufferSize); NSData *encryptedData = [NSData dataWithBytesNoCopy:cipherBuffer length:cipherBufferSize]; ``` 4. 释放SecKey对象。 ``` CFRelease(publicKey); ``` 注意:在iOS中使用公钥加密时,需要使用PKCS#1填充模式(kSecPaddingPKCS1)。另外,如果公钥字符串中的换行符不是`\n`,需要将其替换为`\n`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值