登录名:  密码:  验证码: 8773
设为首页 收藏本站 联系站长
2009年1月10日
农历戊子年(鼠)
腊月十五
 首页 | 最新上传 | 新闻 | 购物商场 | 招聘求职 | HTML学习 | java学习 | IT新闻 | 黑客技术 | 域名和空间 | 流量统计 | 故事小说
 GIF动画制作 | 图片素材 | 源码下载 | 书籍下载 | 视频资料 | ASP | 数据库 | PHP | 基本电脑知识 | 迅雷资源 | 兼职 | 组网工程
 英语学习 | FLASH专区 | ASP.NET | VB | 综合资源网 | 驱动下载 | 游戏下载 | 网站模板网页美工 | 韩文学习 | 论坛
 特别推荐:产品报价  漂亮网站网址  图片素材
  我要查找:  
欢迎您来这里。每天学一点,每天进步一点!
Google
 当前位置:首页 >> 黑客  >> 黑客技术
原始套接字透析之实现Ping
来源:  发表日期:2008年6月25日 作者: 

 编辑:admin 级别: 司令 浏览次数:282
】    
极其常用的Ping命令通过向计算机发送ICMP Echo请求报文并且监听回应报文的返回,以校验与远程计算机或本地计算机的连接。

  使用ICMP.DLL实现Ping

  在Windows平台编程中实现Ping的一个最简单方法是调用ICMP.DLL这个动态链接库,引用ICMP.DLL中的三个函数即可:

HANDLE IcmpCreateFile(void);

  这个函数打开个ICMP Echo请求能使用的句柄;

BOOL IcmpCloseHandle(HANDLE IcmpHandle);

  这个函数关闭由IcmpCreateFile打开的句柄;

DWORD IcmpSendEcho(
 HANDLE IcmpHandle, // IcmpCreateFile打开的句柄
 IPAddr DestinationAddress, //Echo请求的目的地址
 LPVOID RequestData, //发送数据buffer
 WORD RequestSize, //发送数据长度
 PIP_OPTION_INFORMATION RequestOptions, // IP_OPTION_INFORMATION指针
 LPVOID ReplyBuffer, //接收回复buffer
 DWORD ReplySize, //接收回复buffer大小
 DWORD Timeout //等待超时
);

  这个函数发送Echo请求并等待回复或超时。

  把这个函数和相关数据封装成一个类CPing,CPing类的头文件如下:

class CPing
{
 public:
  CPing();
  ~CPing();
  BOOL Ping(char* strHost);
 private:
  // ICMP.DLL 导出函数指针
  HANDLE (WINAPI *pIcmpCreateFile)(VOID);
  BOOL (WINAPI *pIcmpCloseHandle)(HANDLE);
  DWORD (WINAPI *pIcmpSendEcho)(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD);
  HANDLE hndlIcmp; // 加载ICMP.DLL库句柄
  BOOL bValid; //是否构造(获得ICMP.DLL导出函数指针和初始化WinSock)成功
};

  CPing类的构造函数获得ICMP.DLL中导出函数的指针并初始化WinSock:

CPing::CPing()
{
 bValid = FALSE;
 WSADATA wsaData;
 int nRet;
 // 动态加载ICMP.DLL
 hndlIcmp = LoadLibrary("ICMP.DLL");
 if (hndlIcmp == NULL)
 {
  ::MessageBox(NULL, "Could not load ICMP.DLL", "Error:", MB_OK);
  return;
 }
 // 获得ICMP.DLL中导出函数指针
 pIcmpCreateFile = (HANDLE (WINAPI *)(void))GetProcAddress((HMODULE)hndlIcmp,"IcmpCreateFile");
 pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))GetProcAddress((HMODULE)hndlIcmp,"IcmpCloseHandle");
 pIcmpSendEcho = (DWORD (WINAPI *)(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))
GetProcAddress((HMODULE)hndlIcmp,"IcmpSendEcho");
 // 检查所有的指针
 if (pIcmpCreateFile == NULL || pIcmpCloseHandle == NULL ||pIcmpSendEcho == NULL)
 {
  ::MessageBox(NULL, "Error loading ICMP.DLL", "Error:", MB_OK);
  FreeLibrary((HMODULE)hndlIcmp);
  return;
 }

 // 初始化WinSock
 nRet = WSAStartup(0x0101, &wsaData );
 if (nRet)
 {
  ::MessageBox(NULL, "WSAStartup() error:", "Error:", MB_OK);
  WSACleanup();
  FreeLibrary((HMODULE)hndlIcmp);
  return;
 }
 // 检查WinSock的版本
 if (0x0101 != wsaData.wVersion)
 {
  ::MessageBox(NULL, "No WinSock version 1.1 support found", "Error:", MB_OK);
  WSACleanup();
  FreeLibrary((HMODULE)hndlIcmp);
  return;
 }
 bValid = TRUE;
}

  CPing类的析构函数完成相反的动作:

