猿问

Python 到 PHP 转换套接字连接

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

    }

我试图了解如何生成LOGIN_TEMPLATE。但是我不明白如何解释Python代码如何生成它。任何人都可以帮助我了解如何创建它吗?


原始的python脚本在这里:https://gitlab.com/camshift/dahua-scanner/blob/master/utils/dahua.py


扬帆大鱼
浏览 107回答 1
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());
随时随地看视频慕课网APP
我要回答