MonkeyDev之在MonkeyApp模板中Hook C函数

需求: 有这样一款app,其本身被注入了A.dylib 和B.dylib两个动态链接库,本来想利用MonkeyDev的MonkeyApp模板对app注入新的动态库进行进一步的修改,但发现只要对该app注入任何其他的动态库,app就会提示并闪退。

分析发现:原来是A.dylib这个动态库中使用了_dyld_get_image_name来检测app导入了哪些动态库,如果发现不是A和B这两个动态库就退出,于是乎,使用MSHookFunction来Hook _dyld_get_image_name这个C函数,但总是无法hook成功!!!!

代码:`
#import <CaptainHook/CaptainHook.h>
#import <UIKit/UIKit.h>
#import <Cycript/Cycript.h>
#import <MDCycriptManager.h>
#import <dlfcn.h>
#include <stdint.h>
#include <substrate.h>
#include <mach-o/dyld.h>

char *(*dyld_get_image_name_old123)(uint32_t index);

char *dyld_get_image_name_mine(uint32_t index)
{
char *imageName = dyld_get_image_name_old123(index);
printf("%s",imageName);
return imageName;
}

CHConstructor{
MSHookFunction((void *)_dyld_get_image_name,(void *)dyld_get_image_name_mine, (void **)&dyld_get_image_name_old123);
}`

环境设备:iphone8 plus未越狱,xcode11.1

第一次这样Hook C函数,望各位大佬赐教一下!

我蒙古。。。

非越狱环境不能使用MSHookFunction,因为MSHookFunction是基于Cydia Substrate的,属于inline hook,可以先了解一下hook种类再选择技术方案,大致有inlinehook、fishhook、runtime hook等等

PS:说的不准确别怪我,毕竟我也是小白,只不过既然大神爱说黑话,那就只好我们小白们自己互助

1 个赞

谢谢!
这两天学习后发现,像这样有符号的函数”_dyld_get_image_name“ 是可以使用fishhook进行hook的

我的本意是想hook sub_xxx这样的函数,此时fishhook就没辙了,只能寄希望于CydiaSubstrate的MSHookFunction函数,但是我在这里用MonkeyDev编写的dylib是直接注入到目标app中的,然后重签名整个ipa再安装到非越狱机上

看到很多人都说非越狱环境不能使用MSHookFunction,但是我发现通过MonkeyDev的MonkeyApp模板创建出来的最终ipa是包含有libsubstrate.dylib这个库的,只不过是以LC_LOAD_WEAK_DYLIB引入的,难道这里把Cydia Substrate的库(就是这里的libsubstrate.dylib)直接引入到目标app中,是无法使用MSHookFunction?一定要设备越狱?

另外,目前有其他可用的inline hook库可用在非越狱环境的吗?

:sweat_smile:

非要说什么库能做到,那也只能是 libjailbreak

运行时、 inline hook C 在非越狱不行,修改了__TEXT段 签名校验会把你安排的妥妥的。 撇开“库” 这个思路,可以静态修改mach-o ,也可以找到闪退的指令 静态patch 。。。 思路很多 祝好运!

1 个赞