关于 %ctor {} 调用时机的疑惑

一般在对c/c++函数的hook方法MSHookFunction都写在 %ctor {}里,比方说目标app中有一个c函数void test(),我现在需要hook掉这个test()函数,如果在%ctor执行之前目标app中就调用了test()函数,那对test的hook显然就失败了,我现在的疑问是我的插件hook一个app之后,插件中 %ctor的调用时机是什么时候,或者说怎样做才能使hook对全局的app都有效,不管目标app中何时调用test()函数?

@snakeninny,求狗神解惑!

我印象中,%ctormain前就调用了,你可以写个demo试试看;test怎么着也得在main之后调用吧?

不存在你说的情况

%ctor确实是在main之前调用的

那你在ctor里hook test的话就没有问题啊

嗯啊,之前我是怀疑有些app会在main函数之前做些啥操作,后来发现是自己想多了

看下dyld源码,主程序的都是最后才执行

还有一种办法就是直接改二进制的 test 函数的指令,绝对安全可靠。

用啥框架修改呀

嗯啊,刚去查了下主程序之前系统执行的操作

https://github.com/opensource-apple/dyld/blob/master/src/ImageLoader.cpp#L493

按照依赖顺序调用的, 然而插件和主程序互不依赖, 但是加载时机早很多

明白,dyld会先加载链接所有的动态库,然后再跳到主程序的入口,插件加载时间确实是早于主程序