Zenith 原创文章,转载请注明出处,谢谢。
在一个叫accordata的德国公司网站上发布了一个perl的工具port-proxy, 其实这个工具是一个raw tcp proxy。
raw tcp proxy 的好处就是,所有的TCP Payload都在你的控制之下了。你可以随意的控制payload。
那如何在tcp的代理流程中进行植入自己的代码,实现对TCP请求的Payload进行动态修改呢?
port-proxy download address
这个工具,非常适于快速编写业务原型。但是,国内似乎没人在应用这个东西。
程序结构分析:
该程序结构异常小巧,体现了纯Perl的精炼程度。
分为几大部分:
主程序,实现Proxy的主要功能。
配置文件读入
系统信号处理
以及若干Socket辅助处理
和后端连接等过程。
要如何将自己的代码插入呢?
首先,需要分析一下,插入的过程细节。
1. 获取当前连接传入连接的数据。
2. 对数据进行相应的业务逻辑处理。
3. 再将处理后的数据返回当前的代理流程。
所以,应当先搞清楚Socket是如何传入的。
果然,我们在这句syswrite($param->{'corresponding_sock'}, $buff)
现在知道这个$buff就是要传入的当前Socket的tcp payload。
所以,所有的文章就从这个$buff开始了。
在不考虑模块化过程化方式,可以直接写一个独立的子过程,然后在main时,直接用\&tcpplugin。
它的main()启动时变成这样:
main(\&tcpplugin) {
my $plugin=shift;
...
}
在真正调用plugin时,是87行的这句
my $l=syswrite($param->{'corresponding_sock'},$buff);
改成
my $l=syswrite($param->{'corresponding_sock'},$plugin->($buff));
然后,在程序的最后,可以开始你自己的Plugin旅程了。
sub tcpplugin($) {
my $payload=shift;
...
}
如果从今后扩展角度, 思路可以从OO角度出发,可以将port-proxy模块化,然后启动时需要New一下产生一个实例,并且另外编写的一个Plugin模块,也New一个实例,将Plugin的实例带入new一个port-proxy时的第一个参数。
甚至可以考虑更进一步的想法,如实现动态上载卸载Plugin,实现不同业务逻辑的无缝切换, 或根据传入业务数据的不同进行不同的业务逻辑插件的调用,后面的能做的事,几乎是没有限制的。
如果不考虑perl在稳定性和性能上的略势,能给原型开发带来很多便利。
后面,还可以做一些完善工作,如可以修改ReadConfig,将config部分添加plugin配置,使配置文件支持指定的调入的plugin名字。
zenith
20110924
阅读(2132) | 评论(0) | 转发(0) |