小魔女 发表于 2015-1-18 11:49:29

IOS制作之为Android使用程序读取/dev下设备而提权(一)仓酷云

除了在程序加载的时候把我的view加载到他上目前我还没用到过其他的苹果一直很推崇MVC的程序结构视图模型控制器简单说就是视图负责显示内容模型负责所有数据的保存结构或者一些其他数据操作控制器是用来协调视图和模型举车的发动机系统的例子倘使使用程序必要对/dev/xxx举行读写操纵,就必要提拔其权限。提权办法不惟一,必要依据详细需讨情况而选择。归根结柢,毕竟都落到chmod777/dev/xxx上,分歧的是,chmod操纵被实行在什么时候何地,在此做个剖析总结。
内核启动后会实行/system/init,传说中的体系1号历程,init程序后来的义务是初始化,包含各类mkdir来构建文件体系,失掉硬件信息创建设备节点,安装SIGCHLD旌旗灯号往返收僵尸历程的资本,剖析init.rc启动剧本等等,然后init程序变身为property_service来办理体系的权限。我们能够动手的中央有两处:device_init和init.rc。
init.rc

这个计划是人人用的对照多的,在个中增加chmod操纵很复杂未几说。
device.c

这个计划用的对照少,先懂得下device.c。
device_init在/system/core/init/device.c中,具体剖析以下:

