iOS-私有API与runtime

有朋友在做类似iTool的功能,跟我聊起来,这几天闲,就写了一个demo,不是正经做这个,还很粗略,具体干货诸位等这位朋友自己发文吧。

DEMO

https://github.com/liulishuo/testAppList

思路

iOS9白名单的上限是50个,如果想绕过这个限制,扫描系统中所有app的状态,只有使用私有API,需要用到的类有两个:LSApplicationWorkspace、LSApplicationProxy,知道类的名字我们就可以依靠runtime得到这个类,以及这个类的所有方法,OC的方法望文生义,接下来就可以慢慢尝试。

实现

  • 得到LSApplicationWorkspace、LSApplicationProxy

1

2

Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");

Class LSApplicationProxy_class = object_getClass(@"LSApplicationProxy");

得到类的所有方法与成员变量(编程小翁)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//获取不到成员变量

 int count = 0;

 Ivar *members = class_copyIvarList([LSApplicationProxy_class class], &count);  for (int i = 0 ; i < count; i++) {

     Ivar var = members[i];      const char *memberName = ivar_getName(var);      const char *memberType = ivar_getTypeEncoding(var);

     NSLog(@"%s: %s",memberType,memberName);

 }

  

 NSLog(@"count: %d",count);  //获取不到有用的方法

 count = 0;

 Method *memberMethods = class_copyMethodList(LSApplicationProxy_class, &count);  for (int i = 0; i < count; i++) {

     SEL name = method_getName(memberMethods[i]);

     NSString *methodName = [NSString stringWithCString:sel_getName(name) encoding:NSUTF8StringEncoding];

     NSLog(@"member method:%@", methodName);

 }

  

 NSLog(@"count: %d",count);

因为函数class_copyIvarList、class_copyMethodList有时不能返回有用的结果,所以我们使用class-dump(有朋友反映xcode7的库导不出来,大家用源码自己build一个吧),导出类的头文件。

导出MobileCoreServices.framework的所有头文件:


1

class-dump -H /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/MobileCoreServices.framework  -o /Users/credit/Desktop/header004

-o后面是输出路径 改成你需要的。

MobileCoreServices.framework的所有头文件

LSApplicationProxy

LSApplicationWorkspace

  • 得到app列表

虽然没有注释,但是我们可以猜到这个方法应该可以得到app列表


1

- (id)allApplications;

但是他是实例方法,我们先要拿到一个LSApplicationWorkspace实例


1

+ (id)defaultWorkspace;

代码如下


1

2

NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];

NSArray *appList = [workspace performSelector:@selector(allApplications)];

  • 遍历app列表

applist里的每一个元素都是LSApplicationProxy 比对其头文件,把对应的属性打印出来研究,

属性略多,不想自己写的朋友,请看我的demo

遍历数组

YY

微信

注意groupContainers数组的内容,我们可以拿到group id,可不可以拿到公共存储区的数据呢?


1

2

NSUserDefaults *share = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.tencent.xin"];

NSLog(@"%@",share.dictionaryRepresentation);

然而并没有,那有没有共享数据的目录呢?


1

NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.tencent.xin"];

返回值为nil

app不在group.com.tencent.xin这个组内,咱的冒牌货强写是无效的,因为这个标识符已经被正品占用了。

App Groups

还有什么好玩的? 试试这个


1

[workspace performSelector:@selector(uninstallApplication:withOptions:) withObject:@"XXX" withObject:nil];

workspace 是LSApplicationWorkspace实例,@"XXX"这里填你获取到的applicationIdentifier

模拟器可以正常卸载app,真机不行。

更多API,大家可以自己尝试一下。

时间: 2024-07-28 18:41:16

iOS-私有API与runtime的相关文章

