Python к PHP подключение конверсионного разъема - PullRequest
0 голосов
/ 15 января 2020

у меня есть этот скрипт в python:

LOGIN_TEMPLATE = b'\xa0\x00\x00\x60%b\x00\x00\x00%b%b%b%b\x04\x01\x00\x00\x00\x00\xa1\xaa%b&&%b\x00Random:%b\r\n\r\n'
GET_SERIAL = b'\xa4\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
             b'\x00\x00\x00\x00\x00\x00\x00'
GET_CHANNELS = b'\xa8\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
               b'\x00\x00\x00\x00\x00\x00\x00\x00'
GET_SNAPSHOT = b'\x11\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
               b'\x00\x00\x00\n\x00\x00\x00%b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
               b'\x00\x00%b\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

TIMEOUT = 10

  self.serial = ''
        self.channels_count = -1
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.settimeout(TIMEOUT)
        self.socket.connect((ip, port))
        self.socket.send(LOGIN_TEMPLATE % (struct.pack('b', 24 + len(login) + len(password)), login.encode('ascii'),
                                           (8 - len(login)) * b'\x00', password.encode('ascii'),
                                           (8 - len(password)) * b'\x00', login.encode('ascii'),
                                           password.encode('ascii'), str(int(time.time())).encode('ascii')))
        data = self.socket.recv(128)

есть способ конвертировать в php?

я создаю пример того, что я пытаюсь.

$login = 'admin';
$password ='admin';
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    define('LOGIN_TEMPLATE', '\xa0\x00\x00\x60%b\x00\x00\x00%b%b%b%b\x04\x01\x00\x00\x00\x00\xa1\xaa%b&&%b\x00Random:%b\r\n\r\n');

    if (!is_resource($socket)) {
        echo 'Unable to create socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
    }

    if (!socket_bind($socket, '11.11.11.11', 1024)) {
        echo 'Unable to bind socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
    }

    $rval = socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR);

    if ($rval === false) {
        echo 'Unable to get socket option: '. socket_strerror(socket_last_error()) . PHP_EOL;
    } else if ($rval !== 0) {
        echo 'SO_REUSEADDR is set on socket !' . PHP_EOL;
    }


    $len = strlen(LOGIN_TEMPLATE); // how to insert login e password ??


    $sendMsg = socket_send($socket, LOGIN_TEMPLATE, $len, MSG_DONTROUTE);// how to insert login e password ??

    $buf = '';
    if (false !== ($bytes = socket_recv($socket, $buf, 128, MSG_WAITALL))) {
        echo "Read $bytes bytes from socket_recv(). Closing socket...";
    } else {
        echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n";
    }

Я пытался понять, как генерировать LOGIN_TEMPLATE. но я не понимаю, как интерпретировать python код о том, как его сгенерировать. Может кто-нибудь помочь мне понять, как его создать?

оригинальный сценарий python здесь: https://gitlab.com/camshift/dahua-scanner/blob/master/utils/dahua.py

1 Ответ

1 голос
/ 16 января 2020

Вместо

define('LOGIN_TEMPLATE', '\xa0\x00\x00\x60%b\x00\x00\x00%b%b%b%b\x04\x01\x00\x00\x00\x00\xa1\xaa%b&&%b\x00Random:%b\r\n\r\n');

записать

define('LOGIN_TEMPLATE', "\xa0\x00\x00\x60%c\x00\x00\x00%-'\x008s%-'\x008s\x04\x01\x00\x00\x00\x00\xa1\xaa%s&&%s\x00Random:%d\r\n\r\n");
  • в двойных кавычках, чтобы получить расширенные escape-последовательности
  • Python спецификатор преобразования %b заменено соответствующим образом

Это просто шаблон , который необходимо расширить до конкретного пакета данных для входа в систему, назовем его $LOGIN, с логин и пароль в $login и $password соответственно:

$LOGIN = sprintf(LOGIN_TEMPLATE, 24 + strlen($login) + strlen($password)
                               , $login, $password, $login, $password, time());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...