I want to hook socket function in libc on Android platform, and implement as Suterusu. Give some code below:
void hookrw_init ( void )
{
__android_log_print(ANDROID_LOG_INFO, "hook_function", "Hooking socket\n");
void *libcHandle = dlopen("/system/lib/libc.so", RTLD_NOW);
__android_log_print(ANDROID_LOG_INFO, "hook_function", "open libc.so\n");
if (libcHandle != 0) {
socket_connect = (void *)dlsym(libcHandle, "connect");
hijack_start(socket_connect, &on_connect);
}
static int on_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
char *ip = inet_ntoa(((struct sockaddr_in *)addr)->sin_addr);
int port = ((struct sockaddr_in *)addr)->sin_port;
__android_log_print(ANDROID_LOG_INFO, "hook_function", "on_connect, ip=%s, port=%d\n", ip, port);
hijack_pause(socket_connect);
__android_log_print(ANDROID_LOG_INFO, "hook_function", "call connect on socket\n");
int ret = socket_connect(sockfd, addr, addrlen);
__android_log_print(ANDROID_LOG_INFO, "hook_function", "connect return=%d\n", ret);
hijack_resume(socket_connect);
return ret;
}
But the implement above is not thread safe, especially between hijack_pause and hijack_resume cannot hook socket connect function, and every pause/resume need to do cacheflush, It's maybe performance issue. Could you give me some advices?