|
讓stunnel成為becky的插件
[email protected]
由於版權問題,becky不支持ssl,通常我們是用stunnel來解決這個問題的,但是用stunnel畢竟要另外起一個進程,還要佔用系統托盤。既然becky支持plugin,我們可以考慮花很少的一點代價把stunnel改造成becky的插件。
首先,下載stunnel的源碼:
http://www.stunnel.org/download/stunnel/src/stunnel-4.05.tar.gz
stunnel自己帶的makefile是用gcc的,但是似乎和靜態的openssl庫鏈接時有問題。好在stunnel的程序員很照顧我,代碼都是ANSI C,可以不出任何問題地用VC編譯。先修改stunnel的gui.c,找到:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow) {
修改為:
extern __declspec( dllexport ) int stunnel()
{
HINSTANCE hInstance;
HINSTANCE hPrevInstance;
LPSTR lpszCmdLine = "plugins\\stunnel\\stunnel.conf";
int nCmdShow;
下面的win_main函數是創建窗體的,我們並不需要,而且這部分代碼會合其他插件衝突,還會導致becky不能正常退出。把win_main函數刪掉大部分代碼後改成這個樣子:
static int win_main(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow) {
DWORD iID;
CloseHandle(CreateThread(NULL, 0, ThreadFunc, NULL, 0, &iID));
return 0;
}
然後把靜態openssl庫libeay32.lib和ssleay32.lib拷貝到src目錄,用下面這些命令編譯:
::-------------------------------------------------
cl -DUSE_WIN32 -DHAVE_OPENSSL -c stunnel.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c ssl.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c client.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c protocol.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c sthreads.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c log.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c options.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c sselect.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c gui.c
rc resources.rc
link -out:stunnel.dll /DLL ws2_32.lib gdi32.lib user32.lib shell32.lib comdlg32.lib libeay32.lib ssleay32.lib stunnel.obj ssl.obj client.obj protocol.obj sthreads.obj log.obj options.obj sselect.obj gui.obj resources.res
::-------------------------------------------------
得到stunnel.dll和stunnel.lib。stunnel.dll導出一個int stunnel()函數。
下載bercky的Plugin SDK:
http://www.rimarts.com/b2sdk/B2PinSDK-20800.zip
展開後可以看到裡面有BkPGP的完整代碼,我們就在此基礎上改。刪掉BkPGP自身功能部分的所有代碼,把下面這一段加到BKC_OnStart裡:
static char dllname[] = "plugins\\stunnel\\stunnel.dll";
static char funcname[] = "stunnel";
static HMODULE hStunnel;
static FARPROC stunnel;
hStunnel = LoadLibraryA( dllname );
if ( hStunnel==NULL )
{
MessageBox
( 0,
"Load stunnel.dll failed.",
"BkSSL",
MB_ICONERROR
);
return 1;
}
stunnel = GetProcAddress( hStunnel, funcname );
stunnel();
編譯為BkSSL.dll。
使用:把BkSSL.dll放在plugins目錄,另外,在plugins下面建立stunnel目錄,將stunnel.dll和stunnel.conf、stunnel.pem都放進去即可。
|
|