//--------------------------------------------------------------------------- #pragma hdrstop #include "USBLock.h" #include "tchar.h" //--------------------------------------------------------------------------- #include "seed.h" #include //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- // ½ÇÇà ÁßÀÎ ÇÁ·Î¼¼½ºÀÇ ¸ñ·ÏÀ» ¾ò¾î¿Â´Ù bool CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lpParam) { HANDLE hSnapshot = NULL; HANDLE hProcess = NULL; PROCESSENTRY32 pe32; bool bContinue = false; DWORD dwPID; Char *WindowTitle = NULL; String strWindowTitle; TStringList *strReverseEngineeringToolList = NULL; // ½ÇÇà ÁßÀÎ ÇÁ·Î¼¼½ºÀÇ ¸ñ·Ï°ú ºñ±³¸¦ À§ÇÑ Àü¿ª º¯¼ö bool bFind; if (hWnd && IsWindowVisible(hWnd) && ((GetWindowLong(hWnd, GWL_HWNDPARENT) == 0) || (HWND(GetWindowLong(hWnd, GWL_HWNDPARENT)) == GetDesktopWindow)) && (GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) == 0) { WindowTitle = new Char[256]; GetWindowText(hWnd, WindowTitle, 255); // ÇÁ·Î¼¼½ºÀÇ Ä¸¼ÇÀ» ¾ò¾î¿Â´Ù strWindowTitle = WindowTitle; strWindowTitle = strWindowTitle.UpperCase(); bFind = false; strReverseEngineeringToolList = (TStringList *)lpParam; for (int i = 0; i < strReverseEngineeringToolList->Count; i++) { if (strWindowTitle.Pos(strReverseEngineeringToolList->Strings[i].UpperCase()) > 0) { bFind = true; break; } } if (WindowTitle) { delete []WindowTitle; WindowTitle = NULL; } if (bFind) { // ÀÔ·ÂµÈ °ª°ú Çϳª¶óµµ °°À¸¸é Á¾·á GetWindowThreadProcessId(hWnd, &dwPID); // ÇÁ·Î¼¼½º ID¸¦ ¾ò¾î¿À¸ç pe32.dwSize = sizeof(PROCESSENTRY32); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); bContinue = Process32First(hSnapshot, &pe32); while (bContinue) { if (pe32.th32ProcessID == dwPID) { // µ¿ÀÏÇÑ ÇÁ·Î¼¼½ºÀÇ ÇÚµéÀ» ¾ò±âÀ§ÇÑ ÀÛ¾÷ÀÌ´Ù hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pe32.th32ProcessID); if (hProcess) { // ¸Þ½ÃÁö ¹Ú½º¸¦ È£ÃâÇÏÁö ¾Êµµ·Ï ÇÑ´Ù (¸Þ½ÃÁö ¹Ú½º°¡ ¶° ÀÖ´Â µ¿¾È µð¹ö±×ÇÒ ¼ö Àֱ⠶§¹®) //Application->MessageBox(pMessage06, pMessage01, MB_ICONSTOP); TerminateProcess(hProcess, 0); // ÇÁ·Î¼¼½ºÀÇ ÇÚµéÀ» ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º Á¾·á CloseHandle(hProcess); } break; } bContinue = Process32Next(hSnapshot, &pe32); } if (hSnapshot) { CloseHandle(hSnapshot); } } } return true; } //--------------------------------------------------------------------------- __fastcall TUSBLock::TUSBLock() { strReverseEngineeringToolList = NULL; CheckReverseEngineeringTools(); } //--------------------------------------------------------------------------- __fastcall TUSBLock::~TUSBLock() { if (strReverseEngineeringToolList) { strReverseEngineeringToolList->Clear(); delete strReverseEngineeringToolList; } strReverseEngineeringToolList = NULL; } //--------------------------------------------------------------------------- void __fastcall TUSBLock::KillReverseEngineeringTool(TStringList *strExcutionNameList) { // ReverseEngineeringToolÀÌ °¨ÁöµÇ¸é ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù HANDLE hSnapshot = NULL; HANDLE hProcess = NULL; PROCESSENTRY32 pe32; bool bContinue = false; char WindowsCaption[255]; String strWindowsCaption; int nIndex = 0; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); pe32.dwSize = sizeof(PROCESSENTRY32); // ÇÁ·Î±×·¥ÀÇ À̸§°ú °°À» °æ¿ì Á¾·á if (strExcutionNameList && hSnapshot) { bContinue = Process32First(hSnapshot, &pe32); while (bContinue) { strWindowsCaption = pe32.szExeFile; strWindowsCaption = strWindowsCaption.LowerCase(); nIndex = 0; for (int i = 0; i < strExcutionNameList->Count; i++) { if (strWindowsCaption.Pos(strExcutionNameList->Strings[i].LowerCase()) > 0) { nIndex = i; break; } } if (nIndex > 0) { hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pe32.th32ProcessID); if (hProcess) { TerminateProcess(hProcess, 0); // ÇÁ·Î¼¼½ºÀÇ ÇÚµéÀ» ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º Á¾·á CloseHandle(hProcess); } break; } bContinue = Process32Next(hSnapshot, &pe32); } if (hSnapshot) { CloseHandle(hSnapshot); hSnapshot= NULL; } } } //--------------------------------------------------------------------------- void __fastcall TUSBLock::CheckReverseEngineeringTools() { if (strReverseEngineeringToolList == NULL) { strReverseEngineeringToolList = new TStringList; // Reverse Engineering Tool Kill // http://www.drvi.com/DrVirus/sub02/sub02_01_view.php?no=262 ¿¡ Ç¥±âµÇ¾îÀÖ´Â µð¹ö±ë ÇÁ·Î±×·¥ ¸ñ·Ï strReverseEngineeringToolList->Add("EXESPY"); strReverseEngineeringToolList->Add("WXR95"); strReverseEngineeringToolList->Add("REGMON"); strReverseEngineeringToolList->Add("FILE MONITOR"); strReverseEngineeringToolList->Add("REGMONEX"); strReverseEngineeringToolList->Add("WINDOW DETECTIVE"); strReverseEngineeringToolList->Add("DEBUGVIEW"); strReverseEngineeringToolList->Add("RESSPY"); strReverseEngineeringToolList->Add("ADVANCED REGISTRY TRACER"); strReverseEngineeringToolList->Add("REGSNAP"); strReverseEngineeringToolList->Add("MEMSPY"); strReverseEngineeringToolList->Add("MEMORY DOCTOR"); strReverseEngineeringToolList->Add("PROCDUMP32"); strReverseEngineeringToolList->Add("MEMORY EDITOR"); strReverseEngineeringToolList->Add("FROGSICE"); strReverseEngineeringToolList->Add("SMU WINSPECTOR"); strReverseEngineeringToolList->Add("MEMORY DUMPER"); strReverseEngineeringToolList->Add("MEMORYMONITOR"); strReverseEngineeringToolList->Add("NUMEGA SOFTICE LOADER"); strReverseEngineeringToolList->Add("URSOFT W32DASM"); strReverseEngineeringToolList->Add("OLLYDBG"); strReverseEngineeringToolList->Add("TRW2000"); strReverseEngineeringToolList->Add("DEDE"); // Delphi Decompiler strReverseEngineeringToolList->Add("HACK"); strReverseEngineeringToolList->Add("CRACK"); strReverseEngineeringToolList->Add("WINICE"); strReverseEngineeringToolList->Add("DRWATSON"); // Memory Dump strReverseEngineeringToolList->Add("WINDBG"); // Memory Dump strReverseEngineeringToolList->Add("DEVENV"); // Visual Studio //strReverseEngineeringToolList->Add("BCB"); // Borland C++ Builder } // ÇÁ·Î¼¼½ºÀÇ Ä¸¼ÇÀ̳ª ½ÇÇàÆÄÀϸíÀÌ °°À» °æ¿ì Á¾·á if (strReverseEngineeringToolList) { EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM)strReverseEngineeringToolList); KillReverseEngineeringTool(strReverseEngineeringToolList); } } //--------------------------------------------------------------------------- /* int __fastcall TUSBLock::SeedEncode(AnsiString strFileName, int nVersion , BYTE *pEncode, DWORD dwEncLen, BYTE **pDecode, unsigned short nIVKeyIndex) { // SEED ¾Ë°í¸®ÁòÀ» ÀÌ¿ëÇÑ ¾Ïȣȭ // ÁÖÀÇÇÒ Á¡Àº ¾ÏȣȭµÉ µ¥ÀÌÅÍ(pDecode)ÀÇ Å©±â¸¦ ¹Ì¸® ¾Ë ¼ö ¾øÀ¸¹Ç·Î // ÀÎÀÚ·Î ³Ñ¾î¿À±âÀü¿¡ ÇÒ´çÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, ÇÔ¼ö ³»¿¡¼­ Å©±â°¡ Á¤ÇØÁö°í ÇÒ´çµÈ´Ù´Â °ÍÀÌ´Ù. DWORD dwEnIndex, dwDecLen; BYTE *pAccumData = NULL, *pSwapData = NULL; BYTE SrcData[1024+32], DstData[1024+32]; BYTE ProgramKey[SEED_USER_KEY_LEN] = "YoungWooUSBLock"; // ÀÌ ºÎºÐÀº º¯°æµÇ¾îµµ ¹«¹æÇϳª, 16¹ÙÀÌÆ®¸¦ ³ÑÁö ¾Êµµ·ÏÇÑ´Ù. BYTE IVKey[SEED_BLOCK_LEN]; RET_VAL ret; SEED_ALG_INFO AlgInfo; int nAccumNum; // Key Data File¿¡¼­ ƯÁ¤ À§Ä¡ÀÇ Å° µ¥ÀÌÅ͸¦ °¡Á®¿Â´Ù if (LoadFromDataFile(strFileName, nVersion, nIVKeyIndex, IVKey) != nVersion) { return -1; } // ÃʱâÈ­ memset(SrcData, 0x00, sizeof(BYTE)*(1024+32)); memset(DstData, 0x00, sizeof(BYTE)*(1024+32)); nAccumNum = 0; dwEnIndex = 0; SEED_SetAlgInfo(AI_CBC, AI_PKCS_PADDING, IVKey, &AlgInfo); ret = SEED_KeySchedule(ProgramKey, SEED_USER_KEY_LEN, &AlgInfo); ret = SEED_EncInit(&AlgInfo); if (ret != CTR_SUCCESS) return -1; while (true) { if (dwEncLen == 0) break; if (dwEncLen > 1024) { memcpy(SrcData, pEncode+dwEnIndex, sizeof(BYTE)*1024); } else { memcpy(SrcData, pEncode+dwEnIndex, sizeof(BYTE)*dwEncLen); } dwDecLen = 1024; ret = SEED_EncUpdate(&AlgInfo, SrcData, dwEncLen, DstData, &dwDecLen); pSwapData = pAccumData; pAccumData = new BYTE[nAccumNum+dwDecLen]; memcpy(pAccumData, pSwapData, sizeof(BYTE)*nAccumNum); // ±âÁ¸ µ¥ÀÌÅÍ º¹»ç memcpy(pAccumData+sizeof(BYTE)*nAccumNum, DstData, sizeof(BYTE)*dwDecLen); // µ¥ÀÌÅÍ º¹»ç if (pSwapData) { delete []pSwapData; pSwapData = NULL; } nAccumNum += dwDecLen; if (ret != CTR_SUCCESS) { if (pAccumData) { delete []pAccumData; pAccumData = NULL; } return -1; } if (dwEncLen > 1024) { dwEnIndex += 1024; dwEncLen -= 1024; } else { dwEnIndex += dwEncLen; dwEncLen = 0; } } dwDecLen = 1024; ret = SEED_EncFinal(&AlgInfo, DstData, &dwDecLen); if (dwDecLen > 0x100000) { // °ªÀÌ Àß ¸øµÇ¾î 100KB°¡ ³Ñ¾î°¥ °æ¿ì if (*pDecode) { delete [](*pDecode); } if (pAccumData) { delete []pAccumData; pAccumData = NULL; } if (pSwapData) { delete []pSwapData; pSwapData = NULL; } return -1; } else if (dwDecLen > 0) { pSwapData = pAccumData; pAccumData = new BYTE[nAccumNum+dwDecLen]; memcpy(pAccumData, pSwapData, sizeof(BYTE)*nAccumNum); // ±âÁ¸ µ¥ÀÌÅÍ º¹»ç memcpy(pAccumData+sizeof(BYTE)*nAccumNum, DstData, sizeof(BYTE)*dwDecLen); // µ¥ÀÌÅÍ º¹»ç nAccumNum += dwDecLen; } if (*pDecode) { delete [](*pDecode); } *pDecode = new BYTE[nAccumNum]; memcpy(*pDecode, pAccumData, sizeof(BYTE)*nAccumNum); if (pAccumData) { delete []pAccumData; pAccumData = NULL; } if (pSwapData) { delete []pSwapData; pSwapData = NULL; } if (ret != CTR_SUCCESS) return -1; return nAccumNum; // ¿©±â¼­ returnµÇ¾î¾ß ¾Ïȣȭ ¼º°øÇÑ °ÍÀÌ´Ù. } */ //--------------------------------------------------------------------------- int __fastcall TUSBLock::SeedDecode(String strFileName, int nVersion , BYTE *pDecode, DWORD dwDecLen, BYTE **pEncode, unsigned short nIVKeyIndex) { // SEED ¾Ë°í¸®ÁòÀ» ÀÌ¿ëÇÑ º¹È£È­ DWORD dwDeIndex, dwEncLen; BYTE *pAccumData = NULL, *pSwapData = NULL; BYTE SrcData[1024+32], DstData[1024+32]; BYTE ProgramKey[SEED_USER_KEY_LEN]; BYTE IVKey[SEED_BLOCK_LEN]; RET_VAL ret; SEED_ALG_INFO AlgInfo; int nAccumNum; if (LoadFromDataFile(strFileName, nVersion, nIVKeyIndex, IVKey) != nVersion) { return -1; } // ÃʱâÈ­ memset(SrcData, 0x00, sizeof(BYTE)*(1024+32)); memset(DstData, 0x00, sizeof(BYTE)*(1024+32)); nAccumNum = 0; dwDeIndex = 0; SEED_SetAlgInfo(AI_CBC, AI_PKCS_PADDING, IVKey, &AlgInfo); ret = SEED_KeySchedule(ProgramKey, SEED_USER_KEY_LEN, &AlgInfo); ret = SEED_DecInit(&AlgInfo); if (ret != CTR_SUCCESS) return -1; while (true) { if (dwDecLen == 0) break; if (dwDecLen > 1024) { memcpy(SrcData, pDecode+dwDeIndex, sizeof(BYTE)*1024); } else { memcpy(SrcData, pDecode+dwDeIndex, sizeof(BYTE)*dwDecLen); } dwEncLen = 1024; ret = SEED_DecUpdate(&AlgInfo, SrcData, dwDecLen, DstData, &dwEncLen); pSwapData = pAccumData; pAccumData = new BYTE[nAccumNum+dwEncLen]; memcpy(pAccumData, pSwapData, sizeof(BYTE)*nAccumNum); // ±âÁ¸ µ¥ÀÌÅÍ º¹»ç memcpy(pAccumData+sizeof(BYTE)*nAccumNum, DstData, sizeof(BYTE)*dwEncLen); // µ¥ÀÌÅÍ º¹»ç if (pSwapData) { delete []pSwapData; pSwapData = NULL; } nAccumNum += dwEncLen; if (ret != CTR_SUCCESS) { if (pAccumData) { delete []pAccumData; pAccumData = NULL; } } if (dwDecLen > 1024) { dwDecLen -= 1024; dwDeIndex += 1024; } else { dwDeIndex += dwDecLen; dwDecLen = 0; } } dwEncLen = 1024; ret = SEED_DecFinal(&AlgInfo, DstData, &dwEncLen); if (dwEncLen > 0x100000) { // °ªÀÌ Àß ¸øµÇ¾î 100KB°¡ ³Ñ¾î°¥ °æ¿ì if (*pEncode) { delete [](*pEncode); } if (pAccumData) { delete []pAccumData; pAccumData = NULL; } if (pSwapData) { delete []pSwapData; pSwapData = NULL; } return -1; } else if (dwEncLen > 0) { pSwapData = pAccumData; pAccumData = new BYTE[nAccumNum+dwEncLen]; memcpy(pAccumData, pSwapData, sizeof(BYTE)*nAccumNum); // ±âÁ¸ µ¥ÀÌÅÍ º¹»ç memcpy(pAccumData+sizeof(BYTE)*nAccumNum, DstData, sizeof(BYTE)*dwEncLen); // µ¥ÀÌÅÍ º¹»ç if (pSwapData) { delete []pSwapData; pSwapData = NULL; } nAccumNum += dwEncLen; } if (*pEncode) { delete [](*pEncode); } *pEncode = new BYTE[nAccumNum]; memcpy(*pEncode, pAccumData, sizeof(BYTE)*nAccumNum); if (pAccumData) { delete []pAccumData; pAccumData = NULL; } if (pSwapData) { delete []pSwapData; pSwapData = NULL; } if (ret != CTR_SUCCESS) return -1; return nAccumNum; // ¿©±â¼­ returnµÇ¾î¾ß º¹È£È­¿¡ ¼º°øÇÑ °ÍÀÌ´Ù. } //--------------------------------------------------------------------------- /* bool __fastcall TUSBLock::MixEncode(BYTE *pCode, TUSBInformation *usbinfoData) { // Á¶ÇÕ ¾Ïȣȭ // ¼¯´Â ³»¿ëÀº ´ÙÀ½°ú °°´Ù // 1. S : USB DriveÀÇ Serial (Type : DWORD - 4Byte) // 2. A : ÀÎÁõ ½Ã°£ (Type : FILETIME - 8Byte) // 3. E : ÀÎÁõ ¸¸·á ½Ã°£ (Type : FILETIME - 8Byte) // 4. P : Program (Type : unsigned int - 4Byte) // ~A[0] A[5] ~S[2] P[3] E[2] A[7] ~S[1] E[7] ~S[0] A[3] P[0] E[5] // ~A[1] S[3] E[0] A[4] ~P[2] ~A[2] ~A[6] ~E[3] ~P[1] ~E[1] ~E[6] E[4] bool bReturn = false; FILETIME ftAuthorizationTime, ftExpireTime; BYTE pDrvSerial[4], pAuthorizationTime[8], pExpireTime[8], pProgram[4]; try { if (pCode) { memcpy(pDrvSerial, &(usbinfoData->Serial), sizeof(DWORD)); ftAuthorizationTime = usbinfoData->GetAuthorizationTimeToFileTime(); ftExpireTime = usbinfoData->GetExpireTimeToFileTime(); memcpy(pAuthorizationTime, &ftAuthorizationTime, sizeof(FILETIME)); memcpy(pExpireTime, &ftExpireTime, sizeof(FILETIME)); memcpy(pProgram, &(usbinfoData->Program), sizeof(unsigned int)); pCode[0] = ~pAuthorizationTime[0]; pCode[1] = pAuthorizationTime[5]; pCode[2] = ~pDrvSerial[2]; pCode[3] = pProgram[3]; pCode[4] = pExpireTime[2]; pCode[5] = pAuthorizationTime[7]; pCode[6] = ~pDrvSerial[1]; pCode[7] = pExpireTime[7]; pCode[8] = ~pDrvSerial[0]; pCode[9] = pAuthorizationTime[3]; pCode[10] = pProgram[0]; pCode[11] = pExpireTime[5]; pCode[12] = ~pAuthorizationTime[1]; pCode[13] = pDrvSerial[3]; pCode[14] = pExpireTime[0]; pCode[15] = pAuthorizationTime[4]; pCode[16] = ~pProgram[2]; pCode[17] = ~pAuthorizationTime[2]; pCode[18] = ~pAuthorizationTime[6]; pCode[19] = ~pExpireTime[3]; pCode[20] = ~pProgram[1]; pCode[21] = ~pExpireTime[1]; pCode[22] = ~pExpireTime[6]; pCode[23] = pExpireTime[4]; bReturn = true; } } catch (...) { return false; } return bReturn; } */ //--------------------------------------------------------------------------- bool __fastcall TUSBLock::MixDecode(BYTE *pCode, TUSBInformation *usbinfoData) { // Á¶ÇÕ º¹È£È­ // ¼¯´Â ³»¿ëÀº ´ÙÀ½°ú °°´Ù // 1. S : USB DriveÀÇ Serial (Type : DWORD - 4Byte) // 2. A : ÀÎÁõ ½Ã°£ (Type : FILETIME - 8Byte) // 3. E : ÀÎÁõ ¸¸·á ½Ã°£ (Type : FILETIME - 8Byte) // 4. P : Program (Type : unsigned int - 4Byte) // ~A[0] A[5] ~S[2] P[3] E[2] A[7] ~S[1] E[7] ~S[0] A[3] P[0] E[5] // ~A[1] S[3] E[0] A[4] ~P[2] ~A[2] ~A[6] ~E[3] ~P[1] ~E[1] ~E[6] E[4] bool bReturn = false; FILETIME ftAuthorizationTime, ftExpireTime; BYTE pDrvSerial[4], pAuthorizationTime[8], pExpireTime[8], pProgram[4]; try { if (pCode) { pAuthorizationTime[0] = ~pCode[0]; pAuthorizationTime[5] = pCode[1]; pDrvSerial[2] = ~pCode[2]; pProgram[3] = pCode[3]; pExpireTime[2] = pCode[4]; pAuthorizationTime[7] = pCode[5]; pDrvSerial[1] = ~pCode[6]; pExpireTime[7] = pCode[7]; pDrvSerial[0] = ~pCode[8]; pAuthorizationTime[3] = pCode[9]; pProgram[0] = pCode[10]; pExpireTime[5] = pCode[11]; pAuthorizationTime[1] = ~pCode[12]; pDrvSerial[3] = pCode[13]; pExpireTime[0] = pCode[14]; pAuthorizationTime[4] = pCode[15]; pProgram[2] = ~pCode[16]; pAuthorizationTime[2] = ~pCode[17]; pAuthorizationTime[6] = ~pCode[18]; pExpireTime[3] = ~pCode[19]; pProgram[1] = ~pCode[20]; pExpireTime[1] = ~pCode[21]; pExpireTime[6] = ~pCode[22]; pExpireTime[4] = pCode[23]; memcpy(&(usbinfoData->Serial), pDrvSerial, sizeof(DWORD)); memcpy(&ftAuthorizationTime, pAuthorizationTime, sizeof(FILETIME)); memcpy(&ftExpireTime, pExpireTime, sizeof(FILETIME)); memcpy(&(usbinfoData->Program), pProgram, sizeof(unsigned int)); usbinfoData->SetAuthorizationTimeFromFileTime(ftAuthorizationTime); usbinfoData->SetExpireTimeFromFileTime(ftExpireTime); bReturn = true; } } catch (...) { return false; } return bReturn; } //--------------------------------------------------------------------------- int __fastcall TUSBLock::LoadFromDataFile(String strFileName, int nVersion, unsigned short nIVKeyIndex, BYTE *pIVKey) { // Key Data FileÀÇ Æ¯Á¤ À§Ä¡ÀÇ Å° µ¥ÀÌÅ͸¦ ·ÎµåÇÑ´Ù (IVKey) HANDLE hFile = NULL; DWORD dwRead; int nFileVersion; // óÀ½ ½ÃÀÛ ¹öÀüÀº 100 // Àбâ Àü¿ëÀ¸·Î¸¸ ÀÐÀ¸¸ç, Àбâ Àü¿ëÀÌ°í ¼û°ÜÁø ÆÄÀϵµ ÀÐÀ» ¼ö ÀÖµµ·Ï ÇÑ´Ù. if ((hFile = CreateFile(strFileName.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING , FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_FLAG_WRITE_THROUGH, NULL)) == INVALID_HANDLE_VALUE) { goto fail; } // Version Check if (!ReadFile(hFile, &nFileVersion, sizeof(int), &dwRead, NULL)) goto fail; if (nFileVersion == nVersion) { if (SetFilePointer(hFile, nIVKeyIndex+sizeof(int), NULL, FILE_BEGIN)== 0xFFFFFFFF) goto fail; // sizeof(int)¸¦ ´õÇÏ´Â ÀÌÀ¯´Â nFileVersion ¶§¹® if (!ReadFile(hFile, pIVKey, sizeof(BYTE)*SEED_BLOCK_LEN, &dwRead, NULL)) goto fail; // IVKey } if (hFile) CloseHandle(hFile); hFile = NULL; return nFileVersion; fail: if (hFile) CloseHandle(hFile); hFile = NULL; return nFileVersion; } //--------------------------------------------------------------------------- /* int __fastcall TUSBLock::SaveToDataFile(AnsiString strFileName, int nVersion) { // Key Data¸¦ »ý¼º ÈÄ ÆÄÀÏ·Î ÀúÀåÇÑ´Ù HANDLE hFile = NULL; DWORD dwWrite; BYTE KeyData[SEED_BLOCK_LEN]; // Ç×»ó »õ·Î¸¸µé¸ç, ¼û±è ÆÄÀÏ·Î ¸¸µç´Ù if ((hFile = CreateFile(strFileName.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS , FILE_ATTRIBUTE_HIDDEN | FILE_FLAG_WRITE_THROUGH, NULL)) == INVALID_HANDLE_VALUE) { goto fail; } if (!WriteFile(hFile, &nVersion, sizeof(int), &dwWrite, NULL)) goto fail; // Key ÆÄÀÏ ¹öÀü randomize(); // ·£´ý for (int i = 0; i < 4096; i++) { memset(KeyData, 0, sizeof(BYTE)*SEED_BLOCK_LEN); for (int j = 0; j < SEED_BLOCK_LEN; j++) { KeyData[j] = (BYTE)random(255); // ·£´ý°ª »ý¼º } if (!WriteFile(hFile, KeyData, sizeof(BYTE)*SEED_BLOCK_LEN, &dwWrite, NULL)) goto fail; // 65536°³ÀÇ Key¸¦ ÀúÀåÇÑ´Ù } if (hFile) CloseHandle(hFile); hFile = NULL; return true; fail: if (hFile) CloseHandle(hFile); hFile = NULL; return false; } */ //--------------------------------------------------------------------------- int __fastcall TUSBLock::LoadFromKeyFile(String strUSBRoot, TUSBInformation *usbinfoData) { // USB·ÎºÎÅÍ Key ÆÄÀÏ ·Îµå ÈÄ º¹È£È­ÇÏ¿© USB Á¤º¸¸¦ ¾ò´Â´Ù String strKeyFileName, strDataFileName; HANDLE hFile = NULL; DWORD dwRead; int nVersion = 0, nDataSize = 0; unsigned short nKeyFileIndex = 0; BYTE *pEncodedData = NULL, *pData = NULL; strDataFileName = strUSBRoot + "\\USB.dat"; // USB¿¡ ÀÖ´Â Key Data ÆÄÀÏ strKeyFileName = strUSBRoot + "\\USB.key"; // USB¿¡ ÀÖ´Â ¾ÏȣȭµÈ Key ÆÄÀÏ if (FileExists(strKeyFileName) && FileExists(strDataFileName)) { // µÎ °³ ÆÄÀÏÀÌ ¸ðµÎ Á¸ÀçÇÏ´ÂÁö È®ÀÎ // "USB.key" ÆÄÀÏÀ» Àбâ Àü¿ëÀ¸·Î¸¸ ÀÐÀ¸¸ç, Àбâ Àü¿ëÀÌ°í ¼û°ÜÁø ÆÄÀϵµ ÀÐÀ» ¼ö ÀÖµµ·Ï ÇÑ´Ù if ((hFile = CreateFile(strKeyFileName.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING , FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_FLAG_WRITE_THROUGH, NULL)) == INVALID_HANDLE_VALUE) goto fail; // °¢Á¾ Key µ¥ÀÌÅÍ ·Îµå if (!ReadFile(hFile, &nVersion, sizeof(int), &dwRead, NULL)) goto fail; // Version if (!ReadFile(hFile, &nKeyFileIndex, sizeof(unsigned short), &dwRead, NULL)) goto fail; // Key Data File Index if (!ReadFile(hFile, &nDataSize, sizeof(int), &dwRead, NULL)) goto fail; // Data Size pEncodedData = new BYTE[nDataSize]; // º¹È£È­µÉ Å©±â ¸¸Å­ if (!ReadFile(hFile, pEncodedData, sizeof(BYTE)*nDataSize, &dwRead, NULL)) goto fail; // Data Read pData = new BYTE[BLOCK_DATA_SIZE]; if (SeedDecode(strDataFileName, nVersion, pEncodedData, nDataSize, &pData, nKeyFileIndex) < 0) goto fail; // Seed º¹È£È­ if (MixDecode(pData, usbinfoData) == false) goto fail; // Mix º¹È£È­ // üũ ½Ã°£ if (!ReadFile(hFile, &usbinfoData->CheckTime, sizeof(SYSTEMTIME), &dwRead, NULL)) goto fail; // Check Time Read // º¹È£È­ ¿Ï·á usbinfoData->Lock = true; usbinfoData->KeyVersion = nVersion; if (hFile) CloseHandle(hFile); } else { goto fail; } if (pEncodedData) delete []pEncodedData; if (pData) delete []pData; pEncodedData = NULL; pData = NULL; hFile = NULL; return nVersion; fail: memset(usbinfoData, 0, sizeof(TUSBInformation)); if (hFile) CloseHandle(hFile); if (pEncodedData) delete []pEncodedData; if (pData) delete []pData; pEncodedData = NULL; pData = NULL; hFile = NULL; return nVersion; } //--------------------------------------------------------------------------- bool __fastcall TUSBLock::SaveCheckTimeToKeyFile(String strUSBRoot) { // ProgramÀÇ ¸¶Áö¸· ½ÇÇà ½Ã°£À» ±â·ÏÇÑ´Ù String strKeyFileName; HANDLE hFile = NULL; DWORD dwRead = 0, dwWrite = 0; int nDataSize = 0; SYSTEMTIME stCurrent; strKeyFileName = strUSBRoot + "\\USB.key"; // USB¿¡ ÀÖ´Â ¾ÏȣȭµÈ Key ÆÄÀÏ if (FileExists(strKeyFileName)) { // µÎ °³ ÆÄÀÏÀÌ ¸ðµÎ Á¸ÀçÇÏ´ÂÁö È®ÀÎ // "USB.key" ÆÄÀÏÀ» Àбâ/¾²±â·Î ÀÐÀ¸¸ç, Àбâ Àü¿ëÀÌ°í ¼û°ÜÁø ÆÄÀϵµ ÀÐÀ» ¼ö ÀÖµµ·Ï ÇÑ´Ù if ((hFile = CreateFile(strKeyFileName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING , FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_FLAG_WRITE_THROUGH, NULL)) == INVALID_HANDLE_VALUE) goto fail; // °¢Á¾ Key µ¥ÀÌÅÍ ·Îµå // nVersion, nKeyFileIndex ¸¸Å­ °Ç³Ê ¶ê SetFilePointer(hFile, sizeof(int)+sizeof(unsigned short), 0, FILE_BEGIN); if (!ReadFile(hFile, &nDataSize, sizeof(int), &dwRead, NULL)) goto fail; // Data Size SetFilePointer(hFile, nDataSize, 0, FILE_CURRENT); GetSystemTime(&stCurrent); // ÇöÀç ½Ã°£ if (!WriteFile(hFile, &stCurrent, sizeof(SYSTEMTIME), &dwWrite, NULL)) goto fail; // Check Time Write if (hFile) CloseHandle(hFile); } hFile = NULL; return true; fail: if (hFile) CloseHandle(hFile); hFile = NULL; return false; } //--------------------------------------------------------------------------- /* bool __fastcall TUSBLock::SaveToKeyFile(AnsiString strProgramRoot, AnsiString strUSBRootName, TUSBInformation *usbinfoData) { // USBÀÇ Á¤º¸¸¦ ¾ÏȣȭÇÏ¿© Key ÆÄÀÏÀ» ÀúÀåÇϰí, Key Data ÆÄÀϵµ ÀúÀåÇÑ´Ù AnsiString strDrv, strKeyFileName, strDataFileName; HANDLE hFile = NULL; DWORD dwWrite; int nDataSize = 0; unsigned short nKeyFileIndex = 0; char pDrvRoot[4] = "C:\\"; BYTE *pEncodedData = NULL, *pData = NULL; // USB Serial Number strDrv = strUSBRootName + "\\"; strncpy(pDrvRoot, strDrv.c_str(), 1); GetVolumeInformation(pDrvRoot, NULL, NULL, &(usbinfoData->Serial), NULL, NULL, NULL, 0); strDataFileName = strProgramRoot + "\\KeyData\\" + IntToStr(usbinfoData->KeyVersion) + ".dat"; // Key Data ÆÄÀÏ strKeyFileName = strUSBRootName + "\\USB.key"; // USB¿¡ ÀÖ´Â ¾ÏȣȭÇÏ¿© ÀúÀåÇÒ Key ÆÄÀÏ if (FileExists(strDataFileName)) { // Key Data ÆÄÀÏÀÌ Á¸ÀçÇÒ °æ¿ì¸¸ ¸¸µç´Ù // Ç×»ó »õ·Î¸¸µé¸ç, ¼û±è ÆÄÀÏ·Î ¸¸µç´Ù if ((hFile = CreateFile(strKeyFileName.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS , FILE_ATTRIBUTE_HIDDEN | FILE_FLAG_WRITE_THROUGH, NULL)) == INVALID_HANDLE_VALUE) goto fail; // Version Check if (!WriteFile(hFile, &(usbinfoData->KeyVersion), sizeof(int), &dwWrite, NULL)) goto fail; // Version randomize(); // ·£´ý nKeyFileIndex = (unsigned short)random(0xFFFF-SEED_BLOCK_LEN-sizeof(int)); // Key File Index pData = new BYTE[BLOCK_DATA_SIZE]; if (MixEncode(pData, usbinfoData) == false) goto fail; // Mix ¾Ïȣȭ nDataSize = SeedEncode(strDataFileName, usbinfoData->KeyVersion, pData, BLOCK_DATA_SIZE, &pEncodedData, nKeyFileIndex); // Seed ¾Ïȣȭ if (nDataSize < 0) goto fail; if (!WriteFile(hFile, &nKeyFileIndex, sizeof(unsigned short), &dwWrite, NULL)) goto fail; // Key Data File Index if (!WriteFile(hFile, &nDataSize, sizeof(int), &dwWrite, NULL)) goto fail; // Data Size if (!WriteFile(hFile, pEncodedData, sizeof(BYTE)*nDataSize, &dwWrite, NULL)) goto fail; // Data Write usbinfoData->Lock = true; // USB·Î Key Data ÆÄÀÏ º¹»ç (±âÁ¸ ÆÄÀÏ Á¸Àç ½Ã µ¤¾î¾²±â) if (CopyFile(strDataFileName.c_str(), AnsiString(strUSBRootName + "\\USB.dat").c_str(), FALSE) == FALSE) goto fail; if (hFile) CloseHandle(hFile); } if (pEncodedData) delete []pEncodedData; if (pData) delete []pData; pEncodedData = NULL; pData = NULL; hFile = NULL; return true; fail: if (hFile) CloseHandle(hFile); if (pEncodedData) delete []pEncodedData; if (pData) delete []pData; pEncodedData = NULL; pData = NULL; hFile = NULL; return false; } */ //--------------------------------------------------------------------------- /* DWORD __fastcall TUSBLock::CheckUSB(AnsiString strUSBRoot, TUSBInformation *usbinfoData) { // USB Á¤º¸ Á¶»ç AnsiString strDrv; char pDrvRoot[4] = "C:\\"; DWORD dwSerial = 0; strDrv = ExtractFileDrive(strUSBRoot); strncpy(pDrvRoot, strDrv.c_str(), 1); if (GetDriveType(pDrvRoot) == DRIVE_REMOVABLE) { // À̵¿½Ä ÀúÀå µð½ºÅ©ÀÎÁö Á¶»ç GetVolumeInformation(pDrvRoot, NULL, NULL, &dwSerial, NULL, NULL, NULL, 0); // USB Serial Number LoadFromKeyFile(strDrv, usbinfoData); // USB·ÎºÎÅÍ Key ÆÄÀÏ ·Îµå ÈÄ º¹È£È­ÇÏ¿© USB Á¤º¸¸¦ ¾ò´Â´Ù } return dwSerial; fail: memset(usbinfoData, 0, sizeof(TUSBInformation)); return 0; } */ //--------------------------------------------------------------------------- bool __fastcall TUSBLock::Check(String strUSBRoot, int nProgram, bool bClear) { // »ç¿ëÇÑ °¡´ÉÇÑ ÀÎÁõ »óÅÂÀÎÁö üũ String strDrv, strFileName; TUSBInformation *usbinfoData = NULL; Char pDrvRoot[4] = L"C:\\"; DWORD dwSerial = 0; SYSTEMTIME stNow; TDateTime dtNow; bool bReturn = false; strDrv = ExtractFileDrive(strUSBRoot); _tcsncpy(pDrvRoot, strDrv.c_str(), 1); if (DirectoryExists(strDrv) && GetDriveType(pDrvRoot) == DRIVE_REMOVABLE) { // À̵¿½Ä ÀúÀå µð½ºÅ©ÀÎÁö Á¶»ç GetVolumeInformation(pDrvRoot, NULL, NULL, &dwSerial, NULL, NULL, NULL, 0); // USB Serial Number usbinfoData = new TUSBInformation; if (LoadFromKeyFile(strDrv, usbinfoData)) { // USB·ÎºÎÅÍ Key ÆÄÀÏ ·Îµå ÈÄ º¹È£È­ÇÏ¿© USB Á¤º¸¸¦ ¾ò´Â´Ù // LocalTimeÀÌ ¾Æ´Ñ Ç¥Áؽø¦ ±¸Çϱâ À§ÇØ TDateTime::Now()°¡ ¾Æ´Ñ GetSystemTime()À» »ç¿ëÇÏ¿´´Ù GetSystemTime(&stNow); dtNow = SystemTimeToDateTime(stNow); // USB DriveÀÇ Serial Number°¡ °°ÀºÁö ºñ±³Çϰí, ÇÁ·Î±×·¥ÀÌ Æ÷ÇԵǾîÀÖ´ÂÁö ºñ±³Çϸç // ÀÎÁõÀÏÀÚ ÀÌÈÄÀÌ°í ¸¸·á ±â°£ ÀÌÀüÀÎÁö üũÇÑ´Ù. if (dwSerial == usbinfoData->Serial && (usbinfoData->Program & nProgram) > 0 && CompareDateTime(dtNow, usbinfoData->GetAuthorizationTimeToDateTime()) >= 0 && CompareDateTime(usbinfoData->GetExpireTimeToDateTime(), dtNow) >= 0 && CompareDateTime(dtNow, usbinfoData->GetCheckTimeToDateTime()) >= 0) { bReturn = true; } } } if (!bReturn && bClear) { // ÀÎÁõ Á¶°ÇÀÌ ¸ÂÁö ¾Ê¾Æ »èÁ¦ÇØ¾ß ÇÏ´Â °æ¿ì strFileName = strDrv + "\\USB.dat"; if (FileExists(strFileName.c_str())){ DeleteFile(strFileName.c_str()); } strFileName = strDrv + "\\USB.key"; if (FileExists(strFileName.c_str())){ DeleteFile(strFileName.c_str()); } } else { SaveCheckTimeToKeyFile(strUSBRoot); // ÇöÀç ½ÇÇà ½Ã°£À» ±â·Ï } if (usbinfoData) delete usbinfoData; usbinfoData = NULL; return bReturn; } //---------------------------------------------------------------------------