程序运行效果
这个例子是一个输入密码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去逆向定位到具体某个变量和寄存器