普通视图
iOS小技能:给debugserver添加task_for_pid权限,以便调试从AppStore中获取的App。
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情
前言
![]()
在做iOS开发时,在Mac上输入LLDB的命令就可以控制iOS端的App,是因为在iOS客户端中有一个debugserver服务器。
debugserver专门用来连接Mac端的LLDB客户端,接收LLDB所提供的命令,并且进行相应的执行。
如果你的iOS设备进行过真机调试的话,设备中就会被安装上debugserver, 不过该debugserver只能用来调试你自己的相关应用。
如果想要调试从AppStore中获取的App的话那么我们需要对iOS设备上的debugserver进行处理,那就是
给debugserver添加task_for_pid权限
本文的重点是给debugserver添加task_for_pid权限,以便调试从AppStore中获取的App
I 、获取debugserver
iPhone:/Developer/usr/bin root# ls
DTDeviceArbitration ScreenShotr XcodeDeviceMonitor debugserver iprofiler xctest
位于/Developer/usr/bin目录下的debugserver。此debugserver只支持调试我们自己的App, 如果需要调试其他人的App的话,需要对此debugserver进行处理
II、对debugserver进行瘦身
进入到到Mac中debugserver所在的目录下执行上述命令即可,-thin后方填写你的测试机相应的ARM架构即可,因为我的测试机是iPhone 6 Plus, 是arm64的架构,所以此处填的参数是arm64, 如果你的是iPhone5的设备,那么就是armv7s了。
devzkndeMacBook-Pro:Downloads devzkn$ scp iphone:/Developer/usr/bin/debugserver ./debugserver
lipo -thin arm64 debugserver -output debugserver
devzkndeMacBook-Pro:Downloads devzkn$ ls -l debugserver
-rwxr-xr-x 1 devzkn staff 13801968 Oct 17 17:19 debugserver
devzkndeMacBook-Pro:Downloads devzkn$ lipo -thin armv7s debugserver -output debugserver
devzkndeMacBook-Pro:Downloads devzkn$ ls -l debugserver
-rwxr-xr-x 1 devzkn staff 4582800 Oct 17 17:19 debugserver
III、给debugserver添加task_for_pid权限
给debugserver添加task_for_pid权限后,我们就可以使用LLDB调试其他App了。 此部分我们需要一个存储配置信息的xml文件,该文件的内容如下。你可以将下下方的文本进行拷贝,然后存储成ent.xml即可。
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<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>
在给debugserver符权限时,我们需要使用到ldid命令,如果你的Mac上没有安装ldid命令,那么请用brew进行install 执行下方的命令行就可以给我们的debugserver赋上task_for_pid权限。需要注意的是-S与ent.xml文件名中是没有空格的。
ldid -Sent.xml debugserver
IV、将debugserver拷贝到iOS设备中
最后一步就是将处理好的debugserver拷贝到我们的越狱设备中,并且给debugserver赋上可执行的权限。
chmod +x debugserver
因为/Developer/usr/bin目录下的debugserver是只读的,所以你不能将处理好的debugserver拷贝到上述文件,
你要将处理好的debugserver拷贝到/usr/bin/目录下
devzkndeMacBook-Pro:Downloads devzkn$ scp ./debugserver iphone:/usr/bin/debugserver
Phone:/usr/bin root# ls -l debugserver
-rwxr-xr-x 1 root wheel 4582512 Oct 17 17:31 debugserver
iPhone:/usr/bin root# debugserver
debugserver-@(#)PROGRAM:debugserver PROJECT:debugserver-320.2.89
for armv7.
Usage:
debugserver host:port [program-name program-arg1 program-arg2 ...]
debugserver /path/file [program-name program-arg1 program-arg2 ...]
debugserver host:port --attach=<pid>
debugserver /path/file --attach=<pid>
debugserver host:port --attach=<process_name>
debugserver /path/file --attach=<process_name>
see also
How can you catch a process that is about to be launched, if you don’t know the PID yet?
———————————————— 版权声明:本文为CSDN博主「#公号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 更多内容请关注
公号:iOS逆向原文链接:blog.csdn.net/z929118967/…
iOS小技能:__attribute__的应用
iOS小技能:消息发送的步骤(利用类型编码加快消息分发)
iOS小技能:动态地给类添加新的方法、实例变量、属性。
iOS动态库的注入原理
iOS逆向小技能:Cydia Substrate的组成部分、编写Tweak的步骤
「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。
前言
Cydia Substrate(以前叫做MobileSubstrate)是一个框架,允许第三方的开发者在系统的方法里打一些运行时补丁,扩展一些方法。
Cydia Substrate由3部分组成:
- MobileHooker
- MobileLoader
- safe mode
I Cydia Substrate]
1.1 MobileHooker
MobileHooker用来替换系统函数,这个过程也叫Hooking。有如下的API可以使用:
IMP MSHookMessage(Class class, SEL selector, IMP replacement, const char* prefix); // prefix should be NULL.
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);
void MSHookFunction(void* function, void* replacement, void** p_original);
MSHookMessageEx用来替换Objective-C的函数,MSHookFunction用来替换C/C++函数
1.2 MobileLoader
MobileLoader loads 3rd-party patching code into the running application. MobileLoader will first load itself into the run application using DYLD_INSERT_LIBRARIES environment variable. Then it looks for all dynamic libraries in the directory /Library/MobileSubstrate/DynamicLibraries/, and dlopen them.
控制是否加载到目标程序,是通过一个plist文件来控制的。如果需要被加载的动态库的名称叫做foo.dylib,那么这个plist文件就叫做foo.plist,这个里面有一个字段叫做filter,里面写明需要hook进的目标程序的bundle id。 比如,如果只想要foo.dylib加载进入SpringBoard,那么对应的plist文件中的filter就应该这样写:
Filter = {
Bundles = (com.apple.springboard);
};
1.3 Safe mode
When a extension crashed the SpringBoard, MobileLoader will catch that and put the device into safe mode. In safe mode all 3rd-party extensions will be disabled.
The following signals will invoke safe mode:
SIGABRT
SIGILL
SIGBUS
SIGSEGV
SIGSYS
II 编写Tweak的步骤
-
确定目标:在这个App上编写Tweak实现的特定功能,比如拦截某个具体的应用的特定API调用,获得关键信息。
-
导出头文件:确定目标之后,就可以利用Clutch先破解App,然后利用class-dump-z导出头文件,找到你感兴趣的类,对它进行分析。
-
获得类的方法:有时候,头文件没有所有方法调用的信息,这个时候你可以利用cycript,使用之前介绍的trick,打印出所需的方法信息。
-
编写Tweak:这一步你应该拿到需要Hook的类以及对应的方法,编写并安装与测试。
III SpringBoard 相关的API
- powerDown
+ (void) powerDown {
id SpringBoard = [UIApplication sharedApplication];//#"<SpringBoard: 0x173d8800>"
[SpringBoard powerDown];
}
- relaunchSpringBoard
@interface SpringBoard : UIApplication
\t_uiController (SBUIController*): <SBUIController: 0x1809c510>
- (void)relaunchSpringBoard; [#0x1617ca00 relaunchSpringBoard]
- (void)_relaunchSpringBoardNow;
- (void)powerDown;
- (void)_powerDownNow;
- (void)reboot;
- (void)_rebootNow;
@end
- 自动锁屏
[UIApplication sharedApplication].idleTimerDisabled=YES;//不自动锁屏,放在-(void)viewWillAppear:(BOOL)animated里面的时候,防止失效
[UIApplication sharedApplication].idleTimerDisabled=NO;//自动锁屏
see also
更多内容请关注 #小程序:iOS逆向,只为你呈现有价值的信息,专注于移动端技术研究领域;更多服务和咨询请关注#公众号:iOS逆向。