请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

梦织未来

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1162|回复: 10

[原创] 内核网络通讯

[复制链接]

升级   100%

216

主题

64

精华

1440

积分
发表于 2016-5-23 15:04:11 | 显示全部楼层 |阅读模式
梦织未来(www.mengwuji.net)

作者:mengwuji

有时候希望自己驱动能和服务器通讯怎么办?这时候就需要用到windows底层提供的编程接口了。
网路上这方面的资料较少,我就来用ReactOS里现成的代码卖弄下子吧。

用tdi实现思路是很清晰很清晰的呢,完全可以封装成用户层的套接字接口的。服务器我用的用户层程序,客户端我是驱动写的。下面是代码片段与效果:

服务器代码也是直接拿msdn的来用,我真是不见外嘻嘻

  1. int main()
  2. {

  3.         int iResult = 0;

  4.         WSADATA wsaData;

  5.         SOCKET RecvSocket;
  6.         SOCKADDR_IN RecvAddr;

  7.         unsigned short Port = 0x5000;

  8.         char RecvBuf[1024] = {0};
  9.         int BufLen = 1024;

  10.         SOCKADDR_IN SenderAddr;
  11.         int SenderAddrSize = sizeof (SenderAddr);

  12.         //-----------------------------------------------
  13.         // Initialize Winsock
  14.         iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
  15.         if (iResult != NO_ERROR) {
  16.                 wprintf(L"WSAStartup failed with error %d\n", iResult);
  17.                 return 1;
  18.         }
  19.         //-----------------------------------------------
  20.         // Create a receiver socket to receive datagrams
  21.         RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  22.         if (RecvSocket == INVALID_SOCKET) {
  23.                 wprintf(L"socket failed with error %d\n", WSAGetLastError());
  24.                 return 1;
  25.         }
  26.         //-----------------------------------------------
  27.         // Bind the socket to any address and the specified port.
  28.         RecvAddr.sin_family = AF_INET;
  29.         RecvAddr.sin_port = htons(Port);
  30.         RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);

  31.         iResult = bind(RecvSocket, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
  32.         if (iResult != 0) {
  33.                 wprintf(L"bind failed with error %d\n", WSAGetLastError());
  34.                 return 1;
  35.         }
  36.         //-----------------------------------------------
  37.         // Call the recvfrom function to receive datagrams
  38.         // on the bound socket.
  39.         wprintf(L"Receiving datagrams...\n");

  40.         while (TRUE)
  41.         {
  42.                 iResult = recvfrom(RecvSocket,
  43.                         RecvBuf, BufLen, 0, (SOCKADDR *) & SenderAddr, &SenderAddrSize);
  44.                 if (iResult == SOCKET_ERROR) {
  45.                         wprintf(L"recvfrom failed with error %d\n", WSAGetLastError());
  46.                         break;
  47.                 }

  48.                 printf("%s",RecvBuf);

  49.                 Sleep(1000);

  50.                 if (strstr(RecvBuf,"傻瓜") != NULL)
  51.                 {
  52.                         strcpy(RecvBuf,"我是傻瓜你就是笨蛋!笨蛋快去死><!\n");
  53.                 }else{
  54.                         strcpy(RecvBuf,"既然我都不知道你说什么就下地狱去吧><!\n");
  55.                 }

  56.                 sendto(RecvSocket,RecvBuf,strlen(RecvBuf),0,(SOCKADDR*)&SenderAddr,SenderAddrSize);
  57.         }

  58.         //-----------------------------------------------
  59.         // Close the socket when finished receiving datagrams
  60.         wprintf(L"Finished receiving. Closing socket.\n");
  61.         iResult = closesocket(RecvSocket);
  62.         if (iResult == SOCKET_ERROR) {
  63.                 wprintf(L"closesocket failed with error %d\n", WSAGetLastError());
  64.                 return 1;
  65.         }

  66.         //-----------------------------------------------
  67.         // Clean up and exit.
  68.         wprintf(L"Exiting.\n");
  69.         WSACleanup();
  70.         getchar();
  71.         return 0;
  72. }

复制代码