[*]//分离遍历/sys/class/sys/block/sys/devices
[*]device_init()
[*]{
[*]coldboot(fd,"/sys/class");
[*]coldboot(fd,"/sys/block");
[*]coldboot(fd,"/sys/devices");
[*]}
[*]
[*]//前面有个递回/sys下是内核天生的设备,这就相称于udev的感化
[*]do_coldboot()
[*]{
[*]if(fd>=0){
[*]write(fd,"addn",4);
[*]close(fd);
[*]handle_device_fd(event_fd);
[*]}
[*]}
[*]
[*]//从socket里读出add处置
[*]handle_device_fd()
[*]{
[*]if(!strcmp(uevent->action,"add")){
[*]make_device(devpath,block,uevent->major,uevent->minor);
[*]return;
[*]}
[*]}
[*]
[*]//失掉设备的相干信息创立设备节点
[*]make_device()
[*]{
[*]mode=get_device_perm(path,&uid,&gid)|(block?S_IFBLK:S_IFCHR);
[*]dev=(major<<8)|minor;
[*]mknod(path,mode,dev);
[*]chown(path,uid,gid);
[*]}
[*]
[*]get_device_perm()
[*]{
[*]if(get_device_perm_inner(qemu_perms,path,uid,gid,&perm)==0){
[*]returnperm;
[*]}elseif(get_device_perm_inner(devperms,path,uid,gid,&perm)==0){
[*]returnperm;
[*]}else{
[*]…….
[*]}
[*]
[*]//失掉devperms布局体的信息
[*]get_device_perm_inner
[*]{
[*]for(i=0;perms.name;i++){
[*]
[*]if(perms.prefix){
[*]if(strncmp(path,perms.name,strlen(perms.name)))
[*]continue;
[*]}else{
[*]if(strcmp(path,perms.name))
[*]continue;
[*]}
[*]*uid=perms.uid;
[*]*gid=perms.gid;
[*]*perm=perms.perm;//权限位
[*]return0;
[*]}
[*]}
[*]
[*]这是devperms的详细内容
[*]structperms_{
[*]char*name;
[*]mode_tperm;
[*]unsignedintuid;
[*]unsignedintgid;
[*]unsignedshortprefix;
[*]};
[*]staticstructperms_devperms[]={
[*]{"/dev/null",0666,AID_ROOT,AID_ROOT,0},
[*]{"/dev/zero",0666,AID_ROOT,AID_ROOT,0},
[*]{"/dev/full",0666,AID_ROOT,AID_ROOT,0},
[*]{"/dev/ptmx",0666,AID_ROOT,AID_ROOT,0},
[*]{"/dev/tty",0666,AID_ROOT,AID_ROOT,0},
[*]{"/dev/random",0666,AID_ROOT,AID_ROOT,0},
[*]{"/dev/urandom",0666,AID_ROOT,AID_ROOT,0},
[*]{"/dev/ashmem",0666,AID_ROOT,AID_ROOT,0},
[*]{"/dev/binder",0666,AID_ROOT,AID_ROOT,0},
[*]
[*]/*loggershouldbeworldwritable(forlogging)butnotreadable*/
[*]{"/dev/log/",0662,AID_ROOT,AID_LOG,1},
[*]
[*]/*theseshouldnotbeworldwritable*/
[*]{"/dev/android_adb",0660,AID_ADB,AID_ADB,0},
[*]{"/dev/android_adb_enable",0660,AID_ADB,AID_ADB,0},
[*]{"/dev/ttyMSM0",0660,AID_BLUETOOTH,AID_BLUETOOTH,0},
[*]{"/dev/alarm",0664,AID_SYSTEM,AID_RADIO,0},
[*]{"/dev/tty0",0666,AID_ROOT,AID_SYSTEM,0},
[*]{"/dev/graphics/",0660,AID_ROOT,AID_GRAPHICS,1},
[*]{"/dev/hw3d",0660,AID_SYSTEM,AID_GRAPHICS,0},
[*]{"/dev/input/",0660,AID_ROOT,AID_INPUT,1},
[*]{"/dev/eac",0660,AID_ROOT,AID_AUDIO,0},
[*]{"/dev/cam",0660,AID_ROOT,AID_CAMERA,0},
[*]{"/dev/pmem",0660,AID_SYSTEM,AID_GRAPHICS,0},
[*]{"/dev/pmem_gpu",0660,AID_SYSTEM,AID_GRAPHICS,1},
[*]{"/dev/pmem_adsp",0660,AID_SYSTEM,AID_AUDIO,1},
[*]{"/dev/pmem_camera",0660,AID_SYSTEM,AID_CAMERA,1},
[*]{"/dev/oncrpc/",0660,AID_ROOT,AID_SYSTEM,1},
[*]{"/dev/adsp/",0660,AID_SYSTEM,AID_AUDIO,1},
[*]{"/dev/mt9t013",0660,AID_SYSTEM,AID_SYSTEM,0},
[*]{"/dev/akm8976_daemon",0640,AID_COMPASS,AID_SYSTEM,0},
[*]{"/dev/akm8976_aot",0640,AID_COMPASS,AID_SYSTEM,0},
[*]{"/dev/akm8976_pffd",0640,AID_COMPASS,AID_SYSTEM,0},
[*]{"/dev/msm_pcm_out",0660,AID_SYSTEM,AID_AUDIO,1},
[*]{"/dev/msm_pcm_in",0660,AID_SYSTEM,AID_AUDIO,1},
[*]{"/dev/msm_pcm_ctl",0660,AID_SYSTEM,AID_AUDIO,1},
[*]{"/dev/msm_mp3",0660,AID_SYSTEM,AID_AUDIO,1},
[*]{"/dev/smd0",0640,AID_RADIO,AID_RADIO,0},
[*]{"/dev/qmi",0640,AID_RADIO,AID_RADIO,0},
[*]{"/dev/qmi0",0640,AID_RADIO,AID_RADIO,0},
[*]{"/dev/qmi1",0640,AID_RADIO,AID_RADIO,0},
[*]{"/dev/qmi2",0640,AID_RADIO,AID_RADIO,0},
[*]{"/dev/htc-acoustic",0640,AID_RADIO,AID_RADIO,0},
[*]{NULL,0,0,0,0},
[*]};
//分离遍历/sys/class/sys/block/sys/devicesdevice_init(){coldboot(fd,"/sys/class");coldboot(fd,"/sys/block");coldboot(fd,"/sys/devices");}//前面有个递回/sys下是内核天生的设备,这就相称于udev的感化do_coldboot(){if(fd>=0){write(fd,"addn",4);close(fd);handle_device_fd(event_fd);}}//从socket里读出add处置handle_device_fd(){if(!strcmp(uevent->action,"add")){make_device(devpath,block,uevent->major,uevent->minor);return;}}//失掉设备的相干信息创立设备节点make_device(){mode=get_device_perm(path,&uid,&gid)|(block?S_IFBLK:S_IFCHR);dev=(major<<8)|minor;mknod(path,mode,dev);chown(path,uid,gid);}get_device_perm(){if(get_device_perm_inner(qemu_perms,path,uid,gid,&perm)==0){returnperm;}elseif(get_device_perm_inner(devperms,path,uid,gid,&perm)==0){returnperm;}else{…….}//失掉devperms布局体的信息get_device_perm_inner{for(i=0;perms.name;i++){if(perms.prefix){if(strncmp(path,perms.name,strlen(perms.name)))continue;}else{if(strcmp(path,perms.name))continue;}*uid=perms.uid;*gid=perms.gid;*perm=perms.perm;//权限位return0;}}这是devperms的详细内容structperms_{char*name;mode_tperm;unsignedintuid;unsignedintgid;unsignedshortprefix;};staticstructperms_devperms[]={{"/dev/null",0666,AID_ROOT,AID_ROOT,0},{"/dev/zero",0666,AID_ROOT,AID_ROOT,0},{"/dev/full",0666,AID_ROOT,AID_ROOT,0},{"/dev/ptmx",0666,AID_ROOT,AID_ROOT,0},{"/dev/tty",0666,AID_ROOT,AID_ROOT,0},{"/dev/random",0666,AID_ROOT,AID_ROOT,0},{"/dev/urandom",0666,AID_ROOT,AID_ROOT,0},{"/dev/ashmem",0666,AID_ROOT,AID_ROOT,0},{"/dev/binder",0666,AID_ROOT,AID_ROOT,0},/*loggershouldbeworldwritable(forlogging)butnotreadable*/{"/dev/log/",0662,AID_ROOT,AID_LOG,1},/*theseshouldnotbeworldwritable*/{"/dev/android_adb",0660,AID_ADB,AID_ADB,0},{"/dev/android_adb_enable",0660,AID_ADB,AID_ADB,0},{"/dev/ttyMSM0",0660,AID_BLUETOOTH,AID_BLUETOOTH,0},{"/dev/alarm",0664,AID_SYSTEM,AID_RADIO,0},{"/dev/tty0",0666,AID_ROOT,AID_SYSTEM,0},{"/dev/graphics/",0660,AID_ROOT,AID_GRAPHICS,1},{"/dev/hw3d",0660,AID_SYSTEM,AID_GRAPHICS,0},{"/dev/input/",0660,AID_ROOT,AID_INPUT,1},{"/dev/eac",0660,AID_ROOT,AID_AUDIO,0},{"/dev/cam",0660,AID_ROOT,AID_CAMERA,0},{"/dev/pmem",0660,AID_SYSTEM,AID_GRAPHICS,0},{"/dev/pmem_gpu",0660,AID_SYSTEM,AID_GRAPHICS,1},{"/dev/pmem_adsp",0660,AID_SYSTEM,AID_AUDIO,1},{"/dev/pmem_camera",0660,AID_SYSTEM,AID_CAMERA,1},{"/dev/oncrpc/",0660,AID_ROOT,AID_SYSTEM,1},{"/dev/adsp/",0660,AID_SYSTEM,AID_AUDIO,1},{"/dev/mt9t013",0660,AID_SYSTEM,AID_SYSTEM,0},{"/dev/akm8976_daemon",0640,AID_COMPASS,AID_SYSTEM,0},{"/dev/akm8976_aot",0640,AID_COMPASS,AID_SYSTEM,0},{"/dev/akm8976_pffd",0640,AID_COMPASS,AID_SYSTEM,0},{"/dev/msm_pcm_out",0660,AID_SYSTEM,AID_AUDIO,1},{"/dev/msm_pcm_in",0660,AID_SYSTEM,AID_AUDIO,1},{"/dev/msm_pcm_ctl",0660,AID_SYSTEM,AID_AUDIO,1},{"/dev/msm_mp3",0660,AID_SYSTEM,AID_AUDIO,1},{"/dev/smd0",0640,AID_RADIO,AID_RADIO,0},{"/dev/qmi",0640,AID_RADIO,AID_RADIO,0},{"/dev/qmi0",0640,AID_RADIO,AID_RADIO,0},{"/dev/qmi1",0640,AID_RADIO,AID_RADIO,0},{"/dev/qmi2",0640,AID_RADIO,AID_RADIO,0},{"/dev/htc-acoustic",0640,AID_RADIO,AID_RADIO,0},{NULL,0,0,0,0},};
init.c

init.rc剧本和老版本android中的init.goldfish.rc剧本很早就被parse_config_file()函数剖析将剧本内容分为几个段,early-init,init,early-boot,boot,和各个服务。然后在分歧的工夫点上实行各个段得命令大概开启各类服务。
init.c的一段节选:

[*]intmain(intargc,char**argv)
[*]{
[*]……
[*]mkdir("/dev",0755);
[*]mkdir("/proc",0755);
[*]mkdir("/sys",0755);
[*]mount("tmpfs","/dev","tmpfs",0,"mode=0755");
[*]mkdir("/dev/pts",0755);
[*]mkdir("/dev/socket",0755);
[*]mount("devpts","/dev/pts","devpts",0,NULL);
[*]mount("proc","/proc","proc",0,NULL);
[*]mount("sysfs","/sys","sysfs",0,NULL);
[*]……
[*]INFO("readingconfigfilen");
[*]parse_config_file("/init.rc");
[*]//挪用parse_config剖析init.rc剧本
[*]//经由剖析,init.rc的内容就被分为几个段,被串在action_list链表中。
[*]//on开首的都是action范例的段,好比init段,init段用一个布局体structaction暗示,个中name是init,
[*]//一切这个段内的命令,都被串在commands链表中。
[*]
[*]action_for_each_trigger("early-init",action_add_queue_tail);
[*]//遍历action_list链表,查找name是early-init的谁人action,将这个节点放在action_queue的尾部。
[*]drain_action_queue();
[*]//将action_queue尾部的节点遍历,然后删除。
[*]//就相称于遍历name是early-init的action节点内的commands链表。
[*]//就是在实行init.rc剧本中onearly-init段内的一切命令。
[*]
[*]……
[*]INFO("deviceinitn");
[*]device_fd=device_init();//罕见需要的设备节点
[*]
[*]property_init();//init今后的义务就是proper_service
[*]
[*]action_for_each_trigger("init",action_add_queue_tail);//将init段,到场action_queue
[*]drain_action_queue();//实行init段得命令
[*]
[*]……
[*]}
intmain(intargc,char**argv){……mkdir("/dev",0755);mkdir("/proc",0755);mkdir("/sys",0755);mount("tmpfs","/dev","tmpfs",0,"mode=0755");mkdir("/dev/pts",0755);mkdir("/dev/socket",0755);mount("devpts","/dev/pts","devpts",0,NULL);mount("proc","/proc","proc",0,NULL);mount("sysfs","/sys","sysfs",0,NULL);……INFO("readingconfigfilen");parse_config_file("/init.rc");//挪用parse_config剖析init.rc剧本//经由剖析,init.rc的内容就被分为几个段,被串在action_list链表中。//on开首的都是action范例的段,好比init段,init段用一个布局体structaction暗示,个中name是init,//一切这个段内的命令,都被串在commands链表中。action_for_each_trigger("early-init",action_add_queue_tail);//遍历action_list链表,查找name是early-init的谁人action,将这个节点放在action_queue的尾部。drain_action_queue();//将action_queue尾部的节点遍历,然后删除。//就相称于遍历name是early-init的action节点内的commands链表。//就是在实行init.rc剧本中onearly-init段内的一切命令。……INFO("deviceinitn");device_fd=device_init();//罕见需要的设备节点property_init();//init今后的义务就是proper_serviceaction_for_each_trigger("init",action_add_queue_tail);//将init段,到场action_queuedrain_action_queue();//实行init段得命令……}
本节小结

device_init实在就是linux中的udev的一个复杂的替换。把/sys/下的一切内核供应的设备都布置在/dev下创立设备节点。假如要修改/dev/一些设备的权限,能够把chmod777写在init.rc中,可是要注重写的地位,不克不及太早实行,不克不及写在early-init段内,由于当时/dev/下的设备节点还没有被创立。
在devices.c中修正的办法埋没的较深不简单被发明,可是假如init.rc内再次修正便可能把之前的修正掩盖失落。

iOS5开始支持CoreImage了还没去看Mac上的CI是很强大的CFNetwork---从来没用过我一般都会用ASIHttpRequset封装好的高层网络库OBJC实现的CFNetwork好像是C实现CoreLocation---获取位置的库工具很少

精灵巫婆 发表于 2015-1-21 15:49:18

特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地

蒙在股里 发表于 2015-1-30 20:37:08

我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。

乐观 发表于 2015-2-2 13:42:25

AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。

admin 发表于 2015-2-7 21:27:07

然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,

金色的骷髅 发表于 2015-2-22 08:55:05

从C语言入门,因为IOS开发用的是OC语言,是在C基础上的,不过也跟C不是很搭界,你可以直接学习OC语言也可以,

分手快乐 发表于 2015-2-24 00:22:59

近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,

小魔女 发表于 2015-2-26 16:01:56

重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。

小女巫 发表于 2015-3-8 15:54:22

近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,

莫相离 发表于 2015-3-16 03:51:42

自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉

深爱那片海 发表于 2015-3-18 09:52:41

其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。

若相依 发表于 2015-3-19 02:09:48

看《iPhone 4与iPad开发基础教程》,跟着一步步来

愤怒的大鸟 发表于 2015-3-27 00:08:17

众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。

再见西城 发表于 2015-3-29 16:51:40

好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。

谁可相欹 发表于 2015-4-6 22:11:02

学习ios没什么捷径,关键在于多动手敲,曾看到前辈开玩笑说怎么快速学会某技术,答案是:“提高打字速度,快点写代码就能快点学会了”。

小妖女 发表于 2015-4-9 22:08:37

好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。

老尸 发表于 2015-4-24 02:16:26

好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。

不帅 发表于 2015-4-24 21:23:05

要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。

第二个灵魂 发表于 2015-4-26 01:11:20

我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。

兰色精灵 发表于 2015-5-6 00:15:31

然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,
页: [1] 2
查看完整版本: IOS制作之为Android使用程序读取/dev下设备而提权(一)仓酷云