概要
- linux 中使用
LD_PRELOAD
- mac osx 中使用
DYLD_INSERT_LIBRARIES
在DYLD_FORCE_FLAT_NAMESPACE=1
环境下
对网络相关的 API(sys/socket.h
, 见 src/libproxychains.c
) 进行 hook 实现代理的功能
细节
src/libprocychains.c
// hook socket 相关的函数
static void setup_hooks(void) {
SETUP_SYM(connect);
SETUP_SYM(sendto);
SETUP_SYM(gethostbyname);
SETUP_SYM(getaddrinfo);
SETUP_SYM(freeaddrinfo);
SETUP_SYM(gethostbyaddr);
SETUP_SYM(getnameinfo);
SETUP_SYM(close);
}
src/main.c
// 主要逻辑如下,加载动态链接库,然后执行后面的程序,由于是同一个进程仅仅更换执行的代码所以动态链接的网络库使用的是修改过的不会变
// proxychains4 curl http://ipecho.net/plain; echo
int main(int argc, char *argv[]) {
int start_argv = 1;
putenv("LD_PRELOAD=/usr/local/lib/libproxychains4.dylib");
execvp(argv[start_argv], &argv[start_argv]);
}
待续
references
- https://github.com/rofl0r/proxychains-ng
- http://www.catonmat.net/blog/simple-ld-preload-tutorial/
- http://www.catonmat.net/blog/simple-ld-preload-tutorial-part-2/