简单来说就是通过修改可执行文件的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的初始化函数已经执行:
Permalink
你好,我现在刚好遇到这样的问题,我想把一个xxx.dylib的文件注入到一个xxx.app中 ,发现试了很多次都没能成功,希望能得到你的帮助,我的联系方式是qq:1515835306 ,如能帮忙解决定酬谢,期待您的帮助。
Permalink
那么可以通过编辑可执行文件 这个编辑可执行文件是app中的那个文件,还有编辑这个文件需要借助第三方工具么?
Permalink
原理就是这样。
实际中用optool注入会比较方便,而且可以选LC_LOAD_WEAK_DYLIB、LC_LOAD_
UPWARD_DYLIB或者LC_LOAD_DYLIB。功能强大,你值得拥有。
https://github.com/alexzielenski/optool
Permalink
在我的设备是没有工作是为什么