App防篡改--签名校验

最近项目遇到IOS App被重签名二次打包的情况,于是研究一下App重签名方法和如何防护重签名。IOS签名校验是一个复杂的过程,但是任何系统都是有漏洞的。通过漏洞第三方可以定义App 重签名或者修改包里的资源文件甚至是代码逻辑。

重签名

1.重签名首先需要下载应用包(ipa)文件。

2.通过砸壳工具砸壳生成app文件,这里网上有很多教程。

3.通过第三方打包工具二次打包。如果没有苹果证书只有破解证书,那么二次打包的App只能在越狱设备上使用。如果想在未越狱的设备上运行,就需要一个苹果签发的证书。通配符的企业签名证书是最好的一种证书,它可以签任何Bundlid的App。
其他的二次签名方法没有研究过,但是要在未越狱设备上运行苹果签发的证书是必要。

防重签名

1.签名文件

研究了IOS 签名机制后发现签名证书文件是App里的embedded.mobileprovision 文件。
签名文件

2.文件解析

二次签名后签名文件也会比替换成二次打包的证书签名文件。
找到签名文件后,我们就想办法如何保证签名文件一致。

  1. MD5校验
    最简单的方法就是读取签名的MD5只,每次启动读取签名文件校验MD5值是否一致。多次编译签名文件不会改变,除非换证书。 这种方法过于简单除暴,不过有效。
    这是我写的一个工具读取app包的签名值。
    在这里插入图片描述
  2. 解析签名文件
    上面那种方法过于简单粗暴,如果不想换签名文件都需要改校验值的话,我们可以换一种校验方法。Bundle ID 与Team ID校验。具体方法看下面代码:
    NSMutableDictionary *outDic = [NSMutableDictionary dictionary];
   NSString *strPath = [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"];

   NSData *fileData= [NSData dataWithContentsOfFile:strPath];
   NSString *strHash =[pHash sha1String:fileData];
   
   [outDic setValue:strHash forKey:@"HASH"];
   
   NSString *rawDataString = [[NSString alloc] initWithData:fileData encoding:NSASCIIStringEncoding];
   NSRange plistStartRange = [rawDataString rangeOfString:@"<plist"];
   NSRange plistEndRange = [rawDataString rangeOfString:@"</plist>"];
   
   if (plistStartRange.location != NSNotFound && plistEndRange.location != NSNotFound) {
       
       NSString *tempPlistString = [rawDataString substringWithRange:NSMakeRange(plistStartRange.location, NSMaxRange(plistEndRange))];
       NSData *tempPlistData = [tempPlistString dataUsingEncoding:NSUTF8StringEncoding];
       NSDictionary *plistDic = [NSPropertyListSerialization propertyListWithData:tempPlistData options:NSPropertyListImmutable format:nil error:nil];
       
       NSArray *applicationIdentifierPrefix = [plistDic objectForKey:@"ApplicationIdentifierPrefix"];
       NSDictionary *entitlementsDic = [plistDic objectForKey:@"Entitlements"];
       NSString *mobileBundleID = [entitlementsDic objectForKey:@"application-identifier"];
       
       NSString *tempMobilID = [applicationIdentifierPrefix firstObject];
       
       [outDic setValue:tempMobilID forKey:@"Eid"];
       [outDic setValue:mobileBundleID forKey:@"Bid"];
   }

以上方法通过App store 的TestFlight测试和重签名检查。后续会上正式版本。如果上App store 发布后有其他问题会持续更新。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于uni-app中的表单校验,你可以使用一些常见的方法和插件来实现。 1. 使用HTML5表单属性:可以使用HTML5的表单属性来进行基本的前端校验,如`required`、`maxlength`、`minlength`等。这些属性可以在input标签中直接添加。 2. 自定义校验方法:可以使用JavaScript或Vue组件中的方法来进行自定义的校验逻辑。你可以在提交表单时触发校验方法,然后根据需求进行相应的校验逻辑,比如检查输入的格式是否正确、是否符合要求等。 3. 使用第三方校验插件:uni-app支持引入第三方校验插件来简化表单校验的过程。一些常见的插件包括VeeValidate、AsyncValidator等,它们提供了丰富的校验规则和功能,可以更高效地完成表单校验。 以下是一个使用VeeValidate进行表单校验的示例: 首先,安装VeeValidate插件: ``` npm install vee-validate ``` 然后,在你的uni-app项目入口文件中引入和配置VeeValidate: ```javascript import Vue from 'vue'; import VeeValidate from 'vee-validate'; import zh_CN from 'vee-validate/dist/locale/zh_CN'; Vue.use(VeeValidate, { locale: 'zh_CN', }); VeeValidate.Validator.localize('zh_CN', zh_CN); ``` 接下来,在你的表单组件中使用VeeValidate进行校验: ```vue <template> <form @submit="submitForm"> <input v-model="name" name="name" v-validate="'required'" :class="{ 'is-invalid': errors.has('name') }"> <span v-show="errors.has('name')" class="error">{{ errors.first('name') }}</span> <input v-model="email" name="email" v-validate="'required|email'" :class="{ 'is-invalid': errors.has('email') }"> <span v-show="errors.has('email')" class="error">{{ errors.first('email') }}</span> <button type="submit">Submit</button> </form> </template> <script> export default { methods: { submitForm() { this.$validator.validateAll().then(result => { if (result) { // 校验通过,进行表单提交操作 } }); }, }, }; </script> ``` 这是一个简单的示例,你可以根据具体的需求和业务逻辑来扩展和调整表单校验的规则和方法。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值