用WinForm写一个虚拟WiFi助手玩玩(附源码)

这早不是什么新鲜的东西了,同类软件已经有很多,但不是收费就是有广告,在学校的时候就想自已写一个了,但那时候啥也没学,对C的掌握程度也就是定义几个变量,打印一行“Hello,world”这样,为了写这破玩意,还特意跑图书馆看了几天的VB,然后网上拷了些代码,用调cmd的方式实现了基本功能。到现在也做了1年的.Net码农了,打算重新撸一个,windows应该会开放这方面的api,估计也简单。

在开始之前我搜了一下,貌似没有用.Net写的,应该早有人写过只是没发出来吧。唯一找到的就是在codeplex上的一个开源项目Virtual Router,于是就使用了它的部分代码。

下面是最终的程序

界面比较挫,我们就不要在意这些细节了,来看看实现过程吧。

MSDN上有关于虚拟wifi的详细文档,里面介绍了一些概念和相关函数的用途。地址

windows的api是用C写的,C#调用C就要用到PInvoke(平台调用)方面的知识,主要涉及的类有:

  • DllImportAttribute:表示某个方法来自外部未托管dll中的函数
  • IntPtr:用来表示一个指针(跟C中的指针相比弱爆了)
  • Marshal:一个工具类,提供大量的静态方法用于操作未托管内存

因为windows api中定义了大量的的结构体和和常量,这些在C#中无法直接使用,所以要在C#中重新定义一遍,非常麻烦,但有了pinvoke.net,生活就幸福多了。

但是在搞的过程中还是遇到了点小问题,某个结构体有一个数组成员,像这样:

public WLAN_HOSTED_NETWORK_PEER_STATE[] PeerList;

这个对象是通过一个函数的指向指针的指针参数取到的,在通过函数返回这个结构体时,这个成员始终为null。在C中可以把数组当作指向首地址的指针,所以我把这个成员改成了IntPtr类型,但取到的居然是个负值,shit!请教了下谷哥,看到在stackoverflow上有人提了同样的问题,答案的思路就是:既然有了这个结构体对象的首地址,因为成员在内存中都是按顺序布局的,所以把这个指针偏移到PeerList成员的地方就可以了,所以我就为这个结构体加了下面这个方法:

    public void FixPeerListAddr(IntPtr ptr)
        {
            //将指向WLAN_HOSTED_NETWORK_STATUS首地址的指针偏移到PeerList成员的地方
            IntPtr offset = Marshal.OffsetOf(typeof(WLAN_HOSTED_NETWORK_STATUS), "PeerList");
            PeerList = ptr + offset.ToInt32();
        }

问题搞定!

那怎么使用这个IntPtr对象遍历它指向的数组呢,在C中就非常简单,直接for循环里面PeerList[偏移]或*(PeerList + 偏移),而IntPtr对象只是对指针的一个表示,并没有C中那么强大的用法,只能每次增加偏移然后调用Marshal.PtrToStructure来取指针指向的对象,考虑到很多地方会这么做,为简化代码,我为IntPtr增加了两个扩展方法,如下:

 1 public static class SystemExtension
 2     {
 3         /// <summary>
 4         /// 根据数组首地址枚举出所有元素
 5         /// </summary>
 6         /// <typeparam name="T"></typeparam>
 7         /// <param name="self"></param>
 8         /// <param name="length"></param>
 9         /// <returns></returns>
10         public static IEnumerable<T> AsEnumerable<T>(this IntPtr self, int length)
11         {
12             int size = Marshal.SizeOf(typeof(T));
13             for (int i = 0; i < length; ++i) {
14                 yield return self.Dereference<T>();
15                 self += size;
16             }
17         }
18
19         /// <summary>
20         /// 获取指针指向的对象
21         /// </summary>
22         /// <param name="self"></param>
23         /// <returns></returns>
24         public static T Dereference<T>(this IntPtr self)
25         {
26             return (T)Marshal.PtrToStructure(self, typeof(T));
27         }
28     }

很简单的一个小玩意,就扯这么多吧,程序还有很多值得改进的地方,大家有什么想法欢迎交流,也让我学习学习。第一次写博客,渣渣一个,还望各位前辈多多指教!

源码下载

时间: 2025-01-02 11:29:44

用WinForm写一个虚拟WiFi助手玩玩(附源码)的相关文章

动手写一个Remoting接口测试工具(附源码下载)

