扫描器编程浅析
一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;QQ群:16004488
微信公众号:计算机与网络安全
ID:Computer-network
扫描就是对计算机系统或者其他网络设备进行与安全相关的检测,以找出安全隐患和可被黑客利用的漏洞。显然,扫描软件是把双刃剑,黑客利用它入侵系统,而系统管理员掌握它又可有效地防范黑客入侵。所以在黑客软件和或其他应用软件中,扫描技术占有重要地位。
本文将从端口、文件目录和进程3个方面分别对扫描器的编程进行详细介绍。
一、主机的端口状态扫描
在C++中可调用CPortScanDig::TestConnection函数来实现端口扫描功能。其基本原理是:和对方被扫描端口建立连接请求,如连接成功则说明对方端口开放,否则对方端口没有打开。
该函数的具体调用方式如下:
BOOL CPortScanDig::TestConnection(CString IP,UINT nPort)
{
/ /创建套接字
CSocket* pSocket;
pSocket = new CSocket; // 这里使用了C++的内建类库CSocket,当然也可以直接使用Socket编程
ASSERT(pSocket);
if (!pSocket->Create())
{
Delete pSocket;
pSocket = NULL;
// 如果套接字创建不成功,则返回FALSE
return FALSE;
}
// 连接主机
while (!pSocket ->Connect(IP , nPort))
{
Delete pSocket;
pSocket = NULL;
// 如果指定的端口没有打开,返回FALSE
return FALSE;
}
// 清除套接字
pSocket ->Close();
delete pSocket;
// 如果端口是开放的,则返回TRUE
return TRUE;
}
二、文件目录扫描
对目标计算机中的文件进行扫描也是计算机病毒和反病毒中常用的一种技术。下面将介绍几种扫描文件时要用到的API函数,以及实现文件搜索的功能代码。
(1)FindFirstFileEx函数
在此函数中提供了如文件名和属性等专门的参数,且提供查找文件匹配的条件,所以该函数可用来在一个目录中扫描文件。函数的具体格式如下:
HANDLE FindFirstFile(
LPCTSTR lpFileName, // 指向要查找的文件名称的指针
LPWIN32_FIND_DATA lpFindFileData // 指向匹配的文件信息的指针
);
其中lpFindFileData参数是一个LPWIN32_FIND_DATA结构,该结构用于存放第一个匹配查找字符串的文件的有关信息。如果查找成功,则会返回一个合法的句柄,用户可使用该句柄来继续查找文件。
另外,该函数还有一个升级版本,其具体格式如下:
HANDLE FindFirstFile(
LPCTSTR lpFileName, / / 指向要查找的文件名称的指针
FINDEX_INFO_LEVELS fInfoLevelId, / / 返回数据的信息级别
LPVOID lpFindFileData, / / 指向返回信息的指针
FINDEX_SEARCH_OPS fSearchOp, / / 执行过滤的类型
LPVOID lpSearchFilter, / / 指向查找规则的指针
DWORD dw AdditionalFlags / / 额外的查找控制标志
);
(2)FindNextFile函数
如果想把从FindFirstFile开始的查找继续进行下去,此时就需要使用FindNextFile函数,该函数作用是继续查找FindFirstFile函数搜索后的文件。
其具体格式如下:
BOOL FindNextFile(
HANDLE hFindFile, / / 要查找的句柄,上一个函数的返回句柄
LPWIN32_FIND_DATA lpFindFileData / / 指向匹配的文件的信息
);
如果该函数调用成功,则会返回一个非0值,否则返回FALSE。
(3)FindClose函数
如果完成查找,还必须调用FindClose函数来关闭用FindFirstFile打开的句柄,只需要将FindFirstFile返回的句柄当作参数传入即可。该函数的具体格式如下:
BOOL FindClose(
HANDLE hFindFile / / 文件查找
);
下面是用C语言编写的用来进行文件查找的代码,可以列出在C:\目录中的所有扩展名为.exe的文件:
# include<windows.h>
# include<tchar.h>
# ifndef UNICODE
# include <stdio.h>
# endif
Void DisplayError(LPCTSTR pszTitle);
int _tmain(int argc, TCHAR *argv[])
{
WIN32_FIND_DATA wfd;
HANDLE hSearch = FindFirstFile(_T("C:\\*.exe"),&wfd);
If(hSearch! = INVALID_HANDLE_VALUE)
{
_tprint(_T("%s\n"),wfd.cFileName);
While(FindNextFile(hSearch,&wfd))
_tprint(_T("%s\n"),wfd.cFileName);
FindClose(hSearch);
}
Else
{
DisplayError(argv[0]);
}
return 0;
}
void DisplayError(LPCTSTR pszTitle)
{
LPVOID pv;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError();
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&pv,0,NULL);
MessageBox(NULL,pv,pszTitle,MB_ICONHAND);
LocalFree(pv);
}
三、进程扫描
对目标计算机中的进程进行扫描也是黑客常用的一种手段。下面是用VC++实现进程扫描的代码:
void CListProcessesDlg :: ListProcesses()
{
// 初始化
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0}; // pe32用来存放进程的详细信息
// 获得快照句柄
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
// 判断函数CreateToolhelp32Snapshot是否成功执行
if(hProcessSnap == (HANDLE)-1)
{
Printf("\nCreateToolhelp32Snapshot()failed:%d",GetLastError());
Return;
}
/ / pe32中的dwSize字段必须赋初值,否则在执行Process32First函数时会出错
pe32.dwSize = sizeof(PROCESSENTRY32); // 列举所有进程名称
if(Process32First(hProcessSnap, &pe32))
{
do
{
m_ctrlLstProcesses.AddString(pe32.szExeFile); // 将进程加到列表框中
}
while (Process32Next(hProcessSnap, &pe32)); // 直到列举完毕
}
else
{
printf("\nProcess32First() failed:%d",GetLastError());
}
CloseHandle (hProcessSnap); // 关闭句柄
}
微信公众号:计算机与网络安全
ID:Computer-network