//--------------------------------------------------------------------------- #include #pragma hdrstop #include "WebActivationLog.h" #include "seedx.h" #include "common.h" #include "Define.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- __fastcall ActvLog::ActvLog(TApplication *App) { DWORD VolSerial; Application = App; FileName = AppDataBin + "\\" + LOGFILE_NAME; // get MAC address MACaddress = GetMACaddress(); // [ SEED enc/dec ] // set UserKey & get RoundKey BYTE pbUserKey[32] = {'T', 'e', 'x', 'p', 'i', 'a', 'Y', 'W', '2', '0', '1', '0', 'p', 's', 'h', 0}; SeedEncRoundKey(_pdwRoundKey, pbUserKey); } //--------------------------------------------------------------------------- __fastcall ActvLog::~ActvLog() { } //--------------------------------------------------------------------------- bool __fastcall ActvLog::CheckLog() { if (!_tcscmp(MACaddress.c_str(), _T("000000000000"))) return false; hFile = CreateFile(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_HIDDEN, NULL); // ·Î±× ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾Ê°Å³ª ·Î±× µ¥ÀÌÅͰ¡ ¾øÀ» ¶§ false¸¦ return. if (hFile == INVALID_HANDLE_VALUE) return false; else if (GetFileSize(hFile, NULL) < 32) { CloseHandle(hFile); hFile = NULL; return false; } else { CloseHandle(hFile); hFile = NULL; } LogData * lastlog = ReadLastLog(); String strRTime = lastlog->rtime; free(lastlog); int rtime = strRTime.ToInt(); if (rtime <= 0) return false; else return true; } //--------------------------------------------------------------------------- void __fastcall ActvLog::AddLog(int RTime) { DWORD dwBytesWritten = 0; SYSTEMTIME LocalTime; String Year, Month, Day, Hour, Min, Sec; String strLocalTime; String strRTime; String LData; String strPrgInfo; BYTE pbData[16] = {0}; hFile = CreateFile(FileName.c_str(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL); // Off-line »óÅ¿¡¼­, ·Î±× µ¥ÀÌÅͰ¡ Á¶À۵Ǿú°Å³ª ¼Õ»óµÇ¾úÀ» ¶§ // ( ´ÜÀ§ ·Î±× µ¥ÀÌÅÍ Å©±âÀÇ ¹è¼ö°¡ ¾Æ´Ò ¶§ ) ÀÇ ¿¡·¯ ó¸® if (GetCompressedFileSize(FileName.c_str(), NULL) % 32 != 0) { Application->MessageBox(_T("ÇÁ·Î±×·¥À» ´Ù½Ã ½ÇÇàÇϽʽÿÀ."), _T("ERROR"), MB_OK); DeleteLog(); // ·Î±× ³¯·Á¹ö¸®¹Ç·Î ÀçÀÎÁõ ÇÊ¿ä Application->Terminate(); } SetFilePointer(hFile, 0, NULL, FILE_END); // ·Î±× µ¥ÀÌÅÍ Çü½Ä // MACaddress(8) + LocalTime(12) + RemainTime(9) + Program&Version(3) // ex) DC78F15A 110408142830 000007200 012 (blank ¾øÀ½) GetLocalTime(&LocalTime); Year.sprintf(_T("%02d"), (int)LocalTime.wYear % 100); Month.sprintf(_T("%02d"), (int)LocalTime.wMonth); Day.sprintf(_T("%02d"), (int)LocalTime.wDay); Hour.sprintf(_T("%02d"), (int)LocalTime.wHour); Min.sprintf(_T("%02d"), (int)LocalTime.wMinute); Sec.sprintf(_T("%02d"), (int)LocalTime.wSecond); strLocalTime = Year + Month + Day + Hour + Min + Sec; strRTime.sprintf(_T("%09d"), RTime); strPrgInfo = PRG_VSN; LData = MACaddress.SubString(1, 8) + strLocalTime + strRTime + strPrgInfo; AnsiString AnsiData = LData; memcpy(pbData, AnsiData.SubString(1, 16).c_str(), 16); SeedEncrypt(pbData, _pdwRoundKey); WriteFile(hFile, pbData, 16, &dwBytesWritten, NULL); memcpy(pbData, AnsiData.SubString(17, 16).c_str(), 16); SeedEncrypt(pbData, _pdwRoundKey); WriteFile(hFile, pbData, 16, &dwBytesWritten, NULL); CloseHandle(hFile); } //--------------------------------------------------------------------------- void __fastcall ActvLog::AddLog() // Overloading { int useTime_sec; // (On-line »óÅ¿¡¼­) server·ÎºÎÅÍ RemainTime ¹Þ¾Æ ·Î±× ±â·ÏÇÔ. useTime_sec = checkRemainTime(Application); AddLog(useTime_sec); } //--------------------------------------------------------------------------- void __fastcall ActvLog::FlushLog() { LogData *walker; bool isValid; TIdHTTP *IdHTTP = new TIdHTTP(Application); TIdMultiPartFormDataStream* pData = NULL; String response; pData = new TIdMultiPartFormDataStream(); // ·Î±× ÆÄÀÏ¿¡ ÀúÀåµÈ ¸ðµç µ¥ÀÌÅ͵éÀ» ÇÑ ´ÜÀ§¾¿ server·Î º¸³¿. int i = 0; while ((walker = ReadLog(i, &isValid)) != NULL) { pData->AddFormField("hddserial", MACaddress); pData->AddFormField("program", walker->program); pData->AddFormField("ltime", walker->ltime); pData->AddFormField("rtime", walker->rtime); response = IdHTTP->Post(ADDRESS_LOGFLUSH, pData); if (response == "SUCCESS") { DeleteLine(i); } else { i++; } if (!isValid) break; else free(walker); } // ·Î±× µ¥ÀÌÅÍ Áß¿¡¼­ MACaddress³ª Program&VersionÀÇ ºÒÀÏÄ¡ ¹ß°ß ½Ã ¿¡·¯ ó¸®. if (walker && !isValid) { Application->MessageBox(_T("ÇÁ·Î±×·¥À» ´Ù½Ã ½ÇÇàÇϽʽÿÀ."), _T("LOG_ERROR"), MB_OK); DeleteLog(); // ·Î±× ³¯·Á¹ö¸®¹Ç·Î ¿ÀÇÁ¶óÀÎÀÏ ¶§¿¡´Â ÀçÀÎÁõ ÇÊ¿ä free(walker); walker = NULL; Application->Terminate(); } if (walker) { free(walker); walker = NULL; } delete pData; pData = NULL; delete IdHTTP; } //--------------------------------------------------------------------------- void __fastcall ActvLog::DeleteLog() { // ·Î±× ÆÄÀÏÀº ³²±âµÇ µ¥ÀÌÅÍ´Â ¸ðµÎ »èÁ¦ hFile = CreateFile(FileName.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL); SetFileValidData(hFile, 0); SetEndOfFile(hFile); CloseHandle(hFile); } //--------------------------------------------------------------------------- void __fastcall ActvLog::DeleteLine(int Index) { // (Index)¹ø ° ·Î±× µ¥ÀÌÅÍ Çϳª(32Byte)¸¦ »èÁ¦ DWORD origin_size; DWORD following_size; BYTE *buffer; DWORD dwBytesRead = 0; DWORD dwBytesWritten = 0; hFile = CreateFile(FileName.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL); origin_size = GetFileSize(hFile, NULL); following_size = origin_size - ((Index + 1) * 32); buffer = (BYTE *)malloc(following_size); SetFilePointer(hFile, (Index + 1) * 32, NULL, FILE_BEGIN); ReadFile(hFile, buffer, following_size, &dwBytesRead, NULL); SetFilePointer(hFile, Index * 32, NULL, FILE_BEGIN); WriteFile(hFile, buffer, following_size, &dwBytesWritten, NULL); SetFileValidData(hFile, origin_size - 32); SetEndOfFile(hFile); free(buffer); CloseHandle(hFile); } //--------------------------------------------------------------------------- LogData* ActvLog::ReadLog(int Index, bool *isValid) { // (Index)¹ø ° ·Î±× µ¥ÀÌÅ͸¦ Àо¾î µ¥ÀÌÅÍ ±¸Á¶Ã¼¸¦ »ý¼º // »ý¼ºµÈ ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ return / µ¥ÀÌÅ͸¦ ÀÐÁö ¸øÇßÀ» ¶§´Â NULL return // MACaddress Program&VersionÀÌ ÀÏÄ¡ÇÏ´Â Áö¸¦ isValid °ªÀ¸·Î out DWORD dwBytesRead1 = 0, dwBytesRead2 = 0; BYTE pbData1[16] = {0}; BYTE pbData2[16] = {0}; char LData[64]; LogData *aLog = NULL; hFile = CreateFile(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL); SetFilePointer(hFile, Index * 32, NULL, FILE_BEGIN); ReadFile(hFile, pbData1, 16, &dwBytesRead1, NULL); ReadFile(hFile, pbData2, 16, &dwBytesRead2, NULL); CloseHandle(hFile); if (dwBytesRead1 + dwBytesRead2 < 32) return NULL; SeedDecrypt(pbData1, _pdwRoundKey); SeedDecrypt(pbData2, _pdwRoundKey); memcpy(LData, pbData1, 16); memcpy(LData + 16, pbData2, 16); LData[32] = '\0'; aLog = (LogData*)malloc(sizeof(LogData)); memcpy(aLog->macaddress, LData, 8); aLog->macaddress[8] = '\0'; memcpy(aLog->ltime, LData + 8, 12); aLog->ltime[12] = '\0'; memcpy(aLog->rtime, LData + 20, 9); aLog->rtime[9] = '\0'; memcpy(aLog->program, LData + 29, 3); aLog->program[3] = '\0'; AnsiString tt = MACaddress.SubString(1, 8); if (!strcmp(aLog->program, PRG_VSN) && !strcmp(aLog->macaddress, tt.c_str())) *isValid = true; else *isValid = false; return aLog; } //--------------------------------------------------------------------------- LogData* ActvLog::ReadLastLog() { // °¡Àå ÃÖ±Ù¿¡ ±â·ÏµÈ ·Î±× µ¥ÀÌÅ͸¦ Àо. int filesize, nNumberOfLogs; bool isValid; filesize = GetCompressedFileSize(FileName.c_str(), NULL); if ( filesize < 32 || filesize % 32 != 0 ) return NULL; nNumberOfLogs = filesize / 32; return ReadLog(nNumberOfLogs - 1, &isValid); } //---------------------------------------------------------------------------