基于.NET开发分布式系统,经常用到Remoting技术.在测试驱动开发流行的今天,如果针对分布式系统中的每个Remoting接口的每个方法都要写详细的测试脚本,无疑非常浪费时间.所以,我想写一个能自动测试remoting接口的小工具InterfaceTester.而且,当分布式系统中的某个remoting接口出现bug时,该小工具可以提交需要模拟的数据,以便在调试remoting服务的环境中,快速定位和解决bug. InterfaceTester运行起来后的效果如下图: 1.如何使用 (1)首

一个winform带你玩转rabbitMQ(三) 附源码

第一章. 安装,简介和初探 第二章. exchange,queue,binding介绍 订阅发布 工作队列(消费者集群) 本章收尾 介绍API CommandLine 以及其他功能 源码地址 https://github.com/dubing/MaoyaRabbit RabbitMQ API RabbitMQ Server提供了丰富的http api. 举个列子 需要HTTP基本身份验证.默认的用户名/密码为guest/guest. 这些返回值得意义我从官网搬来解释,为了避免翻译的问题导致大家理

Android应用系列:手把手教你做一个小米通讯录(附图附源码)

前言 最近心血来潮,突然想搞点仿制品玩玩,很不幸小米成为我苦逼的第一个试验品.既然雷布斯的MIUI挺受欢迎的(本人就是其的屌丝用户),所以就拿其中的一些小功能做一些小demo来玩玩.小米的通讯录大家估计用过小米的都清楚是啥子样的,没用过小米的也别着急,瞧瞧我的demo,起码也有七八分相似滴.先上图看效果 我是图: PS:吐槽一下,博客园上个图真难,所以搞了个短点的gif上才没失败....唉... 在这里仅仅是实现了逻辑交互的效果,并没有点击打电话的功能,因为也不难就懒得加了... 分析 我们说说

放弃antd table,基于React手写一个虚拟滚动的表格

缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反而有所上升. 客观地说,antd是开源的,UI设计得比较美观(甩出其他组件库一条街),而且是蚂蚁金服的体验技术部(一堆p7,p8,p9,基本都是大牛级的)在持续地开发维护,质量可以信任. 不过,antd虽好,但一些组件在某一些场景下,是很不适用的.例如,以表格形式无限滚动地展示大量数据(1w+)时,

原创:甲骨文文字处理助手4.0源码

本程序主要对记事本进行读写操作. 实现功能如下: 1.添加内容: 2.删除内容: 3.修改内容: 4.查询内容,字符串搜索: 程序截图: 源码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Syst

开源一个常用的小软件的源码——系统数据库服务管理软件

郝喜路  2014年7月27日22:28:34 GitHub地址:https://github.com/haoxilu/ServiceManager    希望编程爱好者 更改添加...   开发环境:Visual Studio 2012   .Net Framework 4.0 大家在软件开发过程中,是离不开 数据库的,不管你用什么数据库,都会在系统服务上注册一个,当你安装了太多的数据库,是否有感到极大的拖掉了开机时间,影响了计算机的性能.(仅限windows系统).这时有的朋友可能会想到手动

WIFI密码破解应用源码

WIFI密码破解应用源码,WIFI密码破解源码一直是国内应用市场上比较热的应用,谁不想免费蹭蹭别人的小网用用.本项目源码就是一套wifi暴力破解的安卓应用源码,小编开了一下无线路由弄了一个简单的密码果然可以跑出来,需要把字典文件password.txt放到内存卡根目录下.一分钟大约可以跑20个密码虽然跟bt5不在一个数量级但是有希望总比没希望强. <ignore_js_op> <ignore_js_op> 详细说明:http://android.662p.com/thread-59

Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载) POSTED ON 2014年6月27日 BY 天边的星星 本文内容: 1.横向ListView的所有实现思路; 2.其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册: 3.实现的横向ListView在点击.浏览时item背景会变色,并解决了listview里setSelected造成item的选择状态混乱的问题.

C# winform 实现微信二维码登录、第三方登录(已实现、附源码)

原文:C# winform 实现微信二维码登录.第三方登录(已实现.附源码) 前言 应上级要求,在项目登录的时候实现第三方登录.很荣幸我接到了这个任务,但是我之前完全都没接触到.开发周期是三天,对于我们这种小白完全是从零开始.最后成功的实现这个功能固然重要,但是这个探索的过程才值得回味.光需要代码可以直接下载源码,我们重要说下实现过程和步骤,自己也巩固和记录一下! 实现步骤 1. 我实现的是微信扫码登录,当然要知道微信给的接口,可以在https://open.weixin.qq.com/ 这里申