客户端的代码片段:

  1. NTSTATUS TestConnect()
  2. {
  3.         HANDLE Socket = NULL;
  4.         PFILE_OBJECT pSocketObject = NULL;
  5.         NTSTATUS st = STATUS_UNSUCCESSFUL;
  6.         ULONG Address = 0x7F000001;
  7.         USHORT Port = 0x5000;
  8.         LARGE_INTEGER Timeout;

  9.         ULONG RecvSize = 1024;

  10.         CHAR Packet[1024] = {0};
  11.         CHAR szSendMessage[] = "你这个傻瓜真可笑!\n";

  12.         st = CreateAddress(&Socket,&pSocketObject);
  13.         if (!NT_SUCCESS(st))
  14.         {
  15.                 return st;
  16.         }

  17.         st = TdiSendDatagram(pSocketObject,Port,Address,szSendMessage,strlen(szSendMessage));
  18.         if (st != STATUS_SUCCESS)
  19.         {
  20.                 ObDereferenceObject(pSocketObject);
  21.                 ZwClose(Socket);
  22.                 return st;
  23.         }

  24.         Timeout.QuadPart = 10*1000*(-10000);        //10秒
  25.         st = TdiReceiveDatagram(pSocketObject,Port,&Address,&Packet,&RecvSize,&Timeout);
  26.         if (st != STATUS_SUCCESS)
  27.         {
  28.                 ObDereferenceObject(pSocketObject);
  29.                 ZwClose(Socket);
  30.                 return st;
  31.         }

  32.         KdPrint(("%s",Packet));
  33.         //这里随便你做什么啦

  34.         ObDereferenceObject(pSocketObject);
  35.         ZwClose(Socket);
  36.         return st;
  37. }

复制代码


效果图:
QQ图片20160523145808.png

好了很简单吧。

开发环境:wdk8.0+vs2012   测试环境:win7 64

下面附上驱动代码:
DriverEntry.c (10.9 KB, 下载次数: 19, 售价: 8 金钱)
回复

使用道具 举报

升级   6%

28

主题

0

精华

59

积分
发表于 2016-5-23 17:10:26 | 显示全部楼层
点赞~~不知道为啥开网店了~~~
回复 支持 反对

使用道具 举报

升级   10%

0

主题

0

精华

5

积分
发表于 2016-5-26 17:57:10 | 显示全部楼层
我好有一套驱动代码。  

驱动代码,  功能如下 。

与服务端通信   取得拦截的地址。

对比用户上网地址,拦截用户上网地址。拦截到指定地方。
回复 支持 反对

使用道具 举报

升级   100%

216

主题

64

精华

1440

积分
 楼主| 发表于 2016-5-30 14:38:44 | 显示全部楼层
awujido 发表于 2016-5-26 17:57
我好有一套驱动代码。  

驱动代码,  功能如下 。

这种劫持我也有实现过哟

不过我是在afd实现的。
回复 支持 反对

使用道具 举报

升级   40%

0

主题

0

精华

20

积分
发表于 2016-6-3 10:25:26 | 显示全部楼层
金钱不够啊,
回复 支持 反对

使用道具 举报

升级   100%

39

主题

4

精华

128

积分
发表于 2016-6-24 16:56:36 | 显示全部楼层
支持下
回复 支持 反对

使用道具 举报

升级   12%

18

主题

0

精华

68

积分
发表于 2016-7-20 09:08:17 | 显示全部楼层
下面附上驱动代码
回复 支持 反对

使用道具 举报

升级   18%

0

主题

0

精华

9

积分
发表于 2016-7-21 20:39:25 | 显示全部楼层
有时候希望自己驱动能和服务器通讯怎么办?来下载了
回复 支持 反对

使用道具 举报

升级   0.33%

18

主题

0

精华

201

积分
发表于 2016-7-31 21:48:59 | 显示全部楼层
日常表白梦大
回复 支持 反对

使用道具 举报

升级   0.33%

18

主题

0

精华

201

积分
发表于 2016-8-1 09:23:35 | 显示全部楼层
日常表白梦大
回复 支持 反对

使用道具 举报

升级   0.33%

18

主题

0

精华

201

积分
发表于 2016-8-9 16:37:59 | 显示全部楼层
看到楼上有2个自己 貌似还有灌水的嫌疑 刚刚想到网络通信 今天正式把这份代码拿了 另外梦大卖萌无敌233
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|mengwuji ( 粤ICP备13060035号-1 )  

GMT+8, 2017-4-24 04:13 , Processed in 0.408899 second(s), 32 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表