|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Contents
- 1 Windows ȯ°æ¿¡¼ OpenSSL Ȱ¿ë
- 2 OpenSSL ¼Ò½º ¹Þ±â
- 2.1 OpenSSL »çÀÌÆ®
- 2.2 Download »çÀÌÆ®
- 3 ¼Ò½º ÆÄÀÏ ¾ÐÃà Ç®±â
- 4 ºôµåÇϱâ À§ÇØ ÇÊ¿äÇÑ Åø
- 4.1 Perl Interpreter
- 4.2 C Compilers
- 4.3 Assembler
- 5 ºôµåÀü Áغñ ÀÛ¾÷
- 5.1 Microsoft DDK ¼³Ä¡
- 5.2 perl win32 ¹öÀü ¼³Ä¡
- 5.3 Path µî·Ï
- 6 ºôµå
- 6.1 Visual C++
- 6.2 Mingw32
- 6.3 Cygwin
- 7 ¿¹Á¦ ÇÁ·Î±×·¥
- 7.1 °³¹ß¼ø¼
- 7.2 6.2 ¼Ò½º ÄÚµå
- 7.3 ½Ç Çà
- 7.4 login.ini ÆÄÀÏ
- 7.5 ¼Ò½º ÄÚµå ´Ù¿î·Îµå
- 7.6 ÂüÁ¶ »çÀÌÆ®
|
1 Windows ȯ°æ¿¡¼ OpenSSL Ȱ¿ë
ÀÛ¼ºÀÚ: mwyun( ¸Û)
¸®´ª½º ȯ°æ¿¡¼ÀÇ openssl°ü·Ã ³»¿ëÀº ´ÙÀ½ URLÀ» Âü°íÇϱ⠹ٶø´Ï´Ù -- yundream
- opensslÀ» ÀÌ¿ëÇÑ ÆÄÀÏ ¾ÏÈ£È
2 OpenSSL ¼Ò½º ¹Þ±â
2.1 OpenSSL »çÀÌÆ®
2.2 Download »çÀÌÆ®
°¡Àå ÃֽйöÀüÀÎ 'openssl-0.9.7d.tar.gz' ¸¦ ´Ù¿î¹Þ´Â´Ù.
À©32 Ç÷§ÆûÀ» ºôµùÇÒ·Á¸é INSTALL.W32 ÆÄÀÏÀ» ÂüÁ¶ÇØ¾ß ÇÑ´Ù.
ÀÌ ¹®¼´Â 'INSTALL.W32' ÆÄÀÏÀ» ÂüÁ¶ÇÏ¿© ÀÛ¼ºµÇ¾ú´Ù.
INSTALL.WCE ÆÄÀÏÀ» Àо¸é Windows CE¿ëÀ¸·Î ºôµùÇÏ´Â ¹æ¹ýÀÌ ³ª¿ÍÀÖ´Ù.
À̰ÍÀº ½±°Ô Windows CE¿ëÀ¸·Î opensslÀ» Æ÷ÆÃÇÒ ¼ö ÀÖÀ½À» È®ÀνÃÄÑÁÖ°í ÀÖ´Ù.
3 ¼Ò½º ÆÄÀÏ ¾ÐÃà Ç®±â
'openssl-0.9.7d.tar.gz'¸¦ 'C:\openssl-0.9.7d'¿¡ ¾ÐÃàǬ´Ù.
4 ºôµåÇϱâ À§ÇØ ÇÊ¿äÇÑ Åø
4.1 Perl Interpreter
cpan »çÀÌÆ® °¡º¸¸é perl win32¿ë ¹öÀüÀ» ãÀ» ¼ö ÀÖ´Ù.
»ó¿ëÀ̹ǷΠ»ç¿ëÇÏÁö ¾Ê´Â´Ù.
- SIEMENS Win32 Perl(À̰ÍÀ» »ç¿ëÇÔ)
'SiePerl-5.8.0-bin-1.0-Win32.INSTALL.exe'ÆÄÀÏÀ» ´Ù¿î¹Þ´Â´Ù.
°ø°³ perl win32 ¹öÀü
4.2 C Compilers
- Visual C++
- Borland C
- GNU C (Mingw32 or Cygwin)
4.3 Assembler
- Microsoft MASM (º°¸í "ml") <=== Microsoft Windows 2000 DDK¿¡¼ Á¦°ø
- Free Netwide Assembler NASM : nasmw
5 ºôµåÀü Áغñ ÀÛ¾÷
5.1 Microsoft DDK ¼³Ä¡
Microsoft Windows 2000 DDK¸¦ ¼³Ä¡ÇÏÁö ¾Ê¾ÒÀ¸¸é www.msdn.com¿¡¼ ´Ù¿î¹Þ¾Æ¼ ¼³Ä¡ÇÑ´Ù.
À©µµ 2000ÀÎ °æ¿ì 2000¿ë DDK¸¦ ´Ù¿î¹Þ´Â´Ù.
ÀÚ¼¼ÇÑ ¼³Ä¡¹æ¹ýÀº ´ÙÀ½ ÆäÀÌÁö¸¦ ÂüÁ¶ÇÑ´Ù.
Microsoft Windows 2000 DDK
5.2 perl win32 ¹öÀü ¼³Ä¡
SiePerl-5.8.0-bin-1.0-Win32.INSTALL.exe¸¦ zipÀ» ÀÌ¿ëÇÏ¿© c:\perl µð·ºÅ丮¿¡ ¾ÐÃàǬ´Ù.
´ÙÀ½°ú °°ÀÌ ¼ºê µð·ºÅ丮°¡ »ý¼ºµÈ´Ù.
C:\perl\5.8.0\... (lots of sub dirs)
C:\perl\site\5.8.0\... (lots of sub dirs)
ÀÚ¼¼ÇÑ ¼³Ä¡ ¹æ¹ýÀº ´ÙÀ½ »çÀÌÆ®¸¦ ÂüÁ¶ÇÑ´Ù.
5.3 Path µî·Ï
Ä¿¸Çµå »ó¿¡¼ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۱â À§ÇØ Path¸¦ µî·ÏÇÑ´Ù.
¹ÙÅÁ ȸé > ³» ÄÄÇ»ÅÍ > ¸¶¿ì½º ¿À¸¥ÂÊ ¹öư(ÆË¾÷¸Þ´º) > µî·Ï Á¤º¸ > °í±Þ > ȯ°æ º¯¼ö > ½Ã½ºÅÛ º¯¼ö > Path º¯¼ö ¼±Åà > ÆíÁý ¹öư Ŭ¸¯
´ÙÀ½ ¼¼°³ °æ·Î¸¦ µî·ÏÇÑ´Ù.
C:\NTDDK\bin <=== ml
C:\perl\5.8.0\bin <=== perl
C:\perl\5.8.0\bin\MSWin32-x86-perlio <=== perl
Ãß°¡ÇÒ ÅØ½ºÆ® : C:\perl\5.8.0\bin;C:\perl\5.8.0\bin\MSWin32-x86-perlio;C:\NTDDK\BIN <=== ';'À¸·Î Path¸¦ ±¸ºÐÇÑ´Ù.
¼ÂÆÃ ÈÄ º¯¼ö °ª : C:\PROGRA~1\Borland\Delphi5\Projects\Bpl;C:\PROGRA~1\Borland\vbroker\jre\Bin;C:\PROGRA~1\Borland\vbroker\Bin;C:\PROGRA~1\Borland\Delphi5\Bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\ESTsoft\ALZip\;C:\sourcenav\bin;C:\perl\5.8.0\bin;C:\perl\5.8.0\bin\MSWin32-x86-perlio;C:\NTDDK\BIN
È®ÀÎ ¹öưÀ» Ŭ¸¯ÇÏ¿© âÀ» ´Ý´Â´Ù.
Ä¿¸Çµå âÀ» ¶Ù¾î¼ ml, perlÀÌ ½ÇÇàµÇ´ÂÁö Å×½ºÆ®Çغ»´Ù.
½ÃÀÛ > ½ÇÇà > "cmd"¶ó°í ÀÔ·ÂÇÏ°í ¿£ÅÍ
Ä¿¸Çµå âÀÌ ¶ß¸é ml or perl¸¦ ÀÔ·ÂÇÏ°í ¿£ÅÍ
6 ºôµå
ºôµå¸¦ À§ÇÏ¿© Visual C++¸¦ »ç¿ëÇÏ¿´´Ù.
Ä¿¸Çµå â ½ÇÇà
C:\>cd C:\openssl-0.9.7d
C:\openssl-0.9.7d>perl Configure VC-WIN32
Configuring for VC-WIN32
IsWindows=1
CC =cl
CFLAG =-DOPENSSL_SYSNAME_WIN32 -DOPENSSL_THREADS -DDSO_WIN32 -DOPENSSL_NO_KRB5
EX_LIBS =
BN_ASM =bn_asm.o
DES_ENC =des_enc.o fcrypt_b.o
BF_ENC =bf_enc.o
CAST_ENC =c_enc.o
RC4_ENC =rc4_enc.o
RC5_ENC =rc5_enc.o
MD5_OBJ_ASM =
SHA1_OBJ_ASM =
RMD160_OBJ_ASM=
PROCESSOR =
RANLIB =true
ARFLAGS =
PERL =perl
THIRTY_TWO_BIT mode
BN_LLONG mode
RC4_INDEX mode
RC4_CHUNK is undefined
Configured for VC-WIN32.
MASMÀ» »ç¿ëÇÏ´Â °æ¿ì <=== »ç¿ëÇÏ¿´´Ù.
C:\openssl-0.9.7d>ms\do_masm
Generating x86 for MASM assember
Bignum
DES
"crypt(3)"
Blowfish
CAST5
RC4
MD5
SHA1
RIPEMD160
RC5\32
C:\openssl-0.9.7d>perl util\mkfiles.pl 1>MINFO
C:\openssl-0.9.7d>rem perl util\mk1mf.pl VC-MSDOS no-sock >ms\msdos.mak
C:\openssl-0.9.7d>rem perl util\mk1mf.pl VC-W31-32 >ms\w31.mak
C:\openssl-0.9.7d>perl util\mk1mf.pl dll VC-W31-32 1>ms\w31dll.mak
C:\openssl-0.9.7d>perl util\mk1mf.pl VC-WIN32 1>ms\nt.mak
C:\openssl-0.9.7d>perl util\mk1mf.pl dll VC-WIN32 1>ms\ntdll.mak
C:\openssl-0.9.7d>perl util\mkdef.pl 16 libeay 1>ms\libeay16.def
C:\openssl-0.9.7d>perl util\mkdef.pl 32 libeay 1>ms\libeay32.def
C:\openssl-0.9.7d>perl util\mkdef.pl 16 ssleay 1>ms\ssleay16.def
C:\openssl-0.9.7d>perl util\mkdef.pl 32 ssleay 1>ms\ssleay32.def
MASMÀ» »ç¿ëÇÒ·Á¸é DDK¸¦ ¼³Ä¡ÇؾßÇÑ´Ù.
NASMÀ» »ç¿ëÇÏ´Â °æ¿ì <=== »ç¿ëÇÏÁö ¾Ê¾Ò´Ù.
C:\openssl-0.9.7d>ms\do_nasm
C:\openssl-0.9.7d>nmake -f ms\ntdll.mak
½ÇÇà°úÁ¤ »ý·«...
out32dll µð·ºÅ丮¿¡ DLL ÆÄÀϵéÀÌ »ý¼ºµÈ´Ù.
»ý¼ºµÈ Á¤Àû/µ¿Àû ¶óÀ̺귯¸® ÆÄÀϵéÀ» È®ÀÎÇØº»´Ù.
C:\openssl-0.9.7d\out32dll>dir *.dll
C µå¶óÀ̺êÀÇ º¼·ý: ·ÎÄà µð½ºÅ©
º¼·ý ÀÏ·Ã ¹øÈ£: 0CB2-AF14
C:\openssl-0.9.7d\out32dll µð·ºÅ͸®
2004-04-18 06:17p 830,976 libeay32.dll
2004-04-18 06:17p 150,016 ssleay32.dll
2°³ ÆÄÀÏ 980,992 ¹ÙÀÌÆ®
0 µð·ºÅ͸® 5,091,676,160 ¹ÙÀÌÆ® ³²À½
C:\openssl-0.9.7d\out32dll>dir *.lib
C µå¶óÀ̺êÀÇ º¼·ý: ·ÎÄà µð½ºÅ©
º¼·ý ÀÏ·Ã ¹øÈ£: 0CB2-AF14
C:\openssl-0.9.7d\out32dll µð·ºÅ͸®
2004-04-18 06:17p 1,421,450 libeay32.lib
2004-04-18 06:17p 115,488 ssleay32.lib
2°³ ÆÄÀÏ 1,536,938 ¹ÙÀÌÆ®
0 µð·ºÅ͸® 5,091,676,160 ¹ÙÀÌÆ® ³²À½
»ý¼ºµÈ ÆÄÀÏÁß¿¡¼ ¾îÇø®ÄÉÀÌ¼Ç °³¹ß¿¡ ÇÊ¿äÇÑ ¶óÀ̺귯¸® ÆÄÀÏ ¸ñ·Ï
ssleay32.lib
libeay32.lib
ssleay32.dll
libeay32.dll
Á¤»óÀûÀ¸·Î Á¤Àû/µ¿Àû ¶óÀ̺귯¸®°¡ »ý¼ºµÇ¾úÀ¸¸é ´ÙÀ½ Å×½ºÆ®´Â Á¤»ó ½ÇÇàµÈ´Ù.
C:\openssl-0.9.7d>cd out32dll
C:\openssl-0.9.7d\out32dll>..\ms\test
½ÇÇà°úÁ¤ »ý·«...
passed all tests <=== ÀÌ ¸Þ½ÃÁö°¡ ³ª¿À¸é ¸ðµç Å×½ºÆ®°¡ ¼º°øÇÑ °ÍÀÔ´Ï´Ù.
msvcrt.dll or crtdll.dll ÆÄÀϰú ¸µÅ©ÇÏ¿© ½ÇÇàÇÒ ¼ö ÀÖ´Â ¹ÙÀ̳ʸ®¸¦ »ý¼ºÇÒ·Á¸é gcc-2.95.2-msvcrt.exe¸¦ ´Ù¿î¹Þ´Â´Ù.
gcc-2.95.2-msvcrt.exeÀº msvcrt.dll or crtdll.dll ÆÄÀϰú ¸µÅ©ÇÏ¿© ½ÇÇàÇÏ´Â ¹ÙÀ̳ʸ®¸¦ »ý¼ºÇÑ´Ù.
´ÙÀ½ ÅøÀ» ´Ù¿î¹Þ¾Æ¼ ¼³Ä¡ÇÑ´Ù.
±âÁ¸¿¡ ¼³Ä¡µÈ Mingw32 µð·ºÅ丮¸¦ ã¾Æ¼ bin ¹Ø¿¡ gcc-2.95.2-msvcrt.exeÀ» º¹»çÇÑ´Ù.
===> C:\gcc-2.95.2\bin
Path µî·Ï
===> C:\gcc-2.95.2\mingw32.bat ¶Ç´Â À©µµ¿ì ½Ã½ºÅÛ ¼Ó¼º
CygwinÀº cygwin1.dllÀ» ÅëÇÏ¿© POSIX/UNIXÀ» ±¸ÇöÇÏ¿´À¸¹Ç·Î CygwinÀ¸·Î ºôµùµÈ openssl ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÒ·Á¸é cygwin1.dllµµ °°ÀÌ ¹èÆ÷ÇØ¾ßÇÏ´Â ¹®Á¦°¡ ¹ß»ýÇÑ´Ù.
¸¸¾à Windows CE¿ëÀ¸·Î opensslÀ» ºôµùÇÏ´Â °æ¿ì cygwin1.dllµµ ºôµùÇØ¾ßÇϹǷΠºÎ°¡ÀûÀÎ ÀÛ¾÷ÀÌ µé¹Ç·Î CygwinÀ» »ç¿ëÇÏÁö ¾Ê¾Ò´Ù.
7 ¿¹Á¦ ÇÁ·Î±×·¥
ºôµåÇÑ openssl library¸¦ ÀÌ¿ëÇÏ¿© °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥À» °³¹ßÇØº»´Ù.
VC++ IDE¸¦ ½ÇÇàÇÑ´Ù.
- ÇÁ·ÎÁ§Æ® ¸¸µé±â
File > New ¸Þ´º¸¦ ¼±ÅÃÇϰí Projects ÅÇ¿¡¼ "MFC AppWizard(exe)"¸¦ ¼±ÅÃÇÑ´Ù.
Project name: login
Location: C:\login <- C:\ÀÎ °æ¿ì ÇÁ·ÎÁ§Æ® À̸§À¸·Î µð·ºÅ丮°¡ ¸¸µé¾îÁø´Ù.
OK ¹öưÀ» Ŭ¸¯ÇÑ´Ù.

