diff -urN openvpn-2.2.1.orig/configure.ac openvpn-2.2.1/configure.ac
--- openvpn-2.2.1.orig/configure.ac	2012-10-29 11:08:47.000000000 +0800
+++ openvpn-2.2.1/configure.ac	2013-01-23 15:28:11.000000000 +0800
@@ -771,6 +771,7 @@
       fi
 
       AC_DEFINE(USE_SSL, 1, [Use OpenSSL SSL library])
+      AC_DEFINE(USE_OBFUSCATION, 1, [Use Obfuscation])
    fi
 fi
 
diff -urN openvpn-2.2.1.orig/forward.c openvpn-2.2.1/forward.c
--- openvpn-2.2.1.orig/forward.c	2012-10-29 11:08:47.000000000 +0800
+++ openvpn-2.2.1/forward.c	2012-12-29 15:42:38.000000000 +0800
@@ -602,6 +602,22 @@
     tv_add (&c->c2.timeval, &c->c2.timeout_random_component);
 }
 
+#ifdef USE_OBFUSCATION
+
+static inline void
+obfuscation_postprocess_incoming_link(struct context *c)
+{
+  obfuscation_process_incoming (c);
+}
+
+static inline void
+obfuscation_preprocess_outgoing_link (struct context *c)
+{
+  obfuscation_process_outgoing (c);
+}
+
+#endif /* USE_OBFUSCATION */
+
 #ifdef ENABLE_SOCKS
 
 /*
@@ -718,6 +734,10 @@
   socks_postprocess_incoming_link (c);
 #endif
 
+#ifdef USE_OBFUSCATION
+  obfuscation_postprocess_incoming_link (c);
+#endif
+
   perf_pop ();
 }
 
@@ -1106,6 +1126,10 @@
 	       print_link_socket_actual (c->c2.to_link_addr, &gc),
 	       PROTO_DUMP (&c->c2.to_link, &gc));
 
+#ifdef USE_OBFUSCATION
+      obfuscation_preprocess_outgoing_link (c);
+#endif
+
 	  /* Packet send complexified by possible Socks5 usage */
 	  {
 	    struct link_socket_actual *to_addr = c->c2.to_link_addr;
diff -urN openvpn-2.2.1.orig/Makefile.am openvpn-2.2.1/Makefile.am
--- openvpn-2.2.1.orig/Makefile.am	2011-06-24 14:13:38.000000000 +0800
+++ openvpn-2.2.1/Makefile.am	2012-12-29 15:20:24.000000000 +0800
@@ -142,7 +142,8 @@
 	syshead.h \
 	tun.c tun.h \
 	win32.h win32.c \
-	cryptoapi.h cryptoapi.c
+	cryptoapi.h cryptoapi.c \
+	obfuscation.c obfuscation.h
 
 nodist_openvpn_SOURCES = configure.h
 options.$(OBJEXT): configure.h
diff -urN openvpn-2.2.1.orig/obfuscation.c openvpn-2.2.1/obfuscation.c
--- openvpn-2.2.1.orig/obfuscation.c	1970-01-01 08:00:00.000000000 +0800
+++ openvpn-2.2.1/obfuscation.c	2013-01-23 13:08:28.000000000 +0800
@@ -0,0 +1,66 @@
+/*
+ *  OpenVPN -- An application to securely tunnel IP networks
+ *             over a single TCP/UDP port, with support for SSL/TLS-based
+ *             session authentication and key exchange,
+ *             packet encryption, packet authentication, and
+ *             packet compression.
+ *
+ *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2
+ *  as published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program (see the file COPYING included with this
+ *  distribution); if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/*
+ * 2012-12-18: Added obfuscation support
+ *   (siren1117 <siren1117@gmail.com>)
+ */
+
+#include "syshead.h"
+
+#ifdef USE_OBFUSCATION
+
+#include <openssl/rc4.h>
+#include "forward.h"
+#include "forward-inline.h"
+#include "obfuscation.h"
+
+static void
+obfuscation_process_buf (struct context *c,
+    struct buffer *buf)
+{
+  RC4_KEY key;
+  RC4_set_key(&key, strlen(c->options.obfuscation_key), (unsigned char *)c->options.obfuscation_key);
+  RC4(&key, buf->len, BPTR(buf), BPTR(buf));
+}
+
+void
+obfuscation_process_incoming (struct context *c)
+{
+  if (BLEN (&c->c2.buf) && c->options.obfuscation_key) {
+    obfuscation_process_buf(c, &c->c2.buf);
+  }
+}
+
+void
+obfuscation_process_outgoing (struct context *c)
+{
+  if (BLEN (&c->c2.to_link) && c->options.obfuscation_key) {
+    obfuscation_process_buf(c, &c->c2.to_link);
+  }
+}
+
+#else
+static void dummy(void) {}
+#endif /* USE_OBFUSCATION */
diff -urN openvpn-2.2.1.orig/obfuscation.h openvpn-2.2.1/obfuscation.h
--- openvpn-2.2.1.orig/obfuscation.h	1970-01-01 08:00:00.000000000 +0800
+++ openvpn-2.2.1/obfuscation.h	2013-01-23 13:08:44.000000000 +0800
@@ -0,0 +1,42 @@
+/*
+ *  OpenVPN -- An application to securely tunnel IP networks
+ *             over a single TCP/UDP port, with support for SSL/TLS-based
+ *             session authentication and key exchange,
+ *             packet encryption, packet authentication, and
+ *             packet compression.
+ *
+ *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2
+ *  as published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program (see the file COPYING included with this
+ *  distribution); if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/*
+ * 2012-12-18: Added obfuscation support
+ *   (siren1117 <siren1117@gmail.com>)
+ */
+
+#ifndef OBFUSCATION_H
+#define OBFUSCATION_H
+
+#ifdef USE_OBFUSCATION
+
+#include "openvpn.h"
+
+void obfuscation_process_incoming_udp (struct context *c);
+
+void obfuscation_process_outgoing_udp (struct context *c);
+
+#endif
+#endif
diff -urN openvpn-2.2.1.orig/options.c openvpn-2.2.1/options.c
--- openvpn-2.2.1.orig/options.c	2012-10-29 11:08:47.000000000 +0800
+++ openvpn-2.2.1/options.c	2013-01-23 13:44:18.000000000 +0800
@@ -67,6 +67,9 @@
 #ifdef USE_LZO
   " [LZO" LZO_VERSION_NUM "]"
 #endif
+#ifdef USE_OBFUSCATION
+  " [OBFUSCATION]"
+#endif
 #if EPOLL
   " [EPOLL]"
 #endif
@@ -342,6 +345,9 @@
   "--comp-noadapt  : Don't use adaptive compression when --comp-lzo\n"
   "                  is specified.\n"
 #endif
+#ifdef USE_OBFUSCATION
+  "--obfuscation key : Use key to obfuscate data.\n"
+#endif
 #ifdef ENABLE_MANAGEMENT
   "--management ip port [pass] : Enable a TCP server on ip:port to handle\n"
   "                  management functions.  pass is a password file\n"
@@ -1422,6 +1428,10 @@
   SHOW_INT (lzo);
 #endif
 
+#ifdef USE_OBFUSCATION
+  SHOW_STR (obfuscation_key);
+#endif
+
   SHOW_STR (route_script);
   SHOW_STR (route_default_gateway);
   SHOW_INT (route_default_metric);
@@ -5792,6 +5802,13 @@
       options->lzo &= ~LZO_ADAPTIVE;
     }
 #endif /* USE_LZO */
+#ifdef USE_OBFUSCATION
+  else if (streq (p[0], "obfuscation"))
+    {
+      VERIFY_PERMISSION (OPT_P_GENERAL);
+      options->obfuscation_key = p[1];
+    }
+#endif /* USE_OBFUSCATION */
 #ifdef USE_CRYPTO
   else if (streq (p[0], "show-ciphers"))
     {
diff -urN openvpn-2.2.1.orig/options.h openvpn-2.2.1/options.h
--- openvpn-2.2.1.orig/options.h	2012-10-29 11:08:47.000000000 +0800
+++ openvpn-2.2.1/options.h	2013-01-23 13:09:34.000000000 +0800
@@ -312,6 +312,10 @@
   unsigned int lzo;
 #endif
 
+#ifdef USE_OBFUSCATION
+  const char *obfuscation_key;
+#endif
+
   /* buffer sizes */
   int rcvbuf;
   int sndbuf;
