Iphone 可执行加密检查反盗版措施

Iphone 可执行加密检查反盗版措施,iphone,objective-c,ios,Iphone,Objective C,Ios,我读了一篇非常有趣的博客,内容是关于在你的应用程序中实施一些反盗版保护。有些人不再工作了,有些人工作了。在某种程度上仍然有效的两个是最后列出的两个。 我感兴趣的是最后一个。代码如下。我已经在AppDelegate.m中实现了这一点 通过加密检查反盗版 所需标题 #import <dlfcn.h> #import <mach-o/dyld.h> #import <TargetConditionals.h> 必要的方法 int main (int argc,

我读了一篇非常有趣的博客,内容是关于在你的应用程序中实施一些反盗版保护。有些人不再工作了,有些人工作了。在某种程度上仍然有效的两个是最后列出的两个。

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

通过加密检查反盗版

所需标题

#import <dlfcn.h>
#import <mach-o/dyld.h>
#import <TargetConditionals.h>
必要的方法

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;
}
intmain(intargc,char*argv[]);
静态布尔是加密的()
{
const struct mach_头*头;
Dl_info dlinfo;
/*获取main()的dlinfo*/
if(dladdr(main,&dlinfo)==0 | | dlinfo.dli_fbase==NULL)
{
NSLog(@“找不到main()符号(非常奇怪)”);
返回否;
}
header=dlinfo.dli\u fbase;
/*计算图像大小并搜索UUID*/
结构加载命令*cmd=(结构加载命令*)(头+1);
对于(uint32_t i=0;cmd!=NULL&&incmds;i++)
{
/*加密信息段*/
如果(cmd->cmd==LC\u加密\u信息)
{
结构加密信息命令*crypt\u cmd=(结构加密信息命令*)cmd;
/*检查是否启用了二进制加密*/
if(crypt_cmd->cryptid<1)
{
返回否;
}
返回YES;
}
cmd=(struct load_command*)((uint8_t*)cmd+cmd->cmdsize);
}   
返回否;
}
此方法检查二进制文件是否仍然加密

当我在连接到x-code的设备上运行时,它会在这一行上给我一个假阳性

if (crypt_cmd->cryptid < 1) 
{
    NSLog(@"Pirated from (crypt_cmd->cryptid < 1) ");
    return NO;
} 
if(crypt\u cmd->cryptid<1)
{
NSLog(@“盗版自(crypt_cmd->cryptid<1)”;
返回否;
} 
我想知道是否有可能构建xcode为了调试目的而放在设备上而没有加密?而且只有当该版本提交给苹果在iTunes上使用时,才会对其进行加密。因此,为什么我在检查代码时得到这个假阳性

非常感谢,,
-代码

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

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

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

我最近也一直在研究这个问题,并用同样的结果进行了测试。事实证明,这段代码告诉你的是或否取决于二进制文件是否用苹果的FairPlay DRM加密。你所做的任何调试或特别构建都会说不

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

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

otool-l MyApp |更多


在LC_ENCRYPTION_INFO部分中扫描cryptid。由于这是调试生成,因此将为0。如果您已将手机同步到计算机,请在~/Music/iTunes/Mobile Applications下进行检查,然后选择一个.ipa文件。解压它并尝试对.ipa中的二进制文件使用otool,它的密码ID应该为1。

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

otool -arch armv7 -l YourAppName | grep crypt

此代码在64位设备(如iPhone 5s)上无法成功运行。标头已从
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 -arch armv7 -l YourAppName | grep crypt