【问题标题】:Python to PHP conversion socket connectionPython到PHP转换socket连接
【发布时间】:2020-05-02 15:20:24
【问题描述】:

我在 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

【问题讨论】:

    标签: php python sockets


    【解决方案1】:

    代替

    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");
    
    • 双引号以扩展转义序列
    • 适当替换了 Python 的转换说明符 %b

    这只是一个模板,需要扩展为具体的登录数据包,我们将其命名为$LOGIN,登录名和密码分别为$login$password

    $LOGIN = sprintf(LOGIN_TEMPLATE, 24 + strlen($login) + strlen($password)
                                   , $login, $password, $login, $password, time());
    

    【讨论】:

    • 谢谢!它有效,只有一个问题: 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'\如何在php中转换?我不知道结束行的“\”是什么
    • 见“What is the purpose of a backslash at the end of a line?”。它允许通过拆分长语句来更好地格式化。此外,带有 `\` 的行和后面的字节串被连接成一个,就好像它们都被一对引号括起来一样。
    • 在 PHP 中,您也可以将字符串部分放在一个字符串文字中,或者在它们之间使用连接运算符 .
    猜你喜欢
    • 2017-11-22
    • 2014-01-21
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2015-09-30
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多