MFC AppWizard - Step1: Dialog base¸¦ ¼±ÅÃÇÑ´Ù.

MFC AppWizard - Setp2 of 4: Next ¹öưÀ» Ŭ¸¯ÇÑ´Ù.

MFC AppWizard - Setp3 of 4: Next ¹öưÀ» Ŭ¸¯ÇÑ´Ù.

MFC AppWizard - Setp4 of 4: Finish ¹öưÀ» Ŭ¸¯ÇÑ´Ù.

New Project Infomation: OK ¹öưÀ» Ŭ¸¯ÇÑ´Ù.

- ¼Ò½º ÄÚµå ÀÛ¼º
'''6.2 ¼Òµå ÄÚµå'''¸¦ ÂüÁ¶ÇÑ´Ù.
- ÇÁ·ÎÁ§Æ® ¼ÂÆÃ
Project > Settings¸¦ ¼±ÅÃÇϰí C/C++ ÅÇÀ» ¼±ÅÃÇÑ´Ù.
Preprocessor¸¦ ¼±ÅÃÇϰí "Additional include directories"¿¡ ".\\include"¸¦ Ãß°¡ÇÑ´Ù.
- ¶óÀ̺귯¸® ÆÄÀÏ °æ·Î µî·Ï
Project > Settings¸¦ ¼±ÅÃÇϰí Link ÅÇÀ» ¼±ÅÃÇÑ´Ù.
InputÀ» ¼±ÅÃÇϰí "Object/library modules"¿¡ "libeay32.lib ssleay32.lib"À» ÀÔ·ÂÇÑ´Ù.
- Çì´õ/¶óÀ̺귯¸® ÆÄÀÏ º¹»ç
C:\login\incldue¿¡ openssl Çì´õ ÆÄÀÏ Æú´õ¸¦ º¹»çÇÑ´Ù.
C:\openssl-0.9.7d\inc32\openssl => C:\login\incldue\openssl
C:\login¿¡ libeay32.lib, ssleay32.libÀ» º¹»çÇÑ´Ù.
C:\openssl-0.9.7d\out32dll\*.lib => C:\login
- ÄÄÆÄÀÏ
Build > Execute login.exe or Ctrl+F5
- µð¹ö±ë
7.2 6.2 ¼Ò½º ÄÚµå
loginDlg.h
// loginDlg.h : header file
//
#if !defined(AFX_LOGINDLG_H__29EBD912_9AF8_4F98_B7BC_C62601A84583__INCLUDED_)
#define AFX_LOGINDLG_H__29EBD912_9AF8_4F98_B7BC_C62601A84583__INCLUDED_
#include "SetupDlg.h"
#include "MD5.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CLoginDlg dialog
class CLoginDlg : public CDialog
{
// Construction
public:
UINT m_nFailCount;
BOOL Login(void);
CMD5 md5;
CLoginDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CLoginDlg)
enum { IDD = IDD_LOGIN_DIALOG };
CString m_Id;
CString m_Password;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CLoginDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CLoginDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
virtual void OnOK();
afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_LOGINDLG_H__29EBD912_9AF8_4F98_B7BC_C62601A84583__INCLUDED_)
loginDlg.cpp
// loginDlg.cpp : implementation file
//
#include "stdafx.h"
#include "login.h"
#include "loginDlg.h"
#include "SetupDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLoginDlg dialog
CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLoginDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLoginDlg)
m_Id = _T("");
m_Password = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CLoginDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLoginDlg)
DDX_Text(pDX, IDC_EDIT1, m_Id);
DDV_MaxChars(pDX, m_Id, 20);
DDX_Text(pDX, IDC_EDIT2, m_Password);
DDV_MaxChars(pDX, m_Password, 20);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)
//{{AFX_MSG_MAP(CLoginDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_SHOWWINDOW()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLoginDlg message handlers
BOOL CLoginDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_nFailCount = 0;
CString inifile;
inifile.Format(".\\%s.ini", AfxGetApp()->m_pszAppName);
md5.SetIniFile(inifile);
if (!md5.GetINIData())
{
AfxMessageBox("¼³Á¤Á¤º¸¸¦ Àдµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.");
CSetupDlg dlg;
CString str;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
str.Format("¾ÆÀ̵ð/ÆÐ½º¿öµå¸¦ ÀúÀåÇÏ¿´½À´Ï´Ù.\n´Ù½Ã ÇÁ·Î±×·¥À» ½ÃÀÛÇϼ¼¿ä!");
else if (nResponse == IDCANCEL)
str.Format("¾ÆÀ̵ð/ÆÐ½º¿öµå¸¦ ÀúÀåÇÏÁö ¾Ê¾Ò½À´Ï´Ù.\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù.");
AfxMessageBox(str);
CDialog::OnOK(); // return FALSE;
}
return TRUE; // return TRUE unless you set the focus to a control
}
void CLoginDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CLoginDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CLoginDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CLoginDlg::OnOK()
{
// TODO: Add extra validation here
if (Login()) // ·Î±×ÀÎ ¼º°ø
CDialog::OnOK();
else // ·Î±×ÀÎ ½ÇÆÐ
{
m_nFailCount++; // ½ÇÆÐ Ä«¿îÆ® Áõ°¡
if (m_nFailCount >= 3)
{
CString str;
str.Format("3¹ø ÀÌ»ó À߸ø ÀÔ·ÂÇÏ¿´½À´Ï´Ù.\n´Ù½Ã ÇÁ·Î±×·¥À» ½ÃÀÛÇϼ¼¿ä!");
AfxMessageBox(str);
CDialog::OnOK();
}
m_Id = "";
m_Password = "";
UpdateData(FALSE);
((CEdit *)GetDlgItem(IDC_EDIT1))->SetFocus();
}
}
BOOL CLoginDlg::Login()
{
char *encrypt_password = NULL;
UpdateData(TRUE);
if (md5.GetId() != m_Id)
{
AfxMessageBox("¾ÆÀ̵𰡠´Ù¸§´Ï´Ù.");
return FALSE;
}
if (md5.GetMD5()) // md5 ¾ÏÈ£È
{
//m_Password¸¦ md5 ¾ÏÈ£È ÇÑ´Ù.
encrypt_password = md5.DigestMsg(m_Password.GetBuffer(m_Password.GetLength())); // Digest Data
m_Password.Format("%s", encrypt_password);
}
#if _DEBUG
CString Password = md5.GetPassword();
TRACE("%s, %d\n%s, %d\n", Password, Password.GetLength(), m_Password, m_Password.GetLength());
#endif
if (md5.GetPassword() != m_Password)
{
AfxMessageBox("¾ÏÈ£°¡ ´Ù¸§´Ï´Ù.");
if (encrypt_password)
free(encrypt_password);
return FALSE;
}
AfxMessageBox("·Î±×Àο¡ ¼º°øÇÏ¿´½À´Ï´Ù.");
if (encrypt_password)
free(encrypt_password);
return TRUE;
}
void CLoginDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
// TODO: Add your message handler code here
((CEdit *)GetDlgItem(IDC_EDIT1))->SetFocus();
}
SetupDlg.h
#if !defined(AFX_SETUPDLG_H__1331B4D5_E122_4CC6_AA1C_7563BC934443__INCLUDED_)
#define AFX_SETUPDLG_H__1331B4D5_E122_4CC6_AA1C_7563BC934443__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// SetupDlg.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CSetupDlg dialog
class CSetupDlg : public CDialog
{
// Construction
public:
CSetupDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CSetupDlg)
enum { IDD = IDD_SETUP_DIALOG };
BOOL m_md5;
CString m_Id;
CString m_Password;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSetupDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CSetupDlg)
virtual void OnOK();
afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SETUPDLG_H__1331B4D5_E122_4CC6_AA1C_7563BC934443__INCLUDED_)
SetupDlg.cpp
// SetupDlg.cpp : implementation file
//
#include "stdafx.h"
#include "login.h"
#include "SetupDlg.h"
#include "md5.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSetupDlg dialog
CSetupDlg::CSetupDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSetupDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSetupDlg)
m_md5 = FALSE;
m_Id = _T("");
m_Password = _T("");
//}}AFX_DATA_INIT
}
void CSetupDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSetupDlg)
DDX_Check(pDX, IDC_CHECK1, m_md5);
DDX_Text(pDX, IDC_EDIT11, m_Id);
DDV_MaxChars(pDX, m_Id, 20);
DDX_Text(pDX, IDC_EDIT22, m_Password);
DDV_MaxChars(pDX, m_Password, 20);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSetupDlg, CDialog)
//{{AFX_MSG_MAP(CSetupDlg)
ON_WM_SHOWWINDOW()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSetupDlg message handlers
void CSetupDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(TRUE);
if (m_Id == "")
{
((CEdit *)GetDlgItem(IDC_EDIT11))->SetFocus();
return;
}
else if (m_Password == "")
{
((CEdit *)GetDlgItem(IDC_EDIT22))->SetFocus();
return;
}
CMD5 md5;
CString inifile;
inifile.Format(".\\%s.ini", AfxGetApp()->m_pszAppName);
md5.SetIniFile(inifile);
md5.SetId(m_Id);
md5.SetPassword(m_Password);
md5.SetMD5(m_md5);
md5.SetINIData();
CDialog::OnOK();
//DestroyWindow();
}
void CSetupDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
// TODO: Add your message handler code here
((CEdit *)GetDlgItem(IDC_EDIT11))->SetFocus();
}
MD5.h
// MD5.h: interface for the CMD5 class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MD5_H__2FD75D63_0178_412A_B2DA_8B52C1921C38__INCLUDED_)
#define AFX_MD5_H__2FD75D63_0178_412A_B2DA_8B52C1921C38__INCLUDED_
#include <openssl/evp.h>
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CMD5
{
public:
CMD5();
BOOL GetINIData();
void SetINIData();
CString GetId() { return m_Id; };
CString GetPassword() { return m_Password; };
void SetId(CString id) { m_Id = id; };
void SetPassword(CString password) { m_Password = password; };
CString StringToMD5(CString str);
BOOL GetMD5() { return m_bMD5; };
void SetMD5(BOOL md5) { m_bMD5 = md5; }
void SetIniFile(CString inifile) { m_IniFile = inifile; };
CString GetIniFile() { return m_IniFile; };
char *DigestMsg(char *mess);
void PrintDigestMsg(unsigned char *mess, int len);
char CharToHex(char ch);
void StrToHex(char *str, unsigned char *new_str);
virtual ~CMD5();
private:
CString m_Id;
CString m_Password;
CString m_IniFile;
BOOL m_bMD5;
};
#endif // !defined(AFX_MD5_H__2FD75D63_0178_412A_B2DA_8B52C1921C38__INCLUDED_)
MD5.cpp
// MD5.cpp: implementation of the CMD5 class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "login.h"
#include "MD5.h"
#include <string.h>
//#include <openssl/evp.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMD5::CMD5()
{
}
CMD5::~CMD5()
{
}
BOOL CMD5::GetINIData()
{
int md5;
DWORD dwLen;
char password[128];
char id[128];
md5 = ::GetPrivateProfileInt("setup", "md5", 0, m_IniFile);
::GetPrivateProfileString("setup", "id", NULL, id, 128, m_IniFile);
dwLen = ::GetPrivateProfileString("setup", "password", NULL, password, 128, m_IniFile);
m_bMD5 = md5;
m_Id.Format("%s", id);
m_Password.Format("%s", password);
#if _DEBUG
TRACE("%d, %s, %s, %d\n", md5, id, password, dwLen);
PrintDigestMsg((unsigned char *)password, dwLen);
#endif
if (m_bMD5 == 0 && m_Id == "" && m_Password == "")
{
return FALSE;
}
return TRUE;
}
void CMD5::SetINIData()
{
CString str;
str.Format("%d", m_bMD5);
::WritePrivateProfileString("setup", "md5", str, m_IniFile);
::WritePrivateProfileString("setup", "id", m_Id, m_IniFile);
if (m_bMD5) // md5 ¾ÏÈ£È ÇØ¼ ÀúÀå
{
char *encrypt_password = DigestMsg(m_Password.GetBuffer(m_Password.GetLength())); // Digest Data
#if _DEBUG
TRACE("%s, %d\n", encrypt_password, strlen(encrypt_password));
#endif
::WritePrivateProfileString("setup", "password", encrypt_password, m_IniFile);
free(encrypt_password);
}
else // plain text·Î ÀúÀå
{
::WritePrivateProfileString("setup", "password", m_Password, m_IniFile);
}
}
// URL: http://www.openssl.org/docs/crypto/EVP_DigestInit.html
char *CMD5::DigestMsg(char *mess)
{
EVP_MD_CTX mdctx;
const EVP_MD *md;
int md_len; // digest data length
unsigned char md_value[EVP_MAX_MD_SIZE]; // Saved digest data
unsigned char encrypt_password[128];
if (m_Password == "")
return "";
OpenSSL_add_all_digests();
md = EVP_get_digestbyname("md5");
if (!md)
{
AfxMessageBox("Unknown message digest md5");
return "";
}
EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx, md, NULL);
EVP_DigestUpdate(&mdctx, mess, strlen(mess)); // digest data
EVP_DigestFinal_ex(&mdctx, md_value, (unsigned int *)&md_len);
EVP_MD_CTX_cleanup(&mdctx);
md_value[md_len] = '\0'; // ²¿¿Á ³Ö¾îÁØ´Ù.
// 16Áø¼ö ÇüÅ·Πº¯È¯
StrToHex((char *)md_value, encrypt_password);
#if _DEBUG
TRACE("md_len=%d\n", md_len);
PrintDigestMsg(md_value, md_len);
TRACE("md_value=%s\n", md_value);
#endif
return _strdup((char *)encrypt_password);
}
void CMD5::PrintDigestMsg(unsigned char *mess, int len)
{
int i;
for (i =0; i < len; i++)
{
TRACE("%02x", mess[i]);
}
TRACE("\n");
}
char CMD5::CharToHex(char ch)
{
char hex;
if (ch >= 0 && ch <= 9)
hex = ch - 0 + '0';
else if (ch >= 10 && ch <= 15)
hex = ch - 10 + 'a';
return hex;
}
void CMD5::StrToHex(char *str, unsigned char *new_str)
{
int i, j;
i = 0;
j = 0;
while (i < strlen(str))
{
unsigned char ch;
// »óÀ§ 4ºñÆ®
ch = (str[i] >> 4) & 0x0f;
new_str[j] = CharToHex(ch);
j++;
// ÇÏÀ§ 4ºñÆ®
ch = str[i] & 0x0f;
new_str[j] = CharToHex(ch);
j++;
i++;
}
new_str[j] = '\0';
}
- µ¿Àû ¶óÀ̺귯¸® ÆÄÀÏ º¹»ç
libeay32.dll, ssleay32.dllÀÌ login ÇÁ·Î±×·¥ µð·ºÅ丮¿¡ ÀÖ´øÁö ¾Æ´Ï¸é À©µµ¿ì ½Ã½ºÅÛ µð·ºÅ丮¿¡ À§Ä¡ÇؾßÇÑ´Ù.
- ½±°Ô libeay32.dll, ssleay32.dll ÆÄÀÏÀ» C:\login\debug µð·ºÅ丮¿¡ º¹»çÇÑ´Ù.
C:\login¿¡ libeay32.dll, ssleay32.dllÀ» º¹»çÇÑ´Ù.
C:\openssl-0.9.7d\out32dll\*.dll => C:\login\debug
- Ž»ö±â¸¦ ½ÇÇàÇÏ¿© "C:\login\debug"·Î À̵¿ÇÑ´Ù.
- login.exe¸¦ ½ÇÇàÇÑ´Ù.
- login.ini ÆÄÀÏÀÌ ¾ø´Â °æ¿ì
¿¡·¯ ¸Þ½ÃÁö Ãâ·Â
·Î±×ÀÎ Á¤º¸ ¼³Á¤
ÆÐ½º¿öµå¸¦ MD5·Î ¾ÏÈ£ÈÇØ¼ ÀúÀåÇÒ·Á¸é "MD5 ¾ÏÈ£È"¸¦ üũÇÑ´Ù.
¾Ë¸² ¸Þ½ÃÁö
|
|