c — Переопределить connect () в скрипте PHP, работающем на Apache, с переполнением mod_Stack

Как переопределить системный вызов connect (), вызываемый из скрипта PHP, в запросе Apache, когда PHP включен через mod_php?

У меня есть пользовательская версия connect (), определенная в заказ connect.c:

#define _GNU_SOURCE 1
#include <stdio.h>
#include <arpa/inet.h>
#include <dlfcn.h>

int (*real_connect)(int, const struct sockaddr *, socklen_t);
FILE *f;

void _init (void) {
const char *err;

f = fopen("/tmp/connect.log", "a");

real_connect = dlsym (RTLD_NEXT, "connect");
if ((err = dlerror()) != NULL) {
fprintf (f, "dlsym (connect): %s\n", err);
}
}

int connect(int fd, const struct sockaddr *sk, socklen_t sl) {
static struct sockaddr_in *sk_in;
sk_in = (struct sockaddr_in *)sk;

fprintf(f, "Custom connect: %d %s:%d\n", fd, inet_ntoa(sk_in->sin_addr), ntohs(sk_in->sin_port));

return real_connect(fd, sk, sl);
}

Я компилирую это с:

gcc -nostartfiles -fpic -shared custom-connect.c -o custom-connect.so -ldl

У меня есть простой сценарий завиток-test.php, который внутренне делает вызовы connect ():

<?php
$ch = curl_init("http://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
echo 'Received length: ' . strlen($data) . "\n";

Когда я запускаю свой скрипт с LD_PRELOAD из командной строки:

LD_PRELOAD=./custom-connect.so php curl-test.php

Тогда это выглядит хорошо, я вижу, что мой пользовательский connect () записал что-то /tmp/connect.log:

Custom connect: 4 192.168.178.1:53
Custom connect: 4 93.184.216.34:80

Похоже, что он отлично работает из командной строки.
Но как я могу переопределить connect () своей собственной версией, когда я запускаю свой скрипт из Apache с включенным PHP через mod_php? Должен ли я также использовать LD_PRELOAD? Если да, то как это настроить?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]