CPing::~CPing()
{
 WSACleanup();
 FreeLibrary((HMODULE)hndlIcmp);
}

  CPing类的Ping函数是最核心的函数,实现真正的ping操作:

int CPing::Ping(char *strHost)
{
 struct in_addr iaDest; // Internet地址结构体
 LPHOSTENT pHost; // 主机入口结构体指针
 DWORD *dwAddress; // IP地址
 IPINFO ipInfo; // IP选项结构体
 ICMPECHO icmpEcho; // ICMP Echo回复buffer
 HANDLE hndlFile; // IcmpCreateFile函数打开的句柄

 if (!bValid)
 {
  return FALSE;
 }

 //使用inet_addr()以判定ping目标为地址还是名称
 iaDest.s_addr = inet_addr(strHost);
 if (iaDest.s_addr == INADDR_NONE)
  pHost = gethostbyname(strHost);
 else
  pHost = gethostbyaddr((const char*) &iaDest, sizeof(struct in_addr),AF_INET);
  if (pHost == NULL)
  {
   return FALSE;
  }

  // 拷贝IP地址
  dwAddress = (DWORD*)(*pHost->h_addr_list);

  // 获得ICMP Echo句柄
  hndlFile = pIcmpCreateFile();

  // 设置发送信息缺省值
  ipInfo.Ttl = 255;
  ipInfo.Tos = 0;
  ipInfo.IPFlags = 0;
  ipInfo.OptSize = 0;
  ipInfo.Options = NULL;
  icmpEcho.Status = 0;
  // 请求一个ICMP echo
  pIcmpSendEcho(hndlFile, *dwAddress, NULL, 0, &ipInfo, &icmpEcho, sizeof(struct tagICMPECHO), 1000);

  //设置结果
  iaDest.s_addr = icmpEcho.Source;
  if (icmpEcho.Status)
  {
   return FALSE;
  }

  // 关闭ICMP Echo句柄
  pIcmpCloseHandle(hndlFile);
  return TRUE;
}

  其中所使用的相关结构体定义为:

typedef struct tagIPINFO
{
 u_char Ttl; // TTL
 u_char Tos; // 服务类型
 u_char IPFlags; // IP标志
 u_char OptSize; // 可选数据大小
 u_char *Options; // 可选数据buffer
} IPINFO, *PIPINFO;

typedef struct tagICMPECHO
{
 u_long Source; // 源地址
 u_long Status; // IP状态
 u_long RTTime; // RTT
 u_short DataSize; // 回复数据大小
 u_short Reserved; // 保留
 void *pData; // 回复数据buffer
 IPINFO ipInfo; // 回复IP选项
} ICMPECHO, *PICMPECHO;

分页: [1] [2] [3]
(编辑:网站学习网)
 ·上一篇文章: 原始套接字透析之Raw Socke
 ·下一篇文章: 原始套接字透析之ICMP拒绝服务攻
 该篇文章的评论
 暂无相关评论
 姓名:  邮箱:
 内容:
                
 相关文章
 · 黑客技术视频教程之ping
 · 黑客知识 Telnet高
 · 安全知识 黑客是如
 · 原始套接字透析之综合实
 · 基础知识 初级黑客
 · 如何拥有高超的本领&nbs
 · 黑客高级技巧 Linu
 · 洪水攻击原理及代码实现
 · 18岁黑客开博卖病毒&nbs
 · 原始套接字透析之实现Pi
 · 黑客技术视频教程之X-SC
 最新上传文章
 · 使用 cookie 
 · Asp Object 之
 · 建立企业信息化 &n
 · 80后IT四少:媒体塑造了我
 · 我国企业电子商务交易总
 · asp连接带有密码的acces
 · 互联网应用广泛 电
 · Adobe Illustrator
 · delphi程序打包安装制作
 · 企业邮件管理有新招&nbs
 · toolbar图标:ToolBar上的

服务说明 | 关于网站 | 联系我们 | 友情链接
网站学习网欢迎您!
http://www.studywebgood.com
浙ICP备07030755号 
联系邮箱:shuizhilang@126.com 如本网站侵犯了您的版权,请马上通知我.