利用Py-Socket模块做的一个不登陆windows服务器自动实现替换或者调用自动拨号功能
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服务器自动实现替换或者调用自动拨号功能的更多相关文章
- 利用网络Socket和多线程实现一个双向聊天
接收键盘输入然后向对方发送消息的线程 package cn.com.chat; import java.io.BufferedReader; import java.io.BufferedWriter ...
- 利用spring boot+vue做的一个博客项目
技术栈: 后端 Springboot druid Spring security 数据库 MySQL 前端 vue elementUI 项目演示: GitHub地址: 后端:https://githu ...
- Unity进阶:用AssetBundle和Json做了一个玩家登陆界面
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录
geo指令使用ngx_http_geo_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_geo_module.ngx_http_geo_modu ...
- 使用 Python 的 Socket 模块构建一个 UDP 扫描工具
译文:oschina 英文:bt3gl 当涉及到对一些目标网络的侦察时,出发点无疑是首先发现宿主主机.这个任务还可能包含嗅探和解析网络中数据包的能力. 几周前,我曾经谈到了如何使用Wireshark来 ...
- (转)nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录
nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录 原文:http://www.cnblogs.com/kevingrace/p/6165572.html Nginx的geo模块 ...
- 利用SCI做的一个足球答题系统
SCI,异步串行通信接口,内置独立的波特率产生电路和SCI收发器,可以选择发送8或9个数据位(其中一位可以指定为奇或偶校验位). SCI是全双工异步串行通信接口,主要用于MCU与其他计算机或设备之间的 ...
- python基础===socket模块的讲解(转)
一.网络知识的一些介绍 socket 是网络连接端点.例如当你的Web浏览器请求www.jb51.net上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.jb51.net的Web ...
- socket模块和黏包问题
socket套接字简介 编写cs架构的程序 实现数据交互 OSI七层相当复杂 socket套接字是一门技术 socket模块>>>:提供了快捷方式 不需要自己处理每一层 " ...
随机推荐
- fafu 1413
叉积的运用 ,不断的用叉积去判断 最小的拼图, 刚开始对点进行排序,每个人的排序规则不同做法可能不同,我是按照点的x轴进行x轴相同用y小的在前面,然后每个点按照最下的点开始进行查找 每次从一个点出发然 ...
- cmd中mysql中文乱码问题
以下为自己亲试: 解决cmd中MySQL查询和命令返回的中文乱码问题 1.修改cmd字符集方法 rem 切换到UTF-8 chcp 65001 rem 切换到默认的GBK chcp 936 rem 美 ...
- Linux基础命令---sort
sort 以行为单位,对文本文件进行排,并输出排序结果.默认情况下,以每一行为一个单位,从首字符开始按照ASCII码向后逐个比较. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS ...
- Linux基础命令---fsck
fsck 检查或者修复指定的文件系统,可以是设备名.挂载点,还可以是一个ext2的label,或者是一个UUID.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.ope ...
- java多线程----线程池源码分析
http://www.cnblogs.com/skywang12345/p/3509954.html 线程池示例 在分析线程池之前,先看一个简单的线程池示例. 1 import java.util.c ...
- MySQL数据库----单表查询
先创建表 #创建表 create table employee( id int not null unique auto_increment, name varchar(20) not null, s ...
- JS中怎么调用<%%>的值
JS中怎么调用<%%>的值 示例代码一: <% String usercode = request.getParameter("usercode");//用req ...
- 01: JavaScript实例
1.1 基础 JavaScript 实例 <body> <script type="text/javascript"> document.write(&qu ...
- zabbix监控之自定义item
zabbix安装完成后,当需要使用自定义脚本构建自定义item必须注意以下几点: 1.首先使用zabbix_get手动在zabbix-server服务端获取监控的默认的item值,如下: [root@ ...
- VC++开机自动启动程序的几种方法 (转载)
转载:http://blog.csdn.net/zhazhiqiang/article/details/51909703 很多监控软件要求软件能够在系统重新启动后不用用户去点击图标启动项目,而是直接能 ...