X-Scan v3.0 SDK 所需文件及描述: XScanLib.lib: 开发包库文件, 需要加入插件工程文件中. 对于VC编译器可直接使用, 对于BCB编译器, 需要使用ImpLib工具由XScanLib.dll导出该lib文件使用. XScanLib.h: 开发包头文件, 包含X-Scan插件所需预定义及接口函数定义. arglist.*: 用于直接操作插件参数链表, 普通插件不需要使用. 扫描插件接口: 所有插件为DLL形式(后缀改为.xpn保存到plugins目录), 应导出以下两个函数: //------------------------------------------ /* 功能描述: 该函数在初始化插件时被调用, 用于获取插件基本信息 返回值含义: TRUE: 插件初始化成功 FALSE: 插件初始化失败 */ extern "C" __declspec(dllexport) BOOL __stdcall GetPluginInfo(PLUGIN_INFO *); //------------------------------------------ /* 功能描述: 该函数在检测主机时被调用, 传入类型为(struct arglist *)的扫描参数链表 通过其他接口函数可以获得所有扫描参数及关键字 返回值含义: TRUE: 存在漏洞 FALSE: 不存在漏洞 */ extern "C" __declspec(dllexport) BOOL __stdcall PluginFunc(struct arglist *); 结构定义, 预定义及接口函数功能描述: //------------------------------------------ //插件基本信息结构定义 typedef struct _PLUGIN_INFO { char szClassName[50]; //插件所属类别 char szMemberName[50]; //插件成员名称 char szVersion[10]; //插件版本 char szFileName[50]; //插件原始文件名(不含路径) char szParamsRequest[50]; //选择该插件所需参数, 如"-cgi [encode_type]" char szPrompt[200]; //对参数的解释, 如"check cgi abuses, the encode_type limit is 0-6" int nSingle; //是否为单一漏洞(漏洞数量只可能为1或0) char szAuthorName[50]; //插件作者 char szDescription[300]; //插件描述 DWORD dwTimeOut; //超时限制(毫秒), "0"表示不限时 int nMark; //标识该插件是否被默认选中 char szImageFile[50]; //16*16图标文件(BMP格式, 不含路径, 位于images目录) } PLUGIN_INFO; //------------------------------------------ #define AT_NORMAL 0x101 //普通信息, 将显示在GUI“普通信息”栏 #define AT_WARNING 0x102 //漏洞信息, 将显示在GUI“漏洞信息”栏 #define AT_ERROR 0x103 //错误信息, 将显示在GUI“错误信息”栏 //////////////////////////////////////////// //初始化函数 //////////////////////////////////////////// //------------------------------------------ /* 功能描述: 初始化函数, 必须在使用其他接口函数前进行初始化 返回值含义: TRUE: 成功 FALSE: 失败 */ BOOL __stdcall PlugInitLib( struct arglist *pParams); //扫描参数链表 //////////////////////////////////////////// //界面交互接口函数 //////////////////////////////////////////// //------------------------------------------ /* 功能描述: 向界面输出字符串 返回值含义: 无 */ void __stdcall PlugAlertUser( struct arglist *pParams, //扫描参数链表 int nType, //信息类型(见预定义AT_NORMAL/AT_WARNING/AT_ERROR) char *szLine); //信息内容 //------------------------------------------ /* 功能描述: 向扫描报告中添加漏洞记录 返回值含义: 无 */ void __stdcall PlugLogToFile( struct arglist *pParams, //扫描参数链表 char *szPort, //格式为:"[端口]/[协议]", 协议可为: "tcp"/"udp"/"icmp"... char *szDataType, //日志类型: "NOTE"/"INFO"/"HOLE", 分别对应于"提示(低)"/"警告(中)"/"漏洞(高)" char *szData); //日志内容(在扫描报告中显示的漏洞描述信息) //------------------------------------------ /* 功能描述: 向图形界面左侧的TreeView中添加一个结点 返回值含义: 无 */ void __stdcall PlugAddToTV( char *szLine, //TreeView完整路径, 以"\n"为分隔符 char *szImageFile); //图标文件名(不含路径) //------------------------------------------ /* 功能描述: 从图形界面左侧的TreeView中删除一个结点 返回值含义: 无 */ void __stdcall PlugDelFromTV( char *szLine); //TreeView路径, 以"\n"为分隔符 //------------------------------------------ /* 功能描述: 更改图形界面左侧的TreeView中某个结点的标题或图标 返回值含义: 无 */ void __stdcall PlugChangeTVItem( char *szLine, //TreeView路径, 以"\n"为分隔符 char *szNewItem, //新标题 char *szImageFile); //图标文件名(不含路径) //------------------------------------------ /* 功能描述: 设置当前正在进行的任务,便于用户在图形界面右上方的任务栏中查看 返回值含义: 无 */ void __stdcall PlugSetCurrentSchedule( struct arglist *pParams, //扫描参数链表 char *szSchedule); //当前任务描述 //////////////////////////////////////////// //读取用户设置接口函数 //////////////////////////////////////////// //------------------------------------------ /* 功能描述: 从语言文件(INI格式)中读取相应的字符串 返回值含义: 无 */ void __stdcall PlugGetString( char *szName, //字符串名称 char *szLine, //返回字符串 char *szKey1, //用于替换字符串中的"%1" char *szKey2); //用于替换字符串中的"%2" //------------------------------------------ /* 功能描述: 根据服务名称获得预设服务的TCP端口 返回值含义: 预设端口或经过智能识别获得的对应端口 */ int __stdcall PlugGetTcpPort( struct arglist *pParams, //扫描参数链表 char *szService, //服务名称, 如"www","ftp" int nDefaultPort); //默认端口 //------------------------------------------ /* 功能描述: 根据服务名称获得预设服务的UDP端口 返回值含义: 预设端口或经过智能识别获得的对应端口 */ int __stdcall PlugGetUdpPort( struct arglist *pParams, //扫描参数链表 char *szService, //服务名称, 如"snmp","tftp" int nDefaultPort); //默认端口 //////////////////////////////////////////// //插件应用函数 //////////////////////////////////////////// //------------------------------------------ /* 功能描述: 获取目标主机某个TCP端口状态 返回值含义: >0: 端口已经检查过并且处于开放状态 其他: 端口关闭或未经过检查 */ int __stdcall PlugCheckTcpPort( struct arglist *pParams, //扫描参数链表 int nPort); //需要检查的TCP端口 //------------------------------------------ /* 功能描述: 设置或新增扫描参数 返回值含义: >0: 成功 其他: 失败 */ int __stdcall PlugSetParams( struct arglist *pParams, //扫描参数链表 char *szName, //参数名称 int nType, //参数类型 void *pValue); //参数值 //------------------------------------------ /* 功能描述: 读取扫描参数 返回值含义: 扫描参数值或指针, 视参数类型而定, 如int型为参数值, (char *)型则为指针 */ void * __stdcall PlugGetParams( struct arglist *pParams, //扫描参数链表 char *szName); //参数名称 //------------------------------------------ /* 功能描述: 设置或新增检测结果, 如直接设置检测到的漏洞数量而不通过接口函数PlugSetVulnNum() 返回值含义: >0: 成功 其他: 失败 */ int __stdcall PlugSetResult( struct arglist *pParams, //扫描参数链表 char *szName, //返回值名称 int nType, //返回值类型 void *pValue); //返回值 //------------------------------------------ /* 功能描述: 读取检测结果, 如直接读取检测到的漏洞数量而不通过接口函数PlugGetVulnNum() 返回值含义: 扫描参数值或指针, 视参数类型而定, 如int型为参数值, (char *)型则为指针 */ void * __stdcall PlugGetResult( struct arglist *pParams, //扫描参数链表 char *szName); //返回值名称 //------------------------------------------ /* 功能描述: 设置或新增关键字, 如通过名称"Host/OS"设置目标主机操作系统类型 返回值含义: >0: 成功 其他: 失败 */ int __stdcall PlugSetKey( struct arglist *pParams, //扫描参数链表 char *szName, //KEY名称 int nType, //KEY类型 void *pValue); //KEY数值 //------------------------------------------ /* 功能描述: 读取关键字, 如通过名称"Host/OS"读取目标主机操作系统类型 返回值含义: 关键字值或指针, 视参数类型而定, 如int型为参数值, (char *)型则为指针 */ void * __stdcall PlugGetKey( struct arglist *pParams, //扫描参数链表 char *szName); //KEY名称 //------------------------------------------ /* 功能描述: 增加漏洞计数, 用于多线程扫描中每个线程根据扫描结果分别计数 返回值含义: 漏洞数量 */ int __stdcall PlugAddVulnNum( struct arglist *pParams); //扫描参数链表 //------------------------------------------ /* 功能描述: 直接设置检测到的漏洞总数 返回值含义: 漏洞数量 */ int __stdcall PlugSetVulnNum( struct arglist *pParams, //扫描参数链表 int nVulnNum); //漏洞数量 //------------------------------------------ int __stdcall PlugGetVulnNum( struct arglist *pParams); //扫描参数链表 //------------------------------------------ /* 功能描述: 向扫描线程队列中增加一个线程, 如果队列已满, 该函数不会立即返回, 直到创建新线程完成 返回值含义: 新线程句柄 */ HANDLE __stdcall PlugAddThread( struct arglist *PlugParams, //扫描参数链表 LPTHREAD_START_ROUTINE lpStartAddress, //线程函数地址 LPVOID lpThreadParameter, //线程参数 DWORD dwTimeout); //线程超时(毫秒, INFINITE表示不限超时) //------------------------------------------ /* 功能描述: 等待该插件中所有通过PlugAddThread()创建的线程运行完毕后返回 返回值含义: 无 */ void __stdcall PlugWaitThread( struct arglist *PlugParams);//扫描参数链表 X-Scan中使用的关键字及参数名称: 以下为关键字名称, 可通过PlugSetKey()设置或通过PlugGetKey()读取: "Host/dead"(int) - 主机无响应(非存活主机) "Host/OS"(char *) - 操作系统类型 "Host/OSAffirmed"(int) - 操作系统类型已经确定 "ftp/anonymous"(int) - FTP服务支持匿名登录 "ftp/login"(char *) - 可用于登录FTP服务的用户名 "ftp/password"(char *) - 对应于"ftp/login"的登录密码 "http/auth"(char *) - 可用于登录HTTP服务的用户名 "http/password(char *) - 对应于"http/auth"的登录密码 "SNMP/community"(char *) - SNMP弱口令 "SMB/login"(char *) - 可用于登录SMB服务的用户名 "SMB/password"(char *) - 对应于"SMB/login"的登录密码 "SMB/name"(char *) - 远程主机NETBIOS名 "SMB/registry_access"(int) - 远程主机注册表可访问 "SMB/workgroup"(char *) - 远程主机工作组或域名程 "SMB/Users/"(char *) - SMB用户名 "SMB/ValidUsers//Login"(char *) - 可用的SMB用户名 "SMB/ValidUsers//Password"(char *) - 对应于"SMB/ValidUsers//Login"的登录密码 "Services/www"(int) - HTTP服务端口 "Services/smtp"(int) - SMTP服务端口 "Services/ftp"(int) - FTP服务端口 "Services/ssh"(int) - SSH服务端口 "Services/http_proxy"(int) - HTTP代理服务端口 "Services/pop3"(int) - POP3服务端口 "Services/telnet"(int) - TELNET服务端口 "Services/sql_server"(int) - SQL-SERVER服务端口 以下为扫描参数名称, 可通过PlugSetParams()设置或通过PlugGetParams()读取: "HostName"(char *) - 目标主机地址 "LogFile"(char *) - LOG文件名(含路径) "LogType"(char *) - 日志类型(TXT/HTML) "ShowVerbose"(int) - 是否显示详细扫描信息 "Timeout"(int *) - 目前超时(毫秒), 若超过插件基本信息中设置的超时值, 插件将被强行终止 "MaxHosts"(int) - 最大并发主机数量 "MaxThreads"(int) - 最大线程数量 "CurrentHosts"(int *) - 当前并发主机数量 "CurrentThreads"(int *) - 所有活动线程总数量 "PluginThreads"(int *) - 插件内活动线程总数量 "NetworkTimeout"(int) - 网络读取超时(秒) "SkipDestructive"(int) - 跳过破坏性脚本(针对主机) "Network/Adapter"(char *) - 网络适配器 "Console"(int) - 当前运行在命令行模式 "UserParams"(char *) - 用户输入参数 以下为扫描参数名称, 可通过PlugSetResult()设置或通过PlugGetResult()读取: "VulnNumber"(int *) - 漏洞数量(建议使用接口函数设置漏洞数量) 扫描报告接口: 扫描报告插件应导出以下函数, 编译完成后改名为Report.dll替换X-Scan目录同名文件: __declspec(dllexport) int __stdcall BuildReport( char *szLogFile, //扫描过程生成的原始日志文件名 char *szReportFile, //最终生成的扫描报告文件名 char *szFormat); //用户选择的扫描报告类型 szLogFile: 该文件为纯文本格式, 每行包含一条记录, 记录分两种格式, 示例如下: 一种格式表示发现漏洞: results|[host]|[service name] ([port]/[protocol])|[NOTE/INFO/HOLE]|[description] 例如: results|192.168.0.1|www (80/tcp)|HOLE|发现漏洞...;风险等级:高;;解决方案:... 其中[description]字段中换行由";"号代替, 生成报告文件时应做逆向转换 另一种格式表示扫描完成的主机摘要信息: summary|[host]|[description] 例如: summary|192.168.0.1|OS: Sun Solaris 8; PORT/TCP: 21, 23, 6000