Недавно кто-то тут спрашивал, а мне сегодня это тоже понадобилось. В общем:
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <dlfcn.h>
typedef int (* BindFn)(int s, const struct sockaddr *a, socklen_t al);
int bind(int s, const struct sockaddr *a, socklen_t al)
{
BindFn real_bind_fn = dlsym(RTLD_NEXT, "bind");
if (a->sa_family == AF_INET)
{
struct sockaddr_in new_addr;
memcpy(&new_addr, a, sizeof(*a));
new_addr.sin_port = htons(12345 /* Your port here */);
return real_bind_fn(s, (const struct sockaddr *)&new_addr, al);
}
return real_bind_fn(s, a, al);
}
gcc -Wall -Wextra -fPIC -shared -ldl rebind.c -o rebind.so
LD_PRELOAD=./rebind.so start_your_program_here