惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - Kriss Liu

绕开 CoreLab.MySql 验证 如何通过活动目录(ADSI)修改IIS6中的 Web 服务扩展 XMLDOM/XMLHTTP的跨域访问和页面代理 关于如何让页面同时下载多个文件的尝试 - Kriss Liu - 博客园 Remoting中的线程与网络通信内幕初探 Remoting多个信道(Chennel)的注册问题 基于强名称签名的代码访问保护及其改进 利用命名管道(Named Pipe)向Flash Player模拟Flash媒体文件 多样、互动的WinForm UI设计与开发思路(Flash、Html等) WinForm中设计时与DesignMode的区别 如何在C#中直接操作C++结构体 .NET中Flags枚举的使用 最近的计划。。VOS和DataSetBrowser。。 看完《仙剑奇侠传》前20集的一点牢骚。。 一套可嵌入或独立使用的翻页控件: WebPager(附源码) ASP.NET 2.0 中创建DataList子类控件时的一个错误 在.NET中使用DirectMusic 我与电脑的十年 关于 Windows Media DRM 0xC00D2840 错误
ServU插件设计
Kriss Liu · 2005-02-16 · via 博客园 - Kriss Liu

  ServU是一款被广泛应用的FTP服务程序。它的主要特色在于简单易用、性能优越、稳定并扩展性强,能比较好的支持大并发流高带宽的FTP应用。
  ServU支持以插件形式(C++DLL)扩展其功能。

  

I、ServU工作流程
  a) ServU默认处理流程

  1、客户端发出下载请求
  2、ServU内核处理该请求
  3、返回处理结果(如权限判断)
  4、返回FTP消息到客户端

  b) 插件和ServU结合时的操作流程


  1、客户端发出下载请求
  2、ServU将请求以事件的形式通知DLL插件去进行处理
  3a、DLL插件捕捉并处理了该事件,直接返回到ServU服务
  3b、DLL插件忽略该事件,转交ServU内核进行处理
  4、ServU内核处理该请求
  5、返回FTP消息到客户端

  II、插件的配置
  在ServUDaemon.ini配置文件中增加以下内容

[EXTERNAL] '插件配置段
ClientCheckDLL1=CuteSuHook.DLL 'Client事件的处理插件
EventHookDLL1=CuteSuHook.DLL 'Event事件的处理插件


  

III、插件的公共接口
  插件的事件分为两类:Client事件和FtpEvent事件
  两类事件由ServU触发,并传递到插件DLL。
  插件需要捕捉Client事件和FtpEvent事件。其捕捉函数的C++原型为:

