IOS双向验证、代码注入

双向验证

首先开发者电脑上有公钥M、私钥M,苹果服务器上有私钥A(Apple),iphone手机上有公钥A,app上会附有app签名和苹果颁发的证书,他的认证过程是这样的:     

      Mac电脑(开发者)拿着公钥M通过CSR文件向苹果服务器申请证书,会把公钥M发给苹果服务器,然后苹果服务器就会给其返回一个证书,里面附了公钥M和公钥M的hash值,开发的app中附有苹果颁发的证书和通过私钥M的签名文件,当app安装到手机上时,iphone手机通过自身设备的公钥A(和苹果私钥A对应)去验证app中的证书是否合法(是否是苹果认证的),接着通过证书中的公钥M(和私钥M对应)去验证app签名是否有效(合法)双向验证是:iPhone对证书的验证(解密证书)、对app签名的验证(解密app签名)

如果只有双向验证,那么还要APPStore干嘛?用Xcode拿一个证书不就可以安装app了吗?所以苹果还加了两个限制:

第一个限制苹果后台要注册过的设备才能安装、第二个就是签名只能针对某一个具体的app

Xcode在创建项目的时候就会有一个Provisioning.Profile(描述文件)嵌入在app 中里面,有设备立列表、APPID、entitlements(权限文件)

app签名文件在app包内容下面的_Codesignature下面的CodeResources文件和MachO可执行文件内部的Code Signature字段 ,分两大块签名,一个是app包的资源文件的签名、一个是可执行文件的签名。

代码注入

    工具:yololib 下载:https://github.com/KJCracks/yololib   编译之后得到yololib可执行文件,可根据自己喜好加入系统路径。

将微信用shell脚本重新签名后在Xcode运行,通过注入动态连接库,注入我们想要的代码(由于硬件原因 未实践)

注入思想:

     MachO文件加载动态链接库,LOAD_COMMANDS里面会加载各种链接库,共享库,所以修改MachO文件添加一个framework库,让DYLD自动去加载,达到注入的目的。

1.在工程里面新建一个framework库,命名为hook(名字随便取),在其文件夹下新建OC-class文件命名为hookWeChat ,添加load方法:

 build一下,进入app包里面的Frameworks文件夹下有一个hook,说明有这个库了,但是这时候MachO文件里没有,需要将hook这个framework库导入到MachO文件中,用了yololib工具:yololib WeChat Frameworks/hook.framework/hook  

执行成功后用MachOview工具看看文件中是否有这个字段

2.替换原来WeChat的可执行文件

    替换APP下面的可执行文件,重打包

3.运行

   

接下来就可以干你想干的事了

限制微信注册功能:将原来的load方法改为:

 当点击注册的时候:

后面有机会,自己实现一下!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 PHP 代码实现 iOS 内购订单验证的示例: ```php <?php // 定义 app id 和 app secret $app_id = 'your_app_id'; $app_secret = 'your_app_secret'; // 获取验证请求参数 $receipt = $_POST['receipt']; $password = $_POST['password']; // 发送验证请求到 Apple 服务器 $url = 'https://buy.itunes.apple.com/verifyReceipt'; // 正式环境 //$url = 'https://sandbox.itunes.apple.com/verifyReceipt'; // 沙盒环境 $data = json_encode(array('receipt-data' => $receipt, 'password' => $password)); $options = array( 'http' => array( 'header' => "Content-type: application/json\r\n", 'method' => 'POST', 'content' => $data ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); // 解析验证结果 $response = json_decode($result, true); if ($response['status'] == 0) { // 验证成功 $latest_receipt_info = $response['latest_receipt_info']; $transaction_id = $latest_receipt_info[0]['transaction_id']; $product_id = $latest_receipt_info[0]['product_id']; $purchase_date = $latest_receipt_info[0]['purchase_date']; // TODO: 在这里处理订单验证成功后的逻辑 } else { // 验证失败 $error_code = $response['status']; $error_message = $response['status_message']; // TODO: 在这里处理订单验证失败后的逻辑 } ?> ``` 以上代码中,首先定义了 app id 和 app secret,然后获取了验证请求参数 receipt 和 password,接着发送验证请求到 Apple 服务器,并解析验证结果。如果验证成功,可以获取到订单的相关信息,如 transaction_id、product_id 和 purchase_date 等,可以在这里处理订单验证成功后的逻辑;如果验证失败,可以获取到错误码和错误信息,可以在这里处理订单验证失败后的逻辑。需要注意的是,验证请求需要发送到正式环境或者沙盒环境,根据实际情况选择相应的 URL 即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值