【问题标题】:Executable encryption check anti piracy measure可执行加密检查反盗版措施
【发布时间】:2014-03-10 12:49:07
【问题描述】:

我阅读了一篇非常有趣的博客,内容是在您的应用中实施一些反盗版保护。他们中的一些人不再工作,他们中的一些人。在一定程度上仍然有效的 2 个是最后列出的 2 个。 http://shmoopi.wordpress.com/2011/06/19/27/

我感兴趣的是最后一个。代码如下。我已经在我的 AppDelegate.m 中实现了这个

通过加密检查反盗版。

必需的标题

#import <dlfcn.h>
#import <mach-o/dyld.h>
#import <TargetConditionals.h>

加密结构

#if TARGET_IPHONE_SIMULATOR && !defined(LC_ENCRYPTION_INFO)
#define LC_ENCRYPTION_INFO 0x21
struct encryption_info_command 
{
uint32_t cmd;
uint32_t cmdsize;
uint32_t cryptoff;
uint32_t cryptsize;
uint32_t cryptid;
};
#endif

需要的方法

int main (int argc, char *argv[]);

static BOOL is_encrypted () 
{
const struct mach_header *header;
Dl_info dlinfo;

/* Fetch the dlinfo for main() */
if (dladdr(main, &dlinfo) == 0 || dlinfo.dli_fbase == NULL) 
{
    NSLog(@"Could not find main() symbol (very odd)");
    return NO;
}
header = dlinfo.dli_fbase;

/* Compute the image size and search for a UUID */
struct load_command *cmd = (struct load_command *) (header+1);

for (uint32_t i = 0; cmd != NULL && i < header->ncmds; i++) 
{
    /* Encryption info segment */
    if (cmd->cmd == LC_ENCRYPTION_INFO) 
    {
        struct encryption_info_command *crypt_cmd = (struct encryption_info_command *) cmd;
        /* Check if binary encryption is enabled */
        if (crypt_cmd->cryptid < 1) 
        {
            return NO;
        }
        return YES;
    }

    cmd = (struct load_command *) ((uint8_t *) cmd + cmd->cmdsize);
}   
return NO;
}

此方法检查二进制文件是否仍处于加密状态。

当我在附加到 x-code 的设备上运行它时,它会给我这一行的误报

if (crypt_cmd->cryptid < 1) 
{
    NSLog(@"Pirated from (crypt_cmd->cryptid < 1) ");
    return NO;
} 

我想知道是否有可能将 xcode 构建到设备上用于调试目的未加密?只有在构建提交给 Apple 以在 iTunes 上使用时才会对其进行加密。因此,为什么我在检查代码时会得到这个误报。

非常感谢, -代码

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    此代码无法在 iPhone 5s 等 64 位设备上成功运行。标头已从 mach_header 更改为 mach_header_64,命令 ID 现在为 LC_ENCRYPTION_INFO_64

    我所做的是阅读标题,然后查看幻数是什么。如果是MH_MAGIC_64,那么你在一个64位设备上,你需要使用mach_header_64结构并寻找LC_ENCRYPTION_INFO_64(定义为0x2C)而不是LC_ENCRYPTION_INFO

    【讨论】:

      【解决方案2】:

      查看文件是否加密的更好的 otool 命令是:

      otool -arch armv7 -l YourAppName | grep crypt
      

      【讨论】:

        【解决方案3】:

        我最近也一直在研究这个问题,并得到了相同的结果。事实证明,此代码根据二进制文件是否使用 Apple 的 FairPlay DRM 加密来告诉您是或否。您所做的任何调试或临时构建都会拒绝。

        您可以在二进制文件或您使用 otool 命令行工具购买的任何 iPhone 应用程序上看到相同的信息。

        对于您自己的二进制文件,请在您的项目中找到二进制文件,例如build/Debug-iphoneos/MyApp.app 并运行(从终端)

        otool -l 我的应用程序 |更多

        扫描 LC_ENCRYPTION_INFO 部分中的 cryptid。由于这是一个调试版本,它将为 0。如果您已将手机与计算机同步,请在 ~/Music/iTunes/Mobile Applications 下检查并选择一个 .ipa 文件。解压并尝试 otool 对 .ipa 中的二进制文件,它的 cryptid 应该为 1。

        【讨论】:

          【解决方案4】:

          看起来这是在 dyload 标头中寻找签名块。这意味着您只会在已签名的代码上看到这一点。您的代码可能没有被自动签名以进行调试(不必要),尽管它会在进入设备时被签名。

          您可能希望以在 iOS 设备上而不是在模拟器中运行的项目为条件进行整个检查。任何发送到 iOS 设备的二进制文件都必须经过签名。

          #if !(TARGET_IPHONE_SIMULATOR)
          your check
          #endif // 
          

          【讨论】:

          • 即使在我的测试设备上它的行为也是一样的。我想知道这是不是苹果在准备好应用商店时应用了加密的事实。因此,当我们在本地设备上自己构建它时,它不会应用。
          猜你喜欢
          • 2011-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多