iOS私有API(三) UIWebView下的手势识别器gestureRecognizer

 首先,UIWebView本身之上并没有手势识别器(gesture recognizer,下面简称手势),而是其子view有. 通过gdb或lldb,我们很容易看到UIWebView的subviews层级关系,下面是使用一个UIWebView打开百度首页时的情况: (lldb) po [g_webView recursiveDescription] $0 = 0x0ab202e0 <UIWebView: 0x7577160; frame = (0 78; 768 926); autoresize

iOS私有API(一) -[UIApplication _cancelAllTouches]

 这个api会令当前的所有手指操作失效,即令所有的UITouch变成cancelled状态,所有的UIView和UIGestureRecognizer都会触发touchesCancelled:withEvent:事件. 使用场景: 1. 模拟UIPopoverController时的行为,当popover弹出时,其他手势都应该被cancelled掉,从而保证popover弹出后继续移动手指不会再产生事件.(UIPopoverController就有使用这个函数,UIActionSheet应该也有

iOS私有API(二) UIGestureRecognizerDelegate的两个函数

UIGestureRecognizerDelegate有两个没公开的函数,只要重载了就会被调用. 即所有的UIGestureRecognizer子类.delegate = someInstance; 经过set以后,只要这个delegate实例里有这两个函数,就会被调用进入.经过验证,这两个api是可以通过apple审查上app store的. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer canBePrev

iOS开发之私有API No.1 私有API的查找和生成

最近研究一个应用,可以在un-jailbreak的情况下打开4G功能,是的,就是很火的"移动流量仪",想要知道他是如何做到的,正好我的手机已经jailbreak了,打开SSH通道,然后用find -mmin 1 命令来查看1分钟内改动后的文件,发现是修改了系统的一个配置文件.于是就猜测应该是调用了私有的API.就顺着查下去,先从私有API说起吧: 一.关于苹果API: 1.Published API(公开的API):又称 Documented API(文档中记录的API).是苹果通过

iOS软件被曝使用私有API:你的数据被偷了

不同的配方,相同的味道.App Store 一直都在飞快地发展,现在这块蛋糕越来越大,尤其是在中国地区.所以,想要从这块蛋糕上尝到甜头的人也越来越多.做法正经的,我们叫他们商人;做法不正经的,我们只能称之为奸商甚至是犯罪份子了.可怜开发者,要背锅了. 罪恶之源被曝光 "我们已经了解到,一系列采用第三方移动广告 SDK 进行开发的 iOS 软件会通过私人 API 擅自收集用户的个人信息,包括邮箱地址.设备序列号以及路由数据等等.然后,这些软件把用户数据传向一家名为有米的移动广告供应商所设的服务器,

iOS 画面切换的各种动画效果附私有API

ios的画面切换的动画效果的API主要通过调用系统已定义的动画效果实现,这些效果已基本囊括开发的需求,如果需要更加复杂的效果,可以考虑CATransition来实现 以下是基本的四种效果 kCATransitionPush 推入效果 kCATransitionMoveIn 移入效果 kCATransitionReveal 截开效果 kCATransitionFade 渐入渐出效果 以下API效果可以安全使用 cube 方块 suckEffect 三角 rippleEffect 水波抖动 page

IOS打包验证时,提示使用了私有API的问题

提示有setCities等私有API,于是打包没通过, 这是由于 使用了百度地图SDK的缘故,只需要在other link flags中设置一个参数:-ObjC 这样就可以解决这个问题了.

使用了私有API:_locale_charset

问题描述 使用了私有API:_locale_charset 解决方案 IOS打包验证时,提示使用了私有API的问题

[WebKit]遭遇Mac OS私有API

WebKit并不是完全开源的, Apple封装了一部代码在一个静态库(libWebKitSystemInterfaceXXXX.a)中,并没有提供源代码.而且不同版本的OS (包括iOS),会有特定的版本. 这就是我今天从分析中了解到的, 觉得过程比较有趣,记录一下. 1. 在WebKit中有这样一段源代码 (Laguage.mm): static String httpStyleLanguageCode(NSString *languageCode) { ASSERT(isMainThread