strings 命令可以打印出oc程序中出现的所有可打印字符串和程序中被调用的方法名。(即所有objc_msgsend中的参数)。
lldb连接步骤:
①ssh连接手机后,debugserver *:12345 -a "WeChat",开启debuggerserver
②另打开终端窗口,$lldb,进入lldb,process connect connect://10.108.112.157:12345
NSUserDefaults:
保存在NSUserDefaults中的信息在你的应用关闭后再次打开之后依然存在。保存信息到NSUserDefaults的一个例子就是保存用户是否已登录的状态。我们把用户的登录状态保存到NSUserDefaults以便用户关闭应用再次打开应用的时候,应用能够从NSUserDefaults获取数据,根据用户是否登录展示不同的界面。有些应用也用这个功能来保存机密数据,比如用户的访问令牌,以便下次应用登录的时候,它们能够使用这个令牌来再次认证用户。
NSUserDefaults被存在一个以应用的bundle id为名称的plist文件中,通过NSUserDefaults保存的数据都可以在如下图所示的Library -
>Preferences ->$AppBundleId.plist文件中找到。
保存数据的方式:
NSUserDefaults、plist、CoreData和Sqlite、Keychain。
把信息保存到Keychain中可能是非越狱设备上最安全的一种保存数据的方式了。而在越狱设备上,没有任何事情是安全的。
Keychain:
Keychain 它是一个sqlite数据库,位于/private/var/Keychains/keychain-2.db,其保存的所有数据都是加密过的。
可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌。苹果自己用keychain来保存Wi-Fi网络密码,VPN凭证等等。
由于它位于每个应用的沙盒之外,可以利用keychain access groups可以在应用之间共享keychain中的数据,要求在保存数据到keychain的时候指定group。把数据保存到keychain的最好方法就是用苹果提供的KeychainItemWrapper。
创建Keychain类的实例时,需要指定标识符(identifier)和访问组(access group),identifier在取数据的时候要用到,具有相同access group的应用能够访问同样的keychain信息。
Keychain数据导出:
使用Keychain dumper工具可以将Keychain中的所有数据导出,GitHub地址:https://github.com/ptoomey3/Keychain-Dumper
应用能够访问的Keychain的数据是由其entitlements文件指定的,keychain_dumper使用一个自签名文件,带有一个*通配符的entitlements,因此它能够访问keychain中的所有条目
用法:1,将keychain_dumper拷贝到手机下的/tmp文件夹下【可以使用sftp命令】
2,确保keychaindumper可以执行【chmod a+x keychain_dumper】
3,确保保存在/private/var/Keychains/keychain-2.db的keychain文件可以被读取【chmod +r /private/var/Keychains/keychain-2.db】
4,运行keychain_dumper【使用 ./keychain_dumper -a 可以导出所有数据】
使得keychain中的数据更安全的一个做法就是使用一个更强的口令。这是因为对某些特定的保护属性(protection attributes)来说,口令会被用作加密keychain中的数据。 iOS默认允许4位数字口令(从0-9999)很容易被破解。一个合适的保护属性(protection attributes)和口令的组合会让keychain的数据更难被获取。
在应用里使用keychain,需要导入security.framework,keychain的操作接口声明在头文件SecItem.h里。直接使用SecItem.h里方法操作keychain,需要写的代码较为复杂,可以使用已经封装好了的工具类SFHFKeychainUtils,GitHub地址:https://github.com/ldandersen/scifihifi-iphone/tree/master/security
对每个应用来说,Keychain都有两个访问区,私有区和公共区。私有区是一个sandbox,本程序存储的任何数据都对其他程序不可见。Keychain中保存的信息是用app unique签名了的,默认只有自己能够访问。
access group概念:
1)App保存的信息是用app unique签了名的,默认只有自己可以访问。
2)不同App之间可以通过access group共享
app1的group是 app1.accessgroup.item1,
app2在entitlements中加入这个item就可以访问了。
3)在不同App之间共享,只能在同一个公司内部的App共享。
因为keychain access group 所在的文件entitlements.plist,需要添加到code_sign_entitlements.
这个文件的路径要配置在 Project->build setting->Code Signing Entitlements里,否则公共区无效,配置好后,须用你正式的证书签名编译才可通过,否则xcode会弹框告诉你code signing有问题。所以,苹果限制了你只能同公司的产品共享KeyChain数据,别的公司访问不了你公司产品的KeyChain。