首页
社区
课程
招聘
[原创]task_for_pid使用权限的问题
发表于: 2013-12-29 14:45 13158

[原创]task_for_pid使用权限的问题

2013-12-29 14:45
13158
写了个修改进程内存数据的程序,需要用到task_for_pid函数。之前对一个进程内存搜索修改都没有问题,换了个进程就报错kern_failure
JerrysPhone:/home/jerry root# ./mscan 810
attach to process pid[810]
kr: 5
The_task: 0×0
这说明mscan程序不具备访问别的进程的权限
<key>task_for_pid-allow</key>
并且,这个被扫描报错的进程也没有主动开放被别的进程访问的能力
<key>get-task-allow</key>
作为调试工具,需要在签名是带上下面的entitlement,以便内核开放出功能
f9dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3W2H3K9r3!0F1k6h3c8W2N6Y4N6A6K9$3W2Q4x3X3g2F1k6i4c8Q4x3V1k6A6L8X3c8W2P5q4)9J5k6i4m8Z5M7q4)9J5c8V1c8W2j5Y4g2Y4M7$3g2J5N6X3g2J5i4K6t1K6f1r3q4@1j5$3S2A6L8X3N6Q4y4h3k6X3L8%4u0Q4y4h3k6H3M7X3!0U0k6i4y4K6i4K6g2X3j5i4c8@1j5h3y4Z5K9h3&6Y4
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “ce4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3q4H3M7r3I4W2i4K6u0W2j5$3!0E0i4K6u0r3c8q4c8p5M7#2)9J5c8W2m8J5L8%4m8W2M7Y4c8&6e0r3W2K6N6q4)9J5k6o6q4Q4x3X3f1H3i4K6u0W2k6s2c8V1i4@1f1J5i4K6R3H3i4K6W2p5i4K6t1$3k6%4c8Q4x3@1t1`.
<plist version=”1.0″>
<dict>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
<key>run-unsigned-code</key>
<true/>
</dict>
</plist>
如果去看gdb和memscan,都是具备这样的权限:
ldid -e /usr/bin/gdb
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “721K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3q4H3M7r3I4W2i4K6u0W2j5$3!0E0i4K6u0r3c8q4c8p5M7#2)9J5c8W2m8J5L8%4m8W2M7Y4c8&6e0r3W2K6N6q4)9J5k6o6q4Q4x3X3f1H3i4K6u0W2k6s2c8V1i4@1f1J5i4K6R3H3i4K6W2p5i4K6t1$3k6%4c8Q4x3@1t1`.
<plist version=”1.0″>
<dict>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
</dict>
</plist>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “92cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3q4H3M7r3I4W2i4K6u0W2j5$3!0E0i4K6u0r3c8q4c8p5M7#2)9J5c8W2m8J5L8%4m8W2M7Y4c8&6e0r3W2K6N6q4)9J5k6o6q4Q4x3X3f1H3i4K6u0W2k6s2c8V1i4@1f1J5i4K6R3H3i4K6W2p5i4K6t1$3k6%4c8Q4x3@1t1`.
<plist version=”1.0″>
<dict>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
</dict>
</plist>
root# ldid -e /usr/bin/memscan
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “bbbK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3q4H3M7r3I4W2i4K6u0W2j5$3!0E0i4K6u0r3c8q4c8p5M7#2)9J5c8W2m8J5L8%4m8W2M7Y4c8&6e0r3W2K6N6q4)9J5k6o6q4Q4x3X3f1H3i4K6u0W2k6s2c8V1i4@1f1J5i4K6R3H3i4K6W2p5i4K6t1$3k6%4c8Q4x3@1t1`.
<plist version=”1.0″>
<dict>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
<key>run-unsigned-code</key>
<true/>
</dict>
但我遇到的问题是说ldid -Sentitlement.xml app之后,运行就报Killed: 9,固件版本为6.1(10B142)
root# ./mscan 810
Killed: 9
这说明签名后的程序无法通过内核的校验。
OSX自带签名工具codesign的使用小结:
1. 使用codesign,首先需要产生自签名证书。
参考:《解决iOS上Killed 9 错误》
adaK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8S2L8Y4q4A6L8X3N6V1j5h3&6A6i4K6u0W2j5X3I4G2k6#2)9J5k6e0p5$3x3#2)9J5k6h3y4G2L8g2)9J5c8X3u0D9L8$3N6Q4x3V1k6K6N6r3q4@1K9h3y4Q4x3V1j5I4z5o6j5H3z5e0b7I4z5e0f1J5x3o6p5K6x3K6t1J5x3e0l9@1y4o6M7J5y4U0q4Q4x3V1j5`.
他创建了一个名为tanjiti的自签名证书
2. 签名一个程序的命令格式为:
codesign -fs <自签名证书> mach-o_file
例如:codesign -fs tanjiti sqlite3
3. 签名一个程序,并添加资格(Entitlements)文件:
codesign -fs <自签名证书> --entitlements <资格文件> mach-o_file
4. 查看签名程序的资格(Entitlements),可以用下面的命令,注意有一个“-”
codesign -d --entitlements - /Applications/Whatever.app/
5. 另外我看到一种代--resource-rules的使用方式
codesign --force --sign <自签名证书> --resource-rules=ResourceRules.plist --entitlements ent.xml mach-o_file
显然
--force等价于-f
--sign等价于-s
--force --sign等价于-fs
我用上面第3种方式来签名同样遇到Killed: 9的问题。用第2种方式回到kern_failure的问题。这样看和ldid的效果一致。
因为开始说到“之前对一个进程内存搜索修改都没有问题”,于是聚焦到这个进程,把entitlements拿出来一看,发现有:
<key>get-task-allow</key><true/>
所以找到出现kern_failure问题的mach-o文件,entitlements内容如下:
<?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes”?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “722K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3q4H3M7r3I4W2i4K6u0W2j5$3!0E0i4K6u0r3c8q4c8p5M7#2)9J5c8W2m8J5L8%4m8W2M7Y4c8&6e0r3W2K6N6q4)9J5k6o6q4Q4x3X3f1H3i4K6u0W2k6s2c8V1i4@1f1J5i4K6R3H3i4K6W2p5i4K6t1$3k6%4c8Q4x3@1t1`.
<plist version=”1.0″>
<dict>
<key>keychain-access-groups</key>
<array>
<string>LHH6UF568H.com.wanmei.mtheroes</string>
</array>
<key>application-identifier</key>
<string>LHH6UF568H.com.wanmei.mtheroes</string>
<key>aps-environment</key>
<string>production</string>
</dict>
</plist>
做如下修改:
-                <string>production</string>
-
+                <string>development</string>
+                <key>get-task-allow</key>
+                <true/>
保存成资格文件ent.xml,然后签名:
codesign -fs <自签名证书> --entitlements ent.xml mach-o_file
这样kern_failure的问题针对这个mach-o_file解决了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
2
我记得kern_failure跟越狱工具也有关系的。
有的越狱工具对内核签名验证的地方进行了patch,不签名直接运行gcc编译生成的可执行文件也是没有问题的。
而没对内核签名验证的地方进行patch的越狱工具,不签名是不能直接运行的。
2013-12-29 16:02
0
雪    币: 183
活跃值: (345)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
以前也写过类似的内存工具,主要是完成fuzzy搜索,过程中也碰到了楼主的Killed: 9问题,回头试试看能不能解决。谢谢楼主分享!
2013-12-29 19:48
0
雪    币: 218
活跃值: (769)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
4
fixed by add:
<key>proc_info-allow</key>
参考:
027K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3&6W2N6$3!0K6P5r3u0G2L8$3E0Q4x3X3g2U0L8$3#2Q4x3V1k6K6M7X3y4Q4x3X3g2B7L8q4)9K6c8Y4c8J5k6h3g2Q4x3@1c8D9K9i4y4@1K9h3&6Y4M7#2)9J5y4X3k6A6L8r3g2Q4x3@1b7I4x3W2)9J5k6o6q4Q4x3X3c8$3L8h3#2S2M7q4)9J5k6h3x3`.
2014-5-12 17:26
0
游客
登录 | 注册 方可回帖
返回