java写windows抓包工具

news2024/9/24 23:26:16

使用jna调用windows api,前提是jna提供了dll的一些操作方法, 但是具体接口映射需要在java实现一遍映射

这里分了几个小文件做映射

先看main class

/*
 * This source file was generated by the Gradle 'init' task
 */
package wpcap.app;

import java.net.InetAddress;

import com.sun.jna.ptr.IntByReference;

import wpcap.library.WinSock2Library;
import wpcap.library.structure.WsaDataStructure;
import wpcap.library.structure.SockaddrInStructure;


public class Main {
    public static void main(String[] args) {
        // 开启 WSAStartup
        WsaDataStructure WsaDataStructure = new WsaDataStructure();  
        int errno = WinSock2Library.INSTANCE.WSAStartup((short)0x0202, WsaDataStructure);  

        if (errno != 0) {  
            System.out.println("WSAStartup: " + errno);  
            return;
        }

        System.out.println(new String( WsaDataStructure.szDescription ) );  

        // 创建 socket
        long raw_socket = WinSock2Library.INSTANCE.socket(WinSock2Library.AF_INET, WinSock2Library.SOCK_RAW, WinSock2Library.IPPROTO_IP);
        System.out.println("socket: " + raw_socket);  
        if (raw_socket == 0) {  
            System.out.println("socket: " + errno);  
            return;
        }

        // 允许接收ip头
        byte[] enable = {1};
        WinSock2Library.INSTANCE.setsockopt(
            raw_socket, 
            WinSock2Library.IPPROTO_IP, 
            WinSock2Library.IP_HDRINCL, 
            enable, 
            Integer.SIZE
        );

        // 绑定监听的ip和端口
        SockaddrInStructure SockaddrInStructure = new SockaddrInStructure();
        SockaddrInStructure.sin_family = (short)WinSock2Library.AF_INET;
        SockaddrInStructure.sin_port = (short)0;
        try {
            InetAddress localHost = InetAddress.getLocalHost();
            byte[] ip = localHost.getAddress();

            System.arraycopy(ip, 0, SockaddrInStructure.sin_addr, 0, 4);
        } catch (Exception e) {
            System.out.println(e);  
        }
    
        errno = WinSock2Library.INSTANCE.bind(raw_socket, SockaddrInStructure, SockaddrInStructure.size());
        if (errno != 0) {  
            System.out.println("bind: " + errno);  
            return;
        }

        // 设置混杂模式
        IntByReference dwValue = new IntByReference( WinSock2Library.SIO_RCVALL_ON );
        errno = WinSock2Library.INSTANCE.ioctlsocket( raw_socket, WinSock2Library.SIO_RCVALL, dwValue );
        if (errno != 0) {  
            System.out.println("WSAGetLastError: " + errno);  
            return;
        }

        System.out.println("启动成功");  

        // 开始接收数据包
        byte[] buf = new byte[512]; 
        while (true) {
            int rec = WinSock2Library.INSTANCE.recv(raw_socket, buf, 512, 0);
            if ( rec != -1 ) {
                System.out.println("rec: " + rec);  
            }
        }
    }


}

接着是WinSock2Library.java 映射WinSock2.h

package wpcap.library;

import com.sun.jna.Library;  
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;

import wpcap.library.structure.WsaDataStructure;  
import wpcap.library.structure.SockaddrInStructure;  

// char*	ByteByReference或Pointer
// char**	PointerByReference
// char&	PointerByReference

// int*	    IntByReference或Pointer
// int&	    IntByReference

// float*	FloatByReference或Pointer
// double*	DoubleByReference或Pointer

// void **	PointerByReference
// void*	Pointer

// LPCVOID  byte[]/Pointer
// DWORD    int/long
// LPDWORD  IntByReference/LongByReference
// LPOVERLAPPED com.sun.jna.platform.win32.WinBase.OVERLAPPED
// OVERLAPPED com.sun.jna.platform.win32.WinNT.OVERLAPPED_COMPLETION_ROUTINE
// LPCWSTR  String
// LPWSTR   char[]/String
// HANDLE   com.sun.jna.platform.win32.WinNT.HANDLE
// SIZE_T   int/long
// PDWORD   DWORDByReference

// Pointer  Memory
// DWORD    DWORD

public interface WinSock2Library extends Library {
    WinSock2Library INSTANCE = (WinSock2Library) Native.load("ws2_32", WinSock2Library.class);

