Chinaunix首页 | 论坛 | 博客
  • 博客访问: 450995
  • 博文数量: 101
  • 博客积分: 1547
  • 博客等级: 上尉
  • 技术积分: 1072
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-12 23:46
个人简介

music,code,dialog,rest

文章分类

全部博文(101)

文章存档

2023年(8)

2022年(25)

2021年(6)

2020年(2)

2019年(6)

2018年(4)

2017年(5)

2016年(20)

2015年(4)

2014年(2)

2013年(1)

2012年(1)

2011年(1)

2010年(1)

2009年(2)

2007年(10)

2006年(3)

分类: Python/Ruby

2011-09-24 07:06:36

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) |
给主人留下些什么吧!~~