利用U盘与badsub联动监听目标

前情提要

小Q喜欢班花小K,但是小Q不懂得搭讪。因此小Q不知道如何向班花小K表白,某一天小Q无意之中听见网友说,追女孩得会投其所好方能如鱼得水;见缝插针知己知彼方能百战百胜。那问题是小Q如何更加全面的了解小K呢?于是小Q就找到了我,我总不能见死不救啊(在小Q哭天喊地的哀求下)我不得以就让他在网上购买了一个特殊的U盘(BadUSB),然后小Q通过我扔给他的链接《利用U盘与badsub联动监听目标》,在他自己的电脑中重新刷新了这个U盘的代码。接着小Q就把这个特殊的U盘扔到小K的书包里,最后就等小K上钩就可以控制小K的电脑了,接着小Q就可以做一些不可告人的事情。


友情提示:这里如果想进行真人版的测试,可以经过同学的允许在进行试验。事先声明:面包and牛奶所发布的一切关于信息安全的技术文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请您自负。本博客的技术来源于作者在网络上所学。您必须在技术复现前必须得到您攻击目标本人的同意,并且在复现结束后从您的电脑中彻底删除上述内容。如有违法事件发生与作者本人无关。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java可以通过JDK中的Java Native Interface(JNI)调用操作系统的API来获取U盘的插拔事件,从而实现对U盘监听。下面是一个简单的示例代码,演示了如何在Java中监听U盘的插拔事件: ```java import java.io.File; import java.util.Arrays; public class USBListener { static { System.loadLibrary("USBListener"); } public static native void start(); public static void main(String[] args) { USBListener.start(); } public static void onUSBInserted(String drivePath) { System.out.println("U盘已插入:" + drivePath); } public static void onUSBRemoved(String drivePath) { System.out.println("U盘已拔出:" + drivePath); } } ``` 上述代码中,我们定义了一个`USBListener`类,其中包含了一个`start()`方法,用于启动U盘监听功能。在`start()`方法中,我们通过JNI调用了一个名为`startUSBListener()`的C++函数,该函数启动了一个线程,循环遍历系统中的所有驱动器,并检查它们是否是可移动设备。如果是可移动设备,则将其保存到一个列表中,并且在后续的循环中持续检查它们是否被插拔。 当U盘被插入或拔出时,`startUSBListener()`函数会调用`onUSBInserted()`或`onUSBRemoved()`方法,这两个方法都是Java中的静态方法,可以在任何地方被调用。在本例中,我们只是简单地打印了一条消息,表示U盘已经插入或拔出了。 我们还需要在C++中实现`startUSBListener()`函数的代码,这里我们使用了Windows API来获取系统中的驱动器列表,并检查它们是否是可移动设备。以下是`startUSBListener()`函数的C++实现代码: ```cpp #include <Windows.h> #include <stdio.h> #include <stdlib.h> #include "USBListener.h" #define MAX_DRIVES 26 void startUSBListener(JNIEnv *env, jclass cls) { DWORD drives = GetLogicalDrives(); char driveLetter[] = "A:\\"; for (int i = 0; i < MAX_DRIVES; i++) { if ((drives & (1 << i)) != 0) { driveLetter[0] = 'A' + i; UINT type = GetDriveType(driveLetter); if (type == DRIVE_REMOVABLE) { HANDLE hDevice = CreateFile(driveLetter, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDevice != INVALID_HANDLE_VALUE) { char buf[MAX_PATH]; DWORD len; if (DeviceIoControl(hDevice, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &buf, sizeof(buf), &len, NULL)) { STORAGE_DEVICE_NUMBER *number = (STORAGE_DEVICE_NUMBER *) &buf; char drivePath[MAX_PATH]; sprintf(drivePath, "\\\\.\\PhysicalDrive%d", number->DeviceNumber); HANDLE hDrive = CreateFile(drivePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDrive != INVALID_HANDLE_VALUE) { OVERLAPPED overlapped = {}; char buffer[512]; DWORD bytesReturned; if (DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &buf, sizeof(buf), &len, &overlapped)) { while (1) { Sleep(1000); if (DeviceIoControl(hDrive, IOCTL_STORAGE_CHECK_VERIFY2, NULL, 0, NULL, 0, &bytesReturned, &overlapped)) { USBListener::onUSBRemoved(driveLetter); break; } else { if (GetLastError() == ERROR_NOT_READY) { USBListener::onUSBInserted(driveLetter); break; } } } } CloseHandle(hDrive); } } CloseHandle(hDevice); } } } } } ``` 在上述代码中,我们首先调用`GetLogicalDrives()`函数获取系统中所有的驱动器列表,然后遍历这个列表,并检查每个驱动器是否是可移动设备。如果是可移动设备,则使用`CreateFile()`函数打开该设备,并获取其设备号。然后,我们将设备号作为参数,使用`CreateFile()`函数打开该设备对应的物理驱动器,并调用`DeviceIoControl()`函数发送`IOCTL_STORAGE_CHECK_VERIFY2`控制码,以检查该U盘是否已经被插入或拔出。 如果`DeviceIoControl()`函数返回了`ERROR_NOT_READY`错误码,则表示该U盘已经被拔出,我们就调用`USBListener::onUSBRemoved()`方法通知Java代码;如果`DeviceIoControl()`函数成功返回,则表示该U盘已经被插入,我们就调用`USBListener::onUSBInserted()`方法通知Java代码。在检测到U盘被插入或拔出后,我们需要使用`Sleep()`函数等待一段时间,以避免频繁地检查设备状态导致CPU占用过高。 最后,我们需要使用JNI将C++代码编译成动态链接库,以供Java代码调用。以下是`USBListener.h`文件的内容: ```cpp #include <jni.h> #ifdef __cplusplus extern "C" { #endif JNIEXPORT void JNICALL Java_USBListener_startUSBListener(JNIEnv *, jclass); #ifdef __cplusplus } #endif ``` 然后,我们需要使用C++编译器将上述代码编译成动态链接库,以供Java代码调用。在Windows下,可以使用MinGW或Visual C++等编译器来编译,例如: ```bash g++ -shared -o USBListener.dll -I"C:\Program Files\Java\jdk1.8.0_231\include" -I"C:\Program Files\Java\jdk1.8.0_231\include\win32" USBListener.cpp ``` 编译完成后,我们就可以在Java代码中使用`System.loadLibrary()`方法加载该动态链接库,并调用`USBListener.start()`方法启动U盘监听功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值