注入任意进程实现程序签名问题

使用如下方法可以实现注入任意进程
https://github.com/comex/inject_and_interpose/blob/master/inject.c

不过碰到如下问题:
1. 使用xcode建空工程,然后编译生成应用程序,再使用如下签名可以正常运行:
codesign -fs - --entitlements ent.xmlTSTester

其中ent.xml内容如下:

com.apple.springboard.debugapplications get-task-allow proc_info-allow task_for_pid-allow run-unsigned-code

2. 使用theos环境编译,运行报错,执行完也试过如下的签名:

codesign -fs - --entitlements ent.xmlTSTester

或是手机端ldid –S TSTester

报错信息请见附件:

为什么theos 编译就是不行,请帮忙分析一下?

这个entitlement你用ldid签一下试试?
另外你Theos编译时报的什么错?错误信息贴上来看看

按群主你说的方法还是不行?在theos 的环境编译都是没有问题的。就是运行感觉签名出问题了!
现在主要的问题是xcode环境编译后再签名就可以,而theos环境编译再签名就是不行?这两个环境的签名机制有不一样?

运行报错请见附件!

你的tester是用ldid签名的?你参考这个帖子用ldid重新签一下entitlements看看,然后用ldid把签名过后的entitlements打印出来看看是什么

1.使用xcode编译的应用程序tester
使用签名:codesign -s - --entitlements ent.xml -f tester
测试状态:正常

2.使用theos环境编译的应用程序tester
使用签名:codesign -s - --entitlements ent.xml -f tester
测试状态:运行报错
使用签名:ldid -Sent.xml tester
测试状态:运行报错

群主这是什么情况?

不管是xcode还是theos,编译用的都是clang,理论上来讲编译的过程是没有区别的。你用xcode和theos分别编译出tester后,再分别运行

/path/to/ldid -e tester

,看看输出什么

xcode编译出来的再签名的可用:
通过ldid -e TSTest1
输出感觉签名了两次就可以

theos编译出来的不可用:
通过ldid -e TSTest2
输出感觉签名了只有一次就不可以

为什么会这样?

task_for_pid失败的话,要么就是这个函数本身的问题,要么就是entitlements的问题。但是你拿Xcode编译又没问题,说明不是函数使用的问题,那就可能是entitlements的问题,但从你的截图上又看不出来什么。
但是,我注意到你task_for_pid的返回值一次是4,一次是5,参考Apple源码的话,5的这次不好判断,但4的这次貌似是函数的参数有问题。你把task_for_pid的这一段代码贴上来看看

代码请见附件

另外疑问是:为什么xcode编译的再重新签名就可以了,并且通过ldid -e 查看他的签名是两个(如果没有重新签名也是不行),而theos编译的签名重新签名过通过ldid -e查看也只有一个。

为什么签名是2个可以1个不行的问题我也不知道,而且我估计碰到这种问题的人可能不多,要么你去stackoverflow上发个帖问问吧