编译stunnel-编译成插件或应用程序

    技术2024-04-19  17

      1、编译成应用程序 首先下载Stunnel, http://www.stunnel.org/download/stunnel/src/stunnel-4.05.tar.gz ,由于编译时需要openssl的支持,所以下载openssl, http://www.openssl.org/source/openssl-0.9.7.tar.gz ,而编译openssl需要perl的支持,所以下载perl, http://ftp.funet.fi/pub/CPAN/src/perl-5.8.5.tar.gz 。首先编译perl,没有什么难度。然后在openssl中指明perl的路径,编译,也成功了。然后修改stunnel/src /makefile.w32文件,指明openssl的路径,stunnel也可以成功编译了。由于我只有1台PC,测试起来比较麻烦,就没有测试,不过 如何使用看stunnel的帮助文档就可以了。 编译成插件     注意:笔者试着下载了最新的包,但是里面包含sock_len的定义,而且4.20只是增加了手持设备的支持,所以笔者在4.20下没有编译通过,也觉得没有必要,最后选择了在4.05下编译,高手可以试试最新版。     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函数是创建窗体的,我们并不需要,把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;     } 最终形成了stunnel的vc工程,明天将上载上来供大家参考 然后把静态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()函数。 调用过程        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(); 将stunnel.dll和stunnel.conf、stunnel.pem都放进去即可。 将我编译成功的stunnel封装共享给大家(含源码和配置) http://blogimg.chinaunix.net/blog/upfile/071018112912.rar

    最新回复(0)