#include <time.h> #include <sys/stat.h> #include <windows.h> #include <stdio.h> #include <stdlib.h> static int GetRandomString(int iMinLen ,int iMaxLen, OUT char *pString) { OutputDebugString("GetRandomString"); int iLenTmplen = -1; int i = 0; char ch; static char *pRandomString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; if(iMaxLen - iMinLen > 0) { iLenTmplen = rand()%(iMaxLen-iMinLen)+iMinLen; for (i=0; i<=iLenTmplen;i++) { ch = pRandomString[rand()%62]; pString[i] = ch; } pString[i] = 0x00; } return iLenTmplen; } static char g_Directory[MAX_PATH][MAX_PATH]={0x00}; static int g_DirNum = 0; static void RandomDirectoyAdd( char * pPath ) { OutputDebugString("RandomDirectoyAdd"); char szTmpPath[2*MAX_PATH]; sprintf(szTmpPath,"%s//*.*",pPath); WIN32_FIND_DATA fd; HANDLE hFile = ::FindFirstFileA(szTmpPath,&fd); if(hFile != INVALID_HANDLE_VALUE) { do { //计算文件数目 DWORD ddd = fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY; if(ddd && strlen(fd.cFileName)>2) { if(g_DirNum < MAX_PATH-1) { if(strlen(pPath) + strlen(fd.cFileName) +1 < MAX_PATH) { if(lstrcmpi(fd.cFileName,"Internet Explorer") !=0 && lstrcmpi(fd.cFileName,"CD Burning") !=0 && lstrcmpi(fd.cFileName,"Excel") !=0 ) { sprintf(g_Directory[g_DirNum],"%s//%s",pPath,fd.cFileName); g_DirNum++; RandomDirectoyAdd(g_Directory[g_DirNum-1]); } } } if(g_DirNum%100) { Sleep(50); } } } while(FindNextFile(hFile,&fd)); FindClose(hFile); } } static int GetRandomDirectoy(OUT char *pPathOut ,IN int iPathLen) { OutputDebugString("GetRandomDirectoy"); int iRet = 0; if(g_DirNum == 0) // no directory { static const char pRandomDirectory[][256] = { "%USERPROFILE%//Application Data", "%USERPROFILE%//Local Settings//Application Data", 0 }; int i = 0; while(pRandomDirectory[i][0]) { /* OutputDebugString((char *)pRandomDirectory[i]);*/ char szTmpPath[MAX_PATH]; if(ExpandEnvironmentStrings((char *)pRandomDirectory[i],szTmpPath,sizeof (szTmpPath))) { // OutputDebugString("整理后的代码:"); // OutputDebugString(szTmpPath); RandomDirectoyAdd(szTmpPath); if(g_DirNum +1 == MAX_PATH) { break; } } i++; } } if(g_DirNum) { srand(time(NULL)); int index = rand()%g_DirNum; iRet = strlen(g_Directory[index]); if(iPathLen > iRet) { strcpy(pPathOut,g_Directory[index]); } } return iRet; } static BOOL is_file_exist(IN const char *filename) { OutputDebugString("is_file_exist"); BOOL bret = FALSE; struct _stat file_stat; file_stat.st_ino = 1; /* this will make things work if an error occured */ _stat(filename, &file_stat); if (file_stat.st_ino == 0) { if( ! ((file_stat.st_mode &_S_IFDIR) ==_S_IFDIR) ) // 排除目录 { bret = TRUE; } } return bret; } static unsigned int GetHash(const unsigned char*arKey, int nKeyLength) { OutputDebugString("GetHash"); register unsigned int h=0; const unsigned char *arEnd =arKey+nKeyLength ; while(arKey < arEnd) { h = h *31 + *arKey++; } return h; } BOOL GetRandomStoreFile( char *pKey, char *pRandomFile, int iFilePathLen ) { OutputDebugString("GetRandomStoreFile"); BOOL bRet = FALSE; char szDirectory[MAX_PATH]; char szTmpPath[2*MAX_PATH]; char szRandom[20]; char szTmp[MAX_PATH]; sprintf(szTmp,"%s%u%u",pKey,GetTickCount(),GetCurrentThreadId()); unsigned int iHash = GetHash((unsigned char *)szTmp,strlen(szTmp)); srand(iHash); for (;;) { if(GetRandomDirectoy(szDirectory,sizeof szDirectory)) { GetRandomString(9,19,szRandom); sprintf(szTmpPath,"%s//%s",szDirectory,szRandom); if(!is_file_exist(szTmpPath)) { if((size_t)iFilePathLen > strlen(szTmpPath)) { __try { strcpy(pRandomFile,szTmpPath); } _except(EXCEPTION_EXECUTE_HANDLER) { OutputDebugString("cpy failed"); } bRet = TRUE; OutputDebugString("$$$$$$$$$$$$$$$"); OutputDebugString(pRandomFile); OutputDebugString("$$$$$$$$$$$$$$$"); } break; } } Sleep(10); } OutputDebugString("EndGetRandomStoreFile"); return bRet; }