    int WSAStartup(short wVersionRequired, WsaDataStructure lpWSAData);

    long socket(int family, int socktype, int protocol);

    int setsockopt(long socket, int protocol, int opt, byte[] optVal, int optLen);

    int bind(long socket, SockaddrInStructure sockaddr, int sockaddr_len);

    int ioctlsocket(long socket, long dwIoControlCode, IntByReference lpvInBuffer);

    int recv(long socket, byte[] buf, int len, int flags);

    int WSAGetLastError();

    int AF_INET = 2;

    int SOCK_RAW = 3;

    int IPPROTO_IP = 0;

    long SIO_RCVALL = 0x98000001L; // 2550136833

    int SIO_RCVALL_ON = 0x00000001;

    int IP_HDRINCL = 2;
}

接着是结构体映射

WsaDataStructure.java

package wpcap.library.structure;

import com.sun.jna.Structure;  
import com.sun.jna.Structure.FieldOrder;  

@FieldOrder({"wVersion", "wHighVersion", "szDescription", "szSystemStatus", "iMaxSockets", "iMaxUdpDg", "lpVendorInfo"})
public class WsaDataStructure extends Structure {
    public short wVersion;  
    public short wHighVersion;  
    public short iMaxSockets;  
    public short iMaxUdpDg;  
    public char lpVendorInfo;  
    public byte[] szDescription = new byte[WSADESCRIPTION_LEN + 1];  
    public byte[] szSystemStatus = new byte[WSASYS_STATUS_LEN + 1];  

    public static final int WSADESCRIPTION_LEN = 256;  
    public static final int WSASYS_STATUS_LEN = 128;  
}

SockaddrInStructure.java

package wpcap.library.structure;

import com.sun.jna.Structure;  
import com.sun.jna.Structure.FieldOrder;  

@FieldOrder({"sin_family", "sin_port", "sin_addr", "sin_zero"})
public class SockaddrInStructure extends Structure {
    public short sin_family;
    public short sin_port;
    public byte[] sin_addr = new byte[4];
    public byte[] sin_zero = new byte[8];
}

Library是映射对应的dll接口

Struture是映射一些数据结构

以这种映射的方法达到java使用jna来调用windows api实现抓包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

neo4j小白入门

1.建立几个学校的节点 1.1创建一个节点的Cypher命令 create (Variable:Lable {Key1:Value,Key2,Value2}) return Variable 1.2创建一个学校的节点 create (n:School{name:清华大学,code: 10003,establishmentDate:date ("1911-04-29")})return n 1.3一次创建几个…

Ribbon布局和尺寸调整

Ribbon布局和尺寸调整 在本文中 Ribbon大小调整概述 默认大小调整行为 指定自定义调整大小行为 控件级调整 Ribbon使用自适应布局和调整大小来呈现各种窗口大小的最佳控件布局。Ribbon提供默认的大小调整行为,适用于许多常见场景。WPF的Microsoft Ribbon还提供了一…

【可图(Kolors)部署与使用】大规模文本到图像生成模型部署与使用教程

✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 💫 欢迎来到我的学习笔记! 1.Kolors 简介 1.1.什么是Kolors? 开发团队 Kolors 是由快手 Kolors 团队…

组合优化与凸优化 学习笔记4 凸优化问题

优化问题基本定义 假如f(x)是方圆R以内(R只要大于0就行)最好的一个解 等价问题 就是这种优化函数没啥区别(乘了个系数),约束们也就多了个系数的情况,这和原本的显然一样。这是等价的最简单的例子。 归根结…

MES系统如何提升制造企业的运营效率和灵活性

参考拓展:苏州稳联-西门子MES系统-赋能智能制造的核心引擎 制造执行系统(MES)在提升制造企业运营效率和灵活性方面发挥着关键作用。 一、MES系统的基本概念和功能 MES系统是连接企业管理层与生产现场的重要桥梁。它主要负责生产调度、资源管理、质量控制等多个方…

【C++ 基础数学 】2121. 2615相同元素的间隔之和|1760

本文涉及的基础知识点 基础数学 LeetCode2121. 相同元素的间隔之和 难度分:1760 令2165,和此题几乎相等。 给你一个下标从 0 开始、由 n 个整数组成的数组 arr 。 arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i] 和…

李宏毅2023机器学习HW15-Few-shot Classification