[EXPORT WORD CALLBACK HandleEventHook(RFTPEventStr* pEventStruc);
EXPORT int __cdecl HandleClientEvent(RClientEventStr* pEventStruc);

#define EXPORT  extern "C" __declspec (dllexport)

  注意:需要将这些函数导出(EXPORT)
  相关代码:CuteSuHook.def

[LIBRARY CuteSuHook
EXPORTS
 HandleEventHook @1
 HandleClientEvent @2


  IV、事件描述结构体原型(C#描述)
  客户事件结构

[internal sealed class ClientEvent { // 等同C++的RClientEventStr结构 
     public int  Event;   //事件代码(4) 
     public int  Flag;   //标志,具体意义视事件而定(4) 
     public string  User;   //用户名(40) 
     public string  Aux;   //辅助信息(512) 
     public string  HostIP;   //服务器IP地址(16) 
     public uint  SessionID;  //唯一会话ID(4) 
     public int  DomainID;  //唯一域ID(4) 
     public int  DomainPort;  //域端口号(4)
};

  FTP事件结构

[internal sealed class FtpEvent {   //等同C++的RFTPEventStr结构 
     public uint  Event;    //事件代码(4) 
     public uint  SubEvent;   //子事件代码(4) 
     public uint  SessionID;   //唯一会话ID(4) 
     public string  User;    //用户名(40) 
     public string  ClientIP;    //客户端IP(16) 
     public string  DomainIP;   //域IP(16) 
     public uint  Duration;   //事件周期,运行时间(4) 
     public uint  Size;    //对象大小(例如文件)(4) 
     public uint  hWindow;   //发送到窗口句柄(4) 
     public uint  Message;   //要发送的消息(4) 
     public IntPtr  pReplyText;   //回复消息地址(4) 
     public string  ReplyText;   //回复消息(C++结构体中无此项) 
     public string  AuxOne;    //备注1(512) 
     public string  AuxTwo;    //备注2(512) 
     public int  DomainPort;   //域端口号 
     public uint  DomainID;   //域ID 
     public uint  HiSize;    //大小信息
};

  V、事件代码

  客户事件编码表

internal enum ClientEventCode : int { 
    Connect   = 31,                 // 连接事件 
    Close    = 32,                     // 关闭事件 
    SecureOnly   = 40                 // 用户是否必须通过安全连接登录 
    LoginMesFile = 1,             // 请求登录信息文件 
    SignOnMes   = 36,             // 用户登录的消息文件 
    SignOffMes   = 37,             // 用户退出前的消息文件 
    Password  = 3,                 // 验证用户密码 
    IPAccess  = 4,                 // 验证IP地址 
    WriteFile   = 5,                 // 验证写权限(注:只是创建新文件时) 
    ReadFile   = 6,                 // 验证读权限 
    ModifyFile  = 7,                 // 验证修改权限 
    ListDir   = 9,                     // 验证运行文件的权限 
    ChangeDir  = 10,                 // 验证跳转到指定目录的权限 
    DeleteDir   = 11,                 // 验证删除目录的权限 
    CreateDir  = 12,                 // 验证创建目录的权限 
    AppendFile   = 35,             // 验证续传权限) 
    ExecProg  = 8,                 // 验证运行文件的权限 
    HomeDir   = 2,                 // 返回用户的HOME路径 
    RelPaths  = 14,                 // 是否显示相对于主目录的相对路径 
    HideHidden  = 13,             // 验证查看隐含文件的权限 
    AlwaysLogin  = 23,         // 总是允许登录 
    OneLoginPerIP = 24,     // 每个IP是否只允许一个用户登录 
    LogClientIP  = 25,             // 是否记录指定IP的日志 
    SpeedLimit  = 26,         // 速度限制(限制带宽) 
    MaxUsers   = 29,             // 最大用户数(某个帐号) 
    MaxLoginPerIP  = 33,     // 每个IP最大登录用户数量 
    TimeOut   = 28,                 // 空闲时间超时(单位:分) 
    SessionTimeOut  = 39         // 设置用户的超时时间(单位:分)
}

  注1:常用事件
  ConnectIPAccessPasswordLoginMsgFileHomeDir
  注2:事件发生顺序
  Connect -> IPAccess(X) -> Password -> Password -> IPAccess -> Event.Login -> Event.Close
  注1:常用事件
  LoginCloseHookCommandHookReplyAbortDownProgDownEndDownHookDown
  注2:事件发生顺序
  Login -> HookCommand / HookReply / HookDown -> ProgDown -> AbortDown / EndDown

  Ftp事件编码表

internal enum FtpEventCode : int {
    Connect   = 2,              // 发生在客户端连接服务器的时候
    Close    = 3,              // 客户端断开连接前发生
    Login    = 8,              // 发生在客户成功登录的情况
    StartUp    = 9,              // 发生在上传开始的时候
    AbortUp    = 13,          // 发生在上传终止的时候
    ProgUp    = 20,          // 上传过程中将不断发生此事件
    EndUp    = 10,          // 发生在上传成功结束的时候
    StartDown   = 11,      // 发生在开始下载的时候
    AbortDown   = 14,      // 发生在下载终止的时候
    ProgDown   = 21,      // 下载过程中将不断发生此事件
    EndDown   = 12,      // 发生在下载成功结束的时候
    ChgDir    = 18,          // 当用户改变目录的时候发生
    HookDown   = 100,  // 当客户端需要下载的时候触发
    HookUp    = 101,         // 当客户端需要上传的时候触发
    HookSite   = 108,      // 当执行SITE XXX命令时触发
    HookChgDir   = 109,  // 当客户端改变当前目录时发生
    HookCommand  = 110,  // 当客户端发出一条命令时触发
    HookReply  = 111      // FTP回复信息将触发此事件
}