Total Pageviews

Friday, 31 July 2015

Windows桌面下,编译OpenVPN客户端(保存密码,修改日志字体)


OpenVPN客户端一般由两部分组成,OpenVPN和OpenVPN GUI。官方提供的OpenVPN客户端 for Windows为了提高用户账号的安全性,默认不能保存密码。安全性确实提高了,但是遇到网络不好,VPN意外中断时,每次都要手工输入密码,也很烦心。 所以我们需要重新编译客户端代码,让其能够保存密码。而OpenVPN GUI的问题在于状态窗口输入的日志字体小得惊人,像我这种戴眼镜后矫正视力才0.6的人,想看清连接状态几乎是不可能的,所以也得改。

搭建编译环境
我很久没有碰过C语言了,所以除了官方推荐的环境,我不确定其他环境是否能顺利编译。
NSIS 下载链接,建议完全安装。
MinGW 下载链接,现在MinGW只提供在线安装程序,安装时再下载相关文件,耗时较长。也可以Google一下,有完整版可下,假设安装路径为 C:\MinGW
MSYS 下载链接,假设安装路径为 C:\msys\1.0
msysDTK 下载链接,安装路径和MSYS相同,C:\msys\1.0
配置环境变量,如果变量PATH中已有其他路径,则新增“;C:\MinGW\bin;C:\msys\1.0\bin”,如果变量PATH不存 在,则新建一个变量,命名为PATH,内容为“C:\MinGW\bin;C:\msys\1.0\bin”。注意,变量内容都不包含引号,新增变量时, 变量内容最前面没有分号。
配置完成后,打开命令提示符,输入bash,如果界面显示“bash-3.1$”,则编译环境搭建完成。

获取预编译文件
OpenVPN编译过程中需要openssl,tap驱动,lzo压缩等文件,我们可以下载已经编译好的文件 下载链接,这里的预编译文件版本不是2.1.1,但不影响实际编译效果。
新建一个工作目录 C:\work,将预编译文件解压后置于工作目录下,应包含以下四个目录:
gen-prebuilt
lzo-2.02
openssl-0.9.8l
pkcs11-helper

编译OpenVPN GUI
获取OpenVPN GUI的源代码 下载链接,解压缩到C:\work\openvpn-gui目录下。
首先修改openvpn.c,找到函数StatusDialogFunc,修改
charformat.yHeight = 100;
strcpy(charformat.szFaceName, “MS Sans Serif”);
其中100是字体大小,MS Sans Serif是字体名称。
接下来需要修改Makefile,
OPENSSL = /c/OpenSSL 改为预编译文件中的openssl下include头文件的位置,这里为
OPENSSL = ../openssl-0.9.8l/include/openssl
LIB_DIRS = -L${OPENSSL}/lib/MinGW 改为预编译文件中openssl的相关lib目录,这里为
LIB_DIRS = –L../gen-prebuilt/lib
运行C:\msys\1.0下的msys.bat,进入类unix环境,切换到C:\work\openvpn-gui目录,执行make,OpenVPN GUI即可编译完成。
编译OpenVPN客户端
获取OpenVPN客户端的源代码 下载链接,解压缩到C:\work\openvpn-2.1.1目录下。
修改misc.c文件,在#ifundef ENABLE_PASSWORD_SAVE一行前面加上
#define ENABLE_PASSWORD_SAVE
到install-win32目录,修改openvpn.nsi文件,找到以下代码:
; tap-64bit:
DetailPrint “We are running on a 64-bit system.”
SetOutPath “$INSTDIR\bin”
File “${GEN}\tapinstall\amd64\tapinstall.exe”
SetOutPath “$INSTDIR\driver”
File “${GEN}\driver\amd64\OemWin2k.inf”
File “${GEN}\driver\amd64\${PRODUCT_TAP_ID}.cat”
File “${GEN}\driver\amd64\${TAPDRV}”
goto tapend
tap-32bit:
DetailPrint “We are running on a 32-bit system.”
SetOutPath “$INSTDIR\bin”
File “${GEN}\tapinstall\i386\tapinstall.exe”
SetOutPath “$INSTDIR\driver”
File “${GEN}\driver\i386\OemWin2k.inf”
File “${GEN}\driver\i386\${PRODUCT_TAP_ID}.cat”
File “${GEN}\driver\i386\${TAPDRV}”
tapend:
SectionEnd
在这段代码最前面插入:
!undef GEN
!define GEN “C:\work\gen-prebuilt\”
在这段代码最后面插入:
undef
!define GEN “..”
打开命令提示符,执行如下命令:
cd C:\work\openvpn-2.1.1
bash domake-win
编译结束后,安装文件会生成在C:\work\openvpn-2.1.1\gen目录下。
修改OpenVPN配置文件
修改当前使用的ovpn配置文件,将auth-user-pass改为auth-user-pass pass.txt,同时在相同路径下新增一个名为pass.txt的文本文件,内容为两行,第一行为vpn用户名,第二行为密码。
重新运行OpenVPN,即可不输密码登录vpn,而且此时status窗口的日志输出,也终于能看得清了.