cycript -p 进程ID
cycript -p 进程名称
// 获取对象
1、#0xXXXX
2、var p = new Instance(0xXXXX)
// 传递一个类,找出属于这个类的对象
choose(XXX)
// 打印视图层次
UIApp.keyWindow.recursiveDescription().toString()
// 获取绑定函数
[#0xXXXXX allTargets]
[#0xXXXXX allControlEvents]
[#0xXXXXX actionsForTarget: forControlEvent:]
对应用安装源有限制
AppleStore、企业证书、个人证书
沙盒机制
每一个App都有自己的专属目录,App只能在自己的目录内进行读写数据。苹果提供API用于访问公共资源,并且会弹出申请权限提示框。
-(void) getPath{
// 获取沙盒根目录路径
NSString *homeDir = NSHomeDirectory();
// 获取Documents目录路径
NSString *docDir = [NSSearchpathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES)]
// 获取Library目录路径
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)]
// 获取cache目录路径
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)]
// 获取tmp目录路径
NSString *tmpDir = NSTemporaryDirectory();
// 获取应用自身的xx.app目录
NSBundle *bundle = [NSBundle mainBundle];
NSString *strAppPath = [bundle bundlePath];
}
代码签名
所有的二进制文件都必须经过签名才能被执行。在内存中,只执行签名来源为自己的页,这样应用就不能自我升级或者动态改变行为。可以使用codesign来验证应用的签名信息是否被破坏。
// 签名验证
codesign --verify test.app/
// 查看签名信息
codesign -vv -d test.app/
用户权限隔离
系统自带的浏览器、电话、短信以及从Apple Store上下载的应用都以mobile用户的身份运行,只有重要的系统进程才以Root用户的身份运行。
数据执行保护
可以区分内存中哪些是可执行的代码,哪些是数据。该机制不允许执行数据,只允许执行代码。
地址空间布局随机化
让每次加载时的二进制文件、动态库文件、代码段以及数据段的内存地址都是随机的。
后台程序
IOS应用不能在后台执行代码,只要用户单击Home键,前台应用的所有线程都会被挂起,只有播放音乐、获取实时位置等必须在后台执行的操作才能执行。iOS中也有后台程序,被称为守护程序,未对开发者开放后台程序。