文章目录 LinkTask: Few-shot ClassificationBaselineSimple—transfer learningMedium — FO-MAMLStrong — MAML Link Kaggle Task: Few-shot Classification The Omniglot dataset background set: 30 alphabetsevaluation set: 20 alphabetsProblem setup: 5-way 1-sho…

9/24作业

1. 分文件编译 分什么要分文件编译? 防止主文件过大,不好修改,简化编译流程 1) 分那些文件 头文件:所有需要提前导入的库文件,函数声明 功能函数:所有功能函数的定义 主函数:main函数&…

请不要在TS中使用Function类型

在 TypeScript 中,避免使用 Function 作为类型。Function 代表的是“任意类型的函数”,这会带来类型安全问题。对于绝大多数情况,你可能更希望明确地指定函数的参数和返回值类型。 如果你确实想表达一个可以接收任意数量参数并返回任意类型的…

Kali wireshark抓包

wireshark 查看指定网卡进出流量 构造一个只能显示ICMP数据包的显示过滤器 ARP 同理,显示过滤器会屏蔽所有除了 ARP 请求和回复之外的数据包

力扣 中等 92.反转链表 II

文章目录 题目介绍题解 题目介绍 题解 class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {// 创建一个哑节点,它的 next 指向头节点,方便处理ListNode dummy new ListNode(0, head);// p0 用于指向反转部分的前一个…

3. 轴指令(omron 机器自动化控制器)——>MC_MoveVelocity

机器自动化控制器——第三章 轴指令 6 MC_MoveVelocity变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 动作示例▶动作示例▶梯形图▶结构文本(ST) MC_MoveVelocity 使用伺服驱动器的位置控制模式,进行…

聊一下cookie,session,token的区别

cookie cookie是存放在客户端的,主要用于会话管理和用户数据保存;cookie通过http报文的请求头部分发送给服务器,服务器根据cookie就可以获取到里面携带的session id(用于获取服务器中对应的session数据),因为http是无状态协议,我们通常就是通过cookie去维护状态的 cookie是在…

Kali 联网

VMware 中分三种网络模式 桥接模式:默认余宿主机 VMnet0 绑定,像一台独立机 NAT 模式:默认余宿主机 VMnet8 绑定,需要通过物理机连接外网 仅主机模式:默认余宿主机 VMnet1 绑定,只能与物理机通信 VMware…

Linux系统容器化部署中,构建Docker 镜像中包含关键指令和参数的文件dockerfile的详细介绍

目录 一、Dockerfile的用处 1、自动化构建 2、可重复性 3、可移植性 4、版本控制 5、优化镜像大小 6、便于分享和分发 二、Dockerfile 的基本结构 1、基础镜像(FROM) 2、维护者信息(MAINTAINER/LABEL maintainer) 3、设置工作目…

C++之STL—List 链表

双向链表 链表的组成:链表由一系列**结点**组成 结点的组成:一个是存储数据元素的**数据域**,另一个是存储下一个结点地址的**指针域** STL中的链表是一个双向循环链表 构造函数 List 赋值和交换 容器大小操作 - 判断是否为空 --- empty - …

深度学习实战:UNet模型的训练与测试详解

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 1、云实例:配置选型与启动1.1 登录注册1.2 配置 SSH 密钥对1.3 创建实例1.4 登录云实例 2、云存储:数据集上传…

JavaScript --json格式字符串和对象的转化

json字符串解析成对象 &#xff1a; var obj JSON.parse(str) 对象转化成字符串&#xff1a;var str1 JSON.stringify(obj1) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…

第五篇:Linux进程的相关知识总结(1)

目录 第四章&#xff1a;进程 4.1进程管理 4.1.1进程管理需要的学习目标 4.1.1.1了解进程的相关信息 4.1.1.2僵尸进程的概念和处理方法&#xff1a; 4.1.1.3PID、PPID的概念以及特性&#xff1a; 4.1.1.4进程状态 4.1.2进程管理PS 4.1.2.1静态查看进程 4.1.2.1.1自定义…

搭建EMQX MQTT服务器并接入Home Assistant和.NET程序

本文主要介绍如何使用Docker搭建EMQX MQTT服务器&#xff0c;并将其接入到Home Assistant中&#xff0c;最后演示如何使用.NET接入MQTT。 1. 背景 在智能家居系统中&#xff0c;MQTT&#xff08;消息队列遥测传输协议&#xff09;是一种轻量级的消息传输协议&#xff0c;特别适…