可执行的encryption检查反盗版措施

我阅读了一个非常有趣的博客,介绍如何在您的应用中实施一些反盗版保护。 他们中的一些人不再工作了,其中一些工作。 还有一些有效的2个是最后列出的2个。 http://shmoopi.wordpress.com/2011/06/19/27/

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

通过encryption检查反盗版。

必需的标题

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

encryption结构

 #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; } 

该方法检查二进制文件是否仍然被encryption。

当我在连接到x代码的设备上运行这个时,它给了我这个线上的误判

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

我想知道是否有可能将build xcode放到设备上进行debugging,而不是encryption? 并且只有在将构build提交给Apple用于iTunes时,它才会进行encryption。 因此,检查代码时为什么会出现这种误报。

非常感谢,代码

此代码在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

一个更好的otool命令来查看一个文件是否被encryption是:

 otool -arch armv7 -l YourAppName | grep crypt 

我最近一直在研究这个问题,并用相同的结果进行了testing。 事实certificate,这个代码告诉你YES或NO,根据二进制文件是否用Apple的FairPlay DRMencryption。 任何debugging或临时构build你会做的不会。

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

对于你自己的二进制文件,你可以在build / Debug-iphoneos / MyApp.app下find你的项目中的二进制文件,然后运行(从Terminal)

otool -l MyApp | 更多

在LC_ENCRYPTION_INFO部分扫描cryptid。 由于这是一个debugging版本,它将是0.如果你已经把你的手机同步到你的电脑,请在〜/ Music / iTunes / Mobile Applications下select一个.ipa文件。 解压缩并从.ipa中的二进制文件中尝试otool,它应该有一个为cryptid。

看起来这是在dyload头中寻找签名块。 这意味着你只会在签名的代码上看到这个。 很有可能您的代码没有被自动签名进行debugging(不必要),尽pipe它将在进行设备签名时进行签名。

您可能需要对iOS设备上运行的项目进行整个检查,而不是模拟器。 发送到iOS设备的任何二进制文件都必须签名。

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