用 Python 实现端口映射功能

1 端口映射

举个例子来说明一下端口映射的作用。

有A、B、C三台计算机,A、B互通,B、C互通,但是A、C不通,这个时候在C上开了一个Web服务,如何让A访问C的Web服务?

最简单有效的办法就是在B上开一个端口映射服务,然后让A访问B的某个端口,B将这个端口上的所有流量全部转发到C的Web服务端口上,同时将C上Web服务返回的流量也全部转发给A。这样对A来说,以B为跳板,实现了间接访问C上Web服务的目的。

2 实现流程

端口映射的原理并不复杂,本文以TCP为例介绍一下实现过程,简单画了个时序图(如下),这里就不再用文字赘述了。

TCP Mapping Runtime

需要注意的是,由于端口映射只是单纯的流量转发,对应用层数据不进行处理,所以对于多通道协议是无法支持的(如FTP协议)。

3 代码示例

按照上面的流程,Python实现如下(建议从后向前看):

# -*- coding: utf-8 -*-
# tcp mapping created by hutaow(hutaow.com) at 2014-08-31

import …

一种伪造服务器骗过某导航的音乐服务,从而延长有效期的方法

某导航提供的音乐服务(音乐e栈),和虾米合作的,需要付费使用,前段时间本来想上网搜个破解版,结果没搜到,索性自已分析了一下它的交互方式,找出了个通过充值认证来延长服务有效期的方法。方法本身不复杂,主要是因为它的认证机制略显简陋,本文主要从技术角度来说明过程,仅供参考学习。

1 原始界面

音乐e栈服务过期

如上图,插入经过车机初始化过的TF卡后,启动音乐e栈客户端,显示当前服务有效期为0天,并提示需要充值续费。如果点击下载专辑的按钮,提示不允许下载。

2 寻找入手点

既然提示让续费,那就看看续费过程是什么样子。

先随便输个卡号密码试试:

充值卡无效

竟然用CS架构来做充值认证,实在是土的掉渣,就从这里入手了。

3 交互过程

把刚才进行充值时的报文用Wireshark抓下来,看看它是如何交互的。

1) 报文

充值失败的报文

可以看到,充值认证的流量走的是TCP协议8080端口,对端连接的服务器地址是42.156.140.44,这个暂时放一边,先来看看请求和响应报文分别填了什么内容。

2) 请求消息

请求消息内容

上图中可以看到,充值请求消息虽然走的是8080端口,但实际内容并非HTTP协议。

TCP负载的开头44个字节是一段二进制数据 …


将 Python 脚本转换为可执行程序

本文所使用的工具是cx_Freeze,相对py2exe和PyInstaller来说,cx_Freeze的兼容性更好,支持最新的Python 3.X,支持PyQT,并且可以跨平台支持Windows和Linux系统。

cx_Freeze的官方主页为http://cx-freeze.sourceforge.net,下面以Windows系统为例介绍一下它的使用方法。

1 配置转换脚本

新建一个Python脚本文件,如setup.py,内容如下:

import sys
from cx_Freeze import setup, Executable

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "MyApp",
        version = "0.1",
        description = "My PyQT application!",
        executables = [Executable("pyqt_example.py …

使用 PyQT 作为 Python 的图形界面

以前Python写出来的脚本都是靠命令行执行,输入要是复杂点就得靠加参数,甚至加配置文件来搞定,自己用下还行,给别人用的时候总是不太方便,就一直想找个好用的图形界面库。

有试过Python内置的Tkinter,部署倒是挺简单,不需要额外安装库,但是开发效率还是不够高,而且需要手写不少界面相关的重复代码,用起来不太方便。

最近开始尝试第三方的界面库,几经权衡,最终在PyGTK、wxPython、PyQT中选择了PyQT,试了一下,确实很不错,下面就介绍一下PyQT的使用方法。

1 介绍

PyQT以QT为基础,跨平台(可以运行在Windows、Linux/Unix、MacOS等操作系统上),同时PyQT的界面可以直接用QT Designer做出来,可以很容易移植到其它语言上(C++、C#、Java、Perl等)。

2 例子

为了更好了了解PyQT,先写一段简单的示例代码,例子中通过点击按钮,来改变文本框所显示的内容,具体代码含义直接通过注释说明了。

# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtCore …