cfbundleidentifier not found-bundleID 报错怎么解决

获取 bundle version版本号
+(NSString*) getLocalAppVersion
& & return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
&获取BundleID
+(NSString*) getBundleID
& & return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
&获取app的名字
+(NSString*) getAppName
& & NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
& & NSMutableString *mutableAppName = [NSMutableString stringWithString:appName];
阅读(...) 评论()当前位置: && 知识详情
【技术分享】如何对iOS应用进行修改并重新签名
阅读:10128次
作者:预估稿费:200RMB投稿方式:发送邮件至,或登陆在线投稿前言在某些场景下,你可能需要在没越狱的iOS设备上运行修改过的iOS应用,特别是当手上已越狱的iPhone突然变砖,只能被迫升级到非越狱版本的iOS系统时,这种需求显得更加迫切。再如,你需要使用这项技术来动态分析测试应用程序,或者你可能需要使用GPS欺骗手段来绕过Pokemon的锁区限制,在非洲地区捕捉宠物小精灵,而又不想承担越狱带来的安全风险。无论是哪种情况,你都可以使用本文介绍的方法对某个经过修改的应用重新签名并在自己的设备上成功运行。需要注意的是,这种技术仅在应用程序不是经过FairPlay加密(即从应用商店上下载)时才能正常工作。由于Apple采用了较为复杂的配置及代码签名系统,在iOS系统上对程序进行重新签名会比想象中困难得多。只有使用正确的配置文件以及完全正确的代码签名头,iOS系统才会允许应用程序正常运行。这使得你需要熟知许多概念:如不同类型的证书、BundleID、应用ID、团队ID,以及如何使用Apple的编译工具将这些东西结合在一起。简而言之,要想让不经过默认方法(即XCode环境)编译生成的程序在iOS上正确运行将会是一个困难重重的过程。我们在本文中使用的工具集包括、Apple的编译环境以及一些shell命令。我们所使用的方法灵感来自于Vincent Tan的。此外,采用其他工具集也完成了同样的工作。要复现下文列出的步骤,请从OWASP Mobile Testing Guide软件仓库中下载这个示例应用,我们的目标是修改UnCrackable这个应用,使它在启动时加载FridaGadget.dylib,以便后续可以用来加载该应用进行测试。获取开发者配置文件(Provisioning Profile)及证书开发者配置文件是由Apple签名的一个plist文件,它将开发者的代码签名证书列入一个或多个设备的白名单中。话句话说,Apple通过这种方式显式允许开发者的应用程序在某些设备的上下文环境中运行(如对特定设备进行调试)。配置文件还列出了应用程序所能获得的权限信息。代码签名证书包含了开发者在对应用进行签名时所用到的私钥。1)使用iOS开发者账号时如果你之前使用Xcode开发和部署过iOS应用,你已经获得了一个代码签名证书。你可以使用security工具列出你现有的签名身份码:$&security&find-identity&-p&codesigning&-v
1)&61FAA11E233F6A2B255E6B6AF262CE&&iPhone&Distribution:&Vantage&Point&Security&Pte.&Ltd.&
2)&DCA22CC1B47FB1AC938&&iPhone&Developer:&Bernhard&Müller&(RV852WND79)&已经注册的开发者可以从Apple开发者门户上获取配置文件。首先你需要创建一个新的App ID,之后发起一个配置文件请求,以便该App ID能在你的设备上运行。要是只是想对应用进行重新打包,那么选择哪个App ID并不重要,你甚至可以重复使用之前使用过的App ID。关键点在于你需要一个正确匹配的配置文件,因为需要将调试器附加到应用上进行工作,请确保你创建的是一个开发配置文件(development provisioning profile)而不是分发配置文件(distribution profile)。在下文的shell命令中,我使用了自己的签名身份,该签名身份与我公司的开发团队相关联。我创建了名为“sg.vp.repackaged”的app-id,以及一个名为“AwesomeRepackaging”的配置文件,生成了一个名为“AwesomeRepackaging.mobileprovision”的文件,请你在实际操作时将这些字段替换为你自己的文件名。2)使用普通iTunes账号时幸运的是,即便你不是付费开发者,Apple也会给你发放一个免费的开发配置文件。你可以使用自己的Apple账户,通过Xcode环境获得该配置文件——只需要创建一个空的iOS工程,并从应用容器中提取embedded.mobileprovision即可。对整个过程进行了详细描述。获取到配置文件后,你可以使用security工具检查其内容。除了证书及设备信息外,你还可以从配置文件中找到应用所被赋予的运行权限。这些信息在后续的代码签名工作中都需要用到,因此你需要将它们提取到单独的plist文件中,如下所示。$&security&cms&-D&-i&AwesomeRepackaging.mobileprovision&&&profile.plist
$&/usr/libexec/PlistBuddy&-x&-c&'Print&:Entitlements'&profile.plist&&&entitlements.plist
$&cat&entitlements.plist
&?xml&version=&1.0&&encoding=&UTF-8&?&
&!DOCTYPE&plist&PUBLIC&&-//Apple//DTD&PLIST&1.0//EN&&&/DTDs/PropertyList-1.0.dtd&&
&plist&version=&1.0&&
&key&application-identifier&/key&
&string&LRUD9L355Y.sg.vantagepoint.repackage&/string&
&key&com.apple.developer.team-identifier&/key&
&string&LRUD9L355Y&/string&
&key&get-task-allow&/key&
&key&keychain-access-groups&/key&
&string&LRUD9L355Y.*&/string&
&/plist&你还需要检查一下生成的plist文件,看文件内容是否正确生成。其中,应用标识(App ID)是由Team ID(LRUD9L355Y)以及Bundle ID(sg.vantagepoint.repackage)组合而成。此配置文件仅对使用该App ID的应用有效。 “get-task-allow” 键值也十分重要,当该键值设为“true”时,其他进程(如调试服务器)可以被允许附加到该应用程序上,因此,在分发配置文件中,需要将该键值设置为“false”。其他的准备措施要想让我们的应用在启动时加载一个附加库,我们使用某些方法将一个附加加载命令插入到主执行文件的Mach-O头中。我们使用optool来自动化完成这个步骤:$&git&clone&/alexzielenski/optool.git
$&cd&optool/
$&git&submodule&update&--init&--recursive不使用Xcode的情况下,我们可以使用来完成应用的部署及调试。git&clone&/phonegap/ios-deploy.git
cd&ios-deploy/
git&submodule&update&--init&--recursive你需要FridaGadget.dylib完成本文示例。$&curl&-O&https://build.frida.re/frida/ios/lib/FridaGadget.dylib除了上述工具,我们还将使用OS X及XCode附带的标准工具集,请确保你的环境中已安装Xcode命令行开发者工具。应用的修改、重新打包和重新签名IPA文件其实就是ZIP文件,因此我们可以解压ipa包,将FridaGadget.dylib拷贝至app目录,之后使用optool将load命令添加到“UnCrackable Level 1”这个应用中。$&unzip&UnCrackable_Level1.ipa
$&cp&FridaGadget.dylib&Payload/UnCrackable\&Level\&1.app/
$&optool&install&-c&load&-p&&@executable_path/FridaGadget.dylib&&-t&Payload/UnCrackable\&Level\&1.app/UnCrackable\&Level\&1
Found&FAT&Header
Found&thin&header...
Found&thin&header...
Inserting&a&LC_LOAD_DYLIB&command&for&architecture:&arm
Successfully&inserted&a&LC_LOAD_DYLIB&command&for&arm
Inserting&a&LC_LOAD_DYLIB&command&for&architecture:&arm64
Successfully&inserted&a&LC_LOAD_DYLIB&command&for&arm64
Writing&executable&to&Payload/UnCrackable&Level&1.app/UnCrackable&Level&1...上述操作肯定会使主执行文件的代码签名无效,因此应用不能在非越狱设备上运行。你需要替换其中的配置文件,使用配置文件中列出的证书对主执行文件及FridaGadget.dylib进行签名。首先,我们向包中添加自己的配置文件:$&cp&AwesomeRepackaging.mobileprovision&Payload/UnCrackable\&Level\&1.app/embedded.mobileprovision\接下来,我们要确保Info.plist中的BundleID与配置文件中的BundleID一致。Codesign在签名过程中会从Info.plist中读取BundleID信息,两者如果不一致将会导致应用签名无效。$&/usr/libexec/PlistBuddy&-c&&Set&:CFBundleIdentifier&sg.vantagepoint.repackage&&Payload/UnCrackable\&Level\&1.app/Info.plist最后,我们使用codesign工具来对修改过的应用重新签名/$&rm&-rf&Payload/F/_CodeSignature
$&/usr/bin/codesign&--force&--sign&DCA22CC1B47FB1AC938&Payload/UnCrackable\&Level\&1.app/FridaGadget.dylib
Payload/UnCrackable&Level&1.app/FridaGadget.dylib:&replacing&existing&signature
$&/usr/bin/codesign&--force&--sign&DCA22CC1B47FB1AC938&--entitlements&entitlements.plist&Payload/UnCrackable\&Level\&1.app/UnCrackable\&Level\&1
Payload/UnCrackable&Level&1.app/UnCrackable&Level&1:&replacing&existing&signature安装及运行修改后的应用一切准备就绪,你可以使用以下命令在设备上部署和运行经过修改后的应用。$&ios-deploy&--debug&--bundle&Payload/UnCrackable\&Level\&1.app/如果一切顺利,应用应该可以在附加IIdb的调试模式下在设备上启动运行。Frida应该也可以正确加载到应用中运行,你可以使用frida-ps命令验证这一点:$&frida-ps&-U
---&------
499&Gadget现在你可以使用Frida正常测试应用程序了。故障排除如果你在进行上述操作时发生错误,你可以检查一下配置文件和代码签名头是否正确匹配,通常的错误都是因为两者不匹配导致的。这种情况下你可以参考Apple的,了解整个系统的工作原理。另外,Apple的也是一个不错的参考资料。
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
参与讨论,请先
安全播报APP
Copyright & 360网络攻防实验室 All Rights Reserved 京ICP证080047号[京ICP备号-6]& & & iOS 9发布已经有2月有余,现在Xcode已经有升级到Xcode7.1,开发环境安装等一系列相关的流程,以及Xcode 7 & iOS 9升级相关的一些部分,在这里就不再多加赘述(详见 )。
& & &此次在这里要讲的是Xcode7.1,Xcode7.1 已于前天()发布正式版本,在大家在Xcode 7.0不尽如人意情况下,欣喜Xcode 7.1到来之际,Xcode7.1也给大家带来了更大的困惑。
& & 相信这两天不少想更新App的朋友都有遇到同一个问题
ERROR ITMS-90049: "This bundle is invalid. The bundle identifier contains disallowed characters. [See the section of the Application Programming Guide entitled The APplication Bundle.]"
& & &正如大家一样,笔者也遇到了这个问题,也跟大家一样,猜测这肯定是Apple的问题,但经过多番查找,终于找到了问题原因以及解决方案:
& & &问题原因??
& & &看字面意思,这很明显是说App的Bundle identifier 包含了非法字符,可是查看App的Info.plist,相关参数明显是符合Apple规定的,而且多数App也是已经有上架到AppleStore的。
& & &那么,具体的问题出在哪里呢?
& & &很明显,问题还是出在Bundle identifier上面,出在Info.plist上面。
& & &综合上述信息,大家只要做如下操作,就可以顺利上架。
& & &具体操作步骤:
& & &Step 1:更新Xcode到Xcode 7.1
& & &Step 2:删除掉App中多余的Info.plist (如第三方静态库中包含的Info.plist文件)
& & &Step 3:删除App中第三方资源包中的Info.plist (统一检查App中 .bundle 中资源包里面是否有Info.plist,考虑删除或是删除里面的CFBundleVersion 以及 CFBundleIdentifier 项)
& & 即可送审成功!
版权所有,转载须注明作者()及出处()
阅读(...) 评论()

我要回帖

更多关于 cfbundleidentifier 的文章

 

随机推荐