xu言:

最近,有个朋友让我帮忙“搞点事情”,然后正好在学习socket模块,这个模块666啊,基本上可以实现远程服务器cmd shell的大部分功能。好,话不多说,直接上码~

由于很多电信运营商都会封杀UDP端口,外网服务器这种就不建议使用UDP端口了。直接使用TCP来实现,那么还有一个问题。windows的拨号和把账号填入adsl客户端上面的方法怎么处理呢?

cmd自带命令:

rasdial 宽带连接 /disconnect && rasdial 宽带连接 %s %s

三方工具:

http://www.nirsoft.net/utils/dialupass.html

Dialupass /setpass 宽带连接 %s %s

如果以上两个命令你都搞清楚是什么了,那么下面代码就很好写了:

Server:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "loki" import json
import socket
import struct
import subprocess
import time s_ip = ("0.0.0.0", 19999)
c_time = time.strftime("%Y-%m-%d %X", time.localtime()) win_ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
win_ser.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
win_ser.bind(s_ip)
win_ser.listen(5)
print('Server listening begin ,port %s' % s_ip[1]) # get socket
while 1:
conn, address = win_ser.accept() while 1:
try:
cmd = conn.recv(1024)
print('Receive client[%s] command : %s %s' % (address, cmd, c_time))
client_cmd = cmd.decode('utf-8')
client_cmd = client_cmd.split()
cmd_len = len(client_cmd)
if cmd_len == 3 and client_cmd[0] == 'Dial':
username = client_cmd[1]
password = client_cmd[2]
# command = "echo %s %s" % (username, password)
# command = "rasdial 宽带连接 /disconnect && rasdial 宽带连接 %s %s" % (username, password)
command = "Dialupass /setpass 宽带连接 %s %s" % (username, password)
cmd_execute = subprocess.Popen(command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = cmd_execute.stdout.read()
stderr = cmd_execute.stdout.read()
# if not cmd:
# break # DIY head
header_dict = {
'total_size': len(stdout) + len(stderr),
'filename': None
}
header_bytes = json.dumps(header_dict).encode('utf-8') # Send head length
header_len = struct.pack('i', len(header_bytes))
conn.send(header_len)
# Send head
conn.send(header_bytes)
# conn.send(cmd_execute) # Send data
conn.send(stdout)
conn.send(stderr)
else:
print('hello...')
stdout = 'Please input correct command!Format:Dial <username> <password>'.encode('utf-8')
# DIY head
header_dict = {
'total_size': len(stdout),
'filename': None
}
header_bytes = json.dumps(header_dict).encode('utf-8') # Send head length
header_len = struct.pack('i', len(header_bytes))
conn.send(header_len)
# Send head
conn.send(header_bytes)
# conn.send(cmd_execute) # Send data
conn.send(stdout) except Exception as e:
print(e)
break
conn.close()
# win_ser.close()

Client:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "loki" import json
import socket
import struct c_ip = ('127.0.0.1', 19999)
win_cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
win_cli.connect(c_ip) while 1:
mes = input('>>').strip()
if mes == 'Quit':
break
if not mes:
continue win_cli.send(mes.encode('utf-8'))
# receive head length
res_head_len = win_cli.recv(4)
# unpack head length
# print(res_head_len, type(res_head_len))
head_size = struct.unpack('i', res_head_len)[0]
# receive head length content
header_bytes = win_cli.recv(head_size).decode('utf-8')
# to head dic json
header_json = json.loads(header_bytes)
# get data length
data_size = header_json['total_size'] # receive data to the length of the header
receive_size = 0
total_data = b''
while receive_size < data_size:
data_receive = win_cli.recv(1024)
if (data_size - len(data_receive)) < 1024:
left_data = win_cli.recv(data_size - len(data_receive))
total_data += left_data
total_data += data_receive
receive_size += len(data_receive) print(total_data.decode('GBK'))

Warp-up:

1.期间遇到系统是xp、win2003大部分都是32位,建议编译的时候使用最高不能超过python34版本

2.为了更好的配合windows服务启动 使用pyinstaller -F 把py代码转换为exe

3.使用exe to 服务包把exe程序作为服务启动(期间用到:instsrv.exe <服务名> x:\xxx\srvany.exe,并且自己创建注册表项Parameters.项下面需要2个字符串值AppDirectory(目录路径)和Application(绝对路径)),添加服务成功后还需要在相应创建的服务上 服务-属性-登陆-打勾“服务与桌面交互”

遗留问题,如何配合服务关闭的时候kill掉这个socket的server进程。感觉还有很多地方都可以用到,比如监控、比如自动化执行某些任务。。。当然,安全问题也需要深入研究。避免被恶意利用做非法用途。以上代码仅供学习研究之用,切勿做非法用途!

利用Py-Socket模块做的一个不登陆windows服务器自动实现替换或者调用自动拨号功能的更多相关文章

  1. 利用网络Socket和多线程实现一个双向聊天

    接收键盘输入然后向对方发送消息的线程 package cn.com.chat; import java.io.BufferedReader; import java.io.BufferedWriter ...

  2. 利用spring boot+vue做的一个博客项目

    技术栈: 后端 Springboot druid Spring security 数据库 MySQL 前端 vue elementUI 项目演示: GitHub地址: 后端:https://githu ...

  3. Unity进阶:用AssetBundle和Json做了一个玩家登陆界面

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  4. nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录

    geo指令使用ngx_http_geo_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_geo_module.ngx_http_geo_modu ...

  5. 使用 Python 的 Socket 模块构建一个 UDP 扫描工具

    译文:oschina 英文:bt3gl 当涉及到对一些目标网络的侦察时,出发点无疑是首先发现宿主主机.这个任务还可能包含嗅探和解析网络中数据包的能力. 几周前,我曾经谈到了如何使用Wireshark来 ...

  6. (转)nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录

    nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录 原文:http://www.cnblogs.com/kevingrace/p/6165572.html Nginx的geo模块 ...

  7. 利用SCI做的一个足球答题系统

    SCI,异步串行通信接口,内置独立的波特率产生电路和SCI收发器,可以选择发送8或9个数据位(其中一位可以指定为奇或偶校验位). SCI是全双工异步串行通信接口,主要用于MCU与其他计算机或设备之间的 ...

  8. python基础===socket模块的讲解(转)

    一.网络知识的一些介绍 socket 是网络连接端点.例如当你的Web浏览器请求www.jb51.net上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.jb51.net的Web ...

  9. socket模块和黏包问题

    socket套接字简介 编写cs架构的程序 实现数据交互 OSI七层相当复杂 socket套接字是一门技术 socket模块>>>:提供了快捷方式 不需要自己处理每一层 " ...

随机推荐

  1. MySQL从删库到跑路_高级(六)——索引

    作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.索引简介 1.索引简介 索引(Index)是帮助MySQL高效获取数据的数据结构. 在MySQL中,索引属于存储 ...

  2. Intro to Python for Data Science Learning 7 - 2D NumPy Arrays

    2D NumPy Arrays from:https://campus.datacamp.com/courses/intro-to-python-for-data-science/chapter-4- ...

  3. linux常用命令:iostat 命令

    Linux系统中的 iostat 是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会 汇报出CPU使用情况 ...

  4. Cannot find JRE '1.8'

  5. ACM题目———— 一种排序(STL之set)

    描述 输入 第一行有一个整数 0<n<10000,表示接下来有n组测试数据:每一组第一行有一个整数 0<m<1000,表示有m个长方形:接下来的m行,每一行有三个数 ,第一个数 ...

  6. mysql分类和事务回滚

    主要内容: ***数据定义语言DDL重点 ***数据操纵语言DML重点 数据查询语言DQL重点 ---事务控制语言TCL ---数据库控制语言DCL ---主键(primary key) ---数据冗 ...

  7. mysql与oracle常用函数及数据类型对比00持续补充

    最近在转一个原来使用oracle,改为mysql的系统,有些常用的oracle函数的mysql实现顺便整理了下,主要是系统中涉及到的(其实原来是专门整理过一个详细doc的,只是每次找word麻烦). ...

  8. mysql jdbc性能优化之mybatis/callablestatement调用存储过程mysql jdbc产生不必要的元数据查询(已解决,cpu负载减少20%)

    INFO | jvm 1 | 2016/08/25 15:17:01 | 16-08-25 15:17:01 DEBUG pool-1-thread-371dao.ITaskDao.callProce ...

  9. Android 实践项目开发二

    在地图开发中项目中,我这周主要完成的任务是和遇到的问题是以下几个方面. 1.在本次的项目中主要是利用百度地图的.jar包实现地图的定位与搜索功能,需要在百度地图开发中心网站取得 密钥,并下载相关.ja ...

  10. 关于Qt跨线程调用IO子类的理解

    一.疑问 突然想到,类似于QTcpsocket和QSerialport这类对象,如果是在A线程中new的,那就不能在其他线程中访问.我一般是这样做的: 封装一个QObject子类,放这些对象进去,然后 ...