简单来说就是通过修改可执行文件的Load Commands,增加一个LC_LOAD_DYLIB,写入dylib路径。这样程序执行的时候就会来编译这个LC_LOAD_DYLIB找到要注入的dylib,从而进行加载。
新建一个简单的testApp,编译生成,使用MachoOView查看结构如下:
可以知道程序默认加载了Foundation、libobjc.A.dylib、libSystem.B.dylib、UIKit。
那么可以通过编辑可执行文件加上一个自己的dylib。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
struct ProgramVars
{ const void * mh ; int * NXArgcPtr ; const char *** NXArgvPtr ; const char *** environPtr ; const char ** __prognamePtr ; } ; __attribute__ ( (constructor ) ) static void EntryPoint ( ) { NSLog (@ "我就是那个注入的动态库文件咯" ) ; } static __attribute__ ( (constructor ) ) void dylib_init ( int argc , const char * argv [ ] , const char * envp [ ] , const char * apple [ ] , const struct ProgramVars * vars ) { NSLog (@ "exe name:%s" ,*vars ->__prognamePtr ) ; NSLog (@ "%@" ,@ "args======" ) ; for ( int i = 0 ; i < argc ; i ++ ) { NSLog (@ "%s" ,argv [i ] ) ; } int i = 0 ; NSLog (@ "%@" ,@ "envp======" ) ; while (envp [i ] != NULL ) { NSLog (@ "%s" ,envp [i ] ) ; i ++; } } |
如下:
并指定文件路径为可执行文件路径下,所以需要拷贝注入的dylib文件到.app目录下:
然后使用codesign对libinject.dylib,以及可执行文件重新签名。
安装运行于非越狱机上:
查看设备Log,可以看到dylib的初始化函数已经执行:
本文链接:http://www.blogfshare.com/inject-with-njb.html
转载提示:除非注明,AloneMonkey的文章均为原创,转载请以链接形式注明作者和出处。谢谢合作!