除了dladdr 和_dyld_get_image_name之类还有什么方法可以获取加载的image名字
_dyld_get_all_image_infos```
大概还有三种吧.
// get dyld load address by task_info, TASK_DYLD_INFO
zpointer zz_macho_get_dyld_load_address_via_task(task_t task) {
// http://stackoverflow.com/questions/4309117/determining-programmatically-what-modules-are-loaded-in-another-process-os-x
kern_return_t kr;
task_flavor_t flavor = TASK_DYLD_INFO;
task_dyld_info_data_t infoData;
mach_msg_type_number_t task_info_outCnt = TASK_DYLD_INFO_COUNT;
kr = task_info(task, flavor, (task_info_t) &infoData, &task_info_outCnt);
if (kr != KERN_SUCCESS) {
KR_ERROR(kr);
return 0;
}
struct dyld_all_image_infos *allImageInfos =
(struct dyld_all_image_infos *) infoData.all_image_info_addr;
allImageInfos = (struct dyld_all_image_infos *) malloc(
sizeof(struct dyld_all_image_infos));
if (zz_vm_read_data_via_task(task, infoData.all_image_info_addr,
allImageInfos,
sizeof(struct dyld_all_image_infos))) {
return (zpointer) (allImageInfos->dyldImageLoadAddress);
} else {
return NULL;
}
}
或者通过 dyld export 的 _dyld_get_all_image_infos
最后就是可以尝试 runtime parse macho
注意如何找到 load address.
zz_vm_read_data_via_task这个的实现在哪里,还有能说下 runtime parse macho大概是怎么操作的吗
zz_vm_read_data_via_task
这个是我自己写的函数通过 task
读内存, 如果你要 parse 自身, 直接读就行, 你看下我下面附的 stackoverflow 的链接.
runtime parse macho
, 需要先找目标 dylib 的 load_address
, 之后进行 “正常” 的 macho file parse.
链接无效呢,劳烦再发下
不好意思,原来是上面stackoverflow的链接
参考stackoverflow里面的方法,我在iphone demo中使用 task_for_pid(mach_task_self(),pid, &task),一直返回错误,task的值为0,是不是app需要root权限啊?
看task_for_pid返回多少, 然后去SDK里查这个返回值代表什么
一直返回的都是 (os/kern) failure
这是没签allow task for pid
你可以自己搜下
https://stackoverflow.com/questions/9944451/jailbreak-developer-iphone-with-task-for-pid
签了之后,还是没有权限:
我是ldid -Sent.xml JailbreakDetection 这样签的,ent.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?> com.apple.springboard.debugapplications get-task-allow task_for_pid-allow run-unsigned-code我给你的链接不是有完整的ent了?
你这个ent看不懂
我用的就是你给的链接里面的 ent.xml
zz简直是我的指明灯。。