reman3/Rayman_X/cpa/tempgrp/AI/AIBase/Protections.cxx

467 lines
16 KiB
C++

//#include <Windows.h>
/*
INFORMATINOS SUR LES LECTEURS
*/
/* Renvoie le numero de serie crypte du lecteur passe en parametre */
#define M_SNCryptKey 13
#define M_CDSerialNumberWanted (long)((long)2183834492*(long)M_SNCryptKey)
long fn_lVolumeSerialNumber(char *_szFileName, tdstLoaderHandler *stHandler)
{
BY_HANDLE_FILE_INFORMATION stBHFI;
HANDLE hFile;
UINT uiMode;
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
hFile = stHandler->CreateFile(_szFileName, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
stHandler->SetErrorMode(uiMode);
if (hFile != INVALID_HANDLE_VALUE)
{
if (stHandler->GetFileInformationByHandle(hFile, &stBHFI))
{
stHandler->CloseHandle (hFile);
return (stBHFI.dwVolumeSerialNumber * M_SNCryptKey);
}
stHandler->CloseHandle (hFile);
}
return (long)2832043;
}
/* Renvoie le typde du lecteur passe en parametre */
#define M_CDDriveTypeWanted DRIVE_CDROM
long fn_lDriveType(char *_szFileName, tdstLoaderHandler *stHandler)
{
UINT uiMode;
long lResult;
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
lResult = stHandler->GetDriveType(_szFileName);
stHandler->SetErrorMode(uiMode);
return lResult;
}
/* Renvoie une valeur de hashage correspondant au label du lecteur passe en parametre */
#define M_CDLabelWanted -1323110684
long fn_lDriveLabel(char *_szFileName, tdstLoaderHandler *stHandler)
{
UINT uiMode;
char xBuffer[255], *pBuffer;
long lResult = 0;
pBuffer = xBuffer;
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
stHandler->GetVolumeInformation(_szFileName, pBuffer, 255, NULL, NULL, NULL, NULL, 0);
stHandler->SetErrorMode(uiMode);
/* Hash code du label... */
while (*pBuffer != 0)
{
lResult = (lResult << 5) + lResult + tolower(*pBuffer);
++pBuffer;
}
return lResult;
}
/* Renvoie le file systeme crypte du lecteur passe en parametre */
#define M_CDFSCryptKey 2759
#define M_CDFSWanted 1397113923L * M_CDFSCryptKey /* "CDFS"*/
long fn_lDriveFsType(char *_szFileName, tdstLoaderHandler *stHandler)
{
UINT uiMode;
char xBuffer[10];
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
stHandler->GetVolumeInformation(_szFileName, NULL, NULL, NULL, NULL, NULL, xBuffer, 10);
stHandler->SetErrorMode(uiMode);
return *((long *)xBuffer) * M_CDFSCryptKey;
}
/* Renvoie l'espace libre crypte en cluster du lecteur passe en parametre */
#define M_SFCryptKey 2533
#define M_CDFreeClusterWanted 0+M_SFCryptKey
long fn_lDriveFreeSpace(char *_szFileName, tdstLoaderHandler *stHandler)
{
UINT uiMode;
DWORD dwInfos[4];
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
stHandler->GetDiskFreeSpace(_szFileName, &dwInfos[0], &dwInfos[1], &dwInfos[2], &dwInfos[3]);
stHandler->SetErrorMode(uiMode);
return dwInfos[2] + M_SFCryptKey;
}
/* Renvoie le nombre de secteurs par cluster du lecteur passe en parametre */
#define M_SPCCryptKey 1937
#define M_CDSectorsPerClusterWanted 1*M_SPCCryptKey
long fn_lDriveSectorsPerCluster(char *_szFileName, tdstLoaderHandler *stHandler)
{
UINT uiMode;
DWORD dwInfos[4];
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
stHandler->GetDiskFreeSpace(_szFileName, &dwInfos[0], &dwInfos[1], &dwInfos[2], &dwInfos[3]);
stHandler->SetErrorMode(uiMode);
return dwInfos[0] * M_SPCCryptKey;
}
/* Renvoie le nombre de bytes par secteur du lecteur passe en parametre */
#define M_BPSCryptKey 9701
#define M_CDBytesPerSectorWanted 2048*M_BPSCryptKey
long fn_lDriveBytesPerSector(char *_szFileName, tdstLoaderHandler *stHandler)
{
UINT uiMode;
DWORD dwInfos[4];
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
stHandler->GetDiskFreeSpace(_szFileName, &dwInfos[0], &dwInfos[1], &dwInfos[2], &dwInfos[3]);
stHandler->SetErrorMode(uiMode);
return dwInfos[1] * M_BPSCryptKey;
}
/* Renvoie le nombre de clusters du lecteur passe en parametre */
#define M_NCCryptKey 10497
#define M_CDClustersWanted 186225*M_NCCryptKey
long fn_lDriveClusters(char *_szFileName, tdstLoaderHandler *stHandler)
{
UINT uiMode;
DWORD dwInfos[4];
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
stHandler->GetDiskFreeSpace(_szFileName, &dwInfos[0], &dwInfos[1], &dwInfos[2], &dwInfos[3]);
stHandler->SetErrorMode(uiMode);
return dwInfos[3] * M_NCCryptKey;
}
/*
INFORMATINOS SUR LES FICHIERS
*/
/* Renvoie les attributs cryptes du fichier passe en parametre */
#define M_FCACryptKey 57931
long fn_lFileChangeAttribut(char *_szFileName, tdstLoaderHandler *stHandler)
{
UINT uiMode;
long lResult;
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
stHandler->SetFileAttributes(_szFileName, FILE_ATTRIBUTE_NORMAL);
lResult = stHandler->GetFileAttributes(_szFileName);
stHandler->SetErrorMode(uiMode);
return lResult * M_FCACryptKey;
}
/* Test en ecriture le fichier et renvoie 1 en cas de succes (donc d'erreur pour le protection :)*/
long fn_lFileWriteable(char *_szFileName, tdstLoaderHandler *stHandler)
{
HANDLE hFile;
UINT uiMode;
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
hFile = stHandler->CreateFile(_szFileName , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL);
stHandler->SetErrorMode(uiMode);
if( hFile != INVALID_HANDLE_VALUE)
{
stHandler->CloseHandle (hFile);
return 1;
}
else
{
return 0;
}
}
/* Renvoie la taille cryptee du fichier passe en parametre */
#define M_FSCryptKey 53791
long fn_lFileSize(char *_szFileName, tdstLoaderHandler *stHandler)
{
DWORD iResult;
HANDLE hFile;
UINT uiMode;
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
hFile = stHandler->CreateFile(_szFileName, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
stHandler->SetErrorMode(uiMode);
if (hFile != INVALID_HANDLE_VALUE)
{
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
iResult = stHandler->GetFileSize(hFile, NULL);
stHandler->CloseHandle (hFile);
stHandler->SetErrorMode(uiMode);
return iResult*M_FSCryptKey;
}
return M_FSCryptKey;
}
/* Renvoie l'heure de derniere modification, cryptee, du fichier passe en parametre */
#define M_FTCryptKey 53791
long fn_lFileTime(char *_szFileName, tdstLoaderHandler *stHandler)
{
DWORD dwResult[2];
HANDLE hFile;
UINT uiMode;
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
hFile = stHandler->CreateFile(_szFileName, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
stHandler->SetErrorMode(uiMode);
if (hFile != INVALID_HANDLE_VALUE)
{
uiMode = stHandler->SetErrorMode(SEM_FAILCRITICALERRORS);
stHandler->GetFileTime(hFile, NULL, NULL, (LPFILETIME)dwResult);
--dwResult[0];
stHandler->SetFileTime(hFile, NULL, NULL, (LPFILETIME)dwResult);
stHandler->GetFileTime(hFile, NULL, NULL, (LPFILETIME)dwResult);
stHandler->SetErrorMode(uiMode);
return ((dwResult[0] * M_FTCryptKey) << 16) + dwResult[1];
}
return M_FTCryptKey;
}
/*
VERIFICATION DU SYSTEME
*/
#define M_SoftIceWanted 83
long fn_lSoftIcePresent(char *_szFileName, tdstLoaderHandler *stHandler)
{
HANDLE hFile = stHandler->CreateFile(_szFileName ,
GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if( hFile != INVALID_HANDLE_VALUE )
{
stHandler->CloseHandle(hFile);
return M_SoftIceWanted-11;
}
return M_SoftIceWanted;
}
#define M_DHCryptKey 3036172749
long fn_lDllHooked(char *_szFunctionName, tdstLoaderHandler *stHandler)
{
return stHandler->SearchExportedFunctionInEveryDLL(_szFunctionName) * M_DHCryptKey;
}
#define M_FHCryptKey 3036172749
long fn_lFunctionHooked(char *_szFunctionName, tdstLoaderHandler *stHandler)
{
DWORD dwAddress;
return dwAddress = stHandler->SearchFunctionInImportedTableOfExe(_szFunctionName) + M_FHCryptKey;
}
/* Should be the last!!!!! */
long fn_lLAST_FUNCTION(char *_szFileName, tdstLoaderHandler *stHandler)
{
return 0;
}
/* ATTENTION : les fonction doivent etre declares dans le tableau DANS L'ORDRE d'apparition dans le fichier!!!!
En effet on utilise le pointeur suivant dans le tableau pour connaitre la taille de la fonction
precedante...
Ce n'est pas tres joli, mais c'est la seule maniere automatique :(
*/
ptrFunction g_ListOfProtectionFunctions[50] =
{
/*00*/ &fn_lVolumeSerialNumber,
/*01*/ &fn_lDriveType,
/*02*/ &fn_lDriveLabel,
/*03*/ &fn_lDriveFsType,
/*04*/ &fn_lDriveFreeSpace,
/*05*/ &fn_lDriveSectorsPerCluster,
/*06*/ &fn_lDriveBytesPerSector,
/*07*/ &fn_lDriveClusters,
/*08*/ &fn_lFileChangeAttribut,
/*09*/ &fn_lFileWriteable,
/*10*/ &fn_lFileSize,
/*11*/ &fn_lFileTime,
/*12*/ &fn_lSoftIcePresent,
/*13*/ &fn_lDllHooked,
/*14*/ &fn_lFunctionHooked,
/*15*/ &fn_lLAST_FUNCTION, /* Should be the last!!!!! */
NULL
};
/* Le tableau suivant contient la liste des fonctions associes a leur parametre et resultat voulu.
Le numero d'ordre correspond au type dans les modele de protection (+100 pour les actifs et +200
pour les passifs).
*/
#define M_FileAttributeRO FILE_ATTRIBUTE_READONLY*M_FCACryptKey
#include"PTC/PTC_abc.h" /* Pour les noms des fonctions dll cryptes */
tdstProtectionsInit g_ProtectionFunctions[100] =
{
/* Tests direct du CD */
/*00*/ &fn_lVolumeSerialNumber, M_CDSerialNumberWanted, "A:\\", 1,
/*01*/ &fn_lDriveType, M_CDDriveTypeWanted, "A:\\", 1,
/*02*/ &fn_lDriveLabel, M_CDLabelWanted, "A:\\", 1,
/*03*/ &fn_lDriveFsType, M_CDFSWanted, "A:\\", 1,
/*04*/ &fn_lDriveFreeSpace, M_CDFreeClusterWanted, "A:\\", 1,
/*05*/ &fn_lDriveSectorsPerCluster, M_CDSectorsPerClusterWanted, "A:\\", 1,
/*06*/ &fn_lDriveBytesPerSector, M_CDBytesPerSectorWanted, "A:\\", 1,
/*07*/ &fn_lDriveClusters, M_CDClustersWanted, "A:\\", 1,
/* Tests sur des fichiers presents sur le CD */
/*08*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\Rayman2.ico", 1,
/*09*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\Dll\\APMP5SVR.dll", 1,
/*10*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\", 1,
/*11*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\", 1,
/*12*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\", 1,
/*13*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\", 1,
/*14*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\", 1,
/*15*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\", 1,
/*16*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\", 1,
/*17*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\", 1,
/*18*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\", 1,
/*19*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\", 1,
/*20*/ &fn_lFileChangeAttribut, M_FileAttributeRO, "A:\\", 1,
/*21*/ &fn_lFileWriteable, 0, "A:\\BinData\\game.dsb", 1,
/*22*/ &fn_lFileWriteable, 0, "A:\\Setup.exe", 1,
/*23*/ &fn_lFileWriteable, 0, "A:\\Autorun.inf", 1,
/*24*/ &fn_lFileWriteable, 0, "A:\\", 1,
/*25*/ &fn_lFileWriteable, 0, "A:\\", 1,
/*26*/ &fn_lFileWriteable, 0, "A:\\", 1,
/*27*/ &fn_lFileWriteable, 0, "A:\\", 1,
/*28*/ &fn_lFileWriteable, 0, "A:\\", 1,
/*29*/ &fn_lFileWriteable, 0, "A:\\", 1,
/*30*/ &fn_lFileWriteable, 0, "A:\\", 1,
/*31*/ &fn_lFileWriteable, 0, "A:\\", 1,
/*32*/ &fn_lFileWriteable, 0, "A:\\", 1,
/*33*/ &fn_lFileWriteable, 0, "A:\\", 1,
/*34*/ &fn_lFileSize, 1812*M_FSCryptKey, "A:\\BinData\\textures.cnt", 1,
/*35*/ &fn_lFileSize, 729088*M_FSCryptKey, "A:\\SetupUbi.exe", 1,
/*36*/ &fn_lFileSize, 921644*M_FSCryptKey, "A:\\InstData\\Rayman.tga", 1,
/*37*/ &fn_lFileSize, 1812*M_FSCryptKey, "A:\\", 1,
/*38*/ &fn_lFileSize, 1812*M_FSCryptKey, "A:\\", 1,
/*39*/ &fn_lFileSize, 1812*M_FSCryptKey, "A:\\", 1,
/*40*/ &fn_lFileSize, 1812*M_FSCryptKey, "A:\\", 1,
/*41*/ &fn_lFileSize, 1812*M_FSCryptKey, "A:\\", 1,
/*42*/ &fn_lFileSize, 1812*M_FSCryptKey, "A:\\", 1,
/*43*/ &fn_lFileSize, 1812*M_FSCryptKey, "A:\\", 1,
/*44*/ &fn_lFileSize, 1812*M_FSCryptKey, "A:\\", 1,
/*45*/ &fn_lFileSize, 1812*M_FSCryptKey, "A:\\", 1,
/*46*/ &fn_lFileSize, 1812*M_FSCryptKey, "A:\\", 1,
/*47*/ &fn_lFileTime, 0, "A:\\Lisezmoi.txt", 1,
/*48*/ &fn_lFileTime, 0, "A:\\Dll\\GliDetectDll.dll", 1,
/*49*/ &fn_lFileTime, 0, "A:\\", 1,
/*50*/ &fn_lFileTime, 0, "A:\\", 1,
/*51*/ &fn_lFileTime, 0, "A:\\", 1,
/*52*/ &fn_lFileTime, 0, "A:\\", 1,
/*53*/ &fn_lFileTime, 0, "A:\\", 1,
/*54*/ &fn_lFileTime, 0, "A:\\", 1,
/*55*/ &fn_lFileTime, 0, "A:\\", 1,
/*56*/ &fn_lFileTime, 0, "A:\\", 1,
/*57*/ &fn_lFileTime, 0, "A:\\", 1,
/*58*/ &fn_lFileTime, 0, "A:\\", 1,
/*59*/ &fn_lFileTime, 0, "A:\\", 1,
/* Test de softice */
/*60*/ &fn_lSoftIcePresent, M_SoftIceWanted, "\\\\.\\SICE", 0,
/*61*/ &fn_lSoftIcePresent, M_SoftIceWanted, "\\\\.\\SIWVID", 0,
/* Tests des fonctions potentiellement hookee */
/*62*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_CreateFileAName, 0,
/*63*/ &fn_lFunctionHooked, 0, PTC_C_CreateFileAName, 0,
/*64*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_WriteFileName, 0,
/*65*/ &fn_lFunctionHooked, 0, PTC_C_WriteFileName, 0,
/*66*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_ReadFileName, 0,
/*67*/ &fn_lFunctionHooked, 0, PTC_C_ReadFileName, 0,
/*68*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_CloseHandleName, 0,
/*69*/ &fn_lFunctionHooked, 0, PTC_C_CloseHandleName, 0,
/*70/ &fn_lDllHooked, M_FHCryptKey, PTC_C_SetErrorModeName, 0,
/*71*/ &fn_lFunctionHooked, 0, PTC_C_SetErrorModeName, 0,
/*72*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_GetFileInformationByHandleName,0,
/*73*/ &fn_lFunctionHooked, 0, PTC_C_GetFileInformationByHandleName,0,
/*74*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_GetDiskFreeSpaceAName, 0,
/*75*/ &fn_lFunctionHooked, 0, PTC_C_GetDiskFreeSpaceAName, 0,
/*76*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_SetFileAttributsAName, 0,
/*77*/ &fn_lFunctionHooked, 0, PTC_C_SetFileAttributsAName, 0,
/*78*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_GetFileAttributsAName, 0,
/*79*/ &fn_lFunctionHooked, 0, PTC_C_GetFileAttributsAName, 0,
/*80*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_GetFileTimeName, 0,
/*81*/ &fn_lFunctionHooked, 0, PTC_C_GetFileTimeName, 0,
/*82*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_SetFileTimeName, 0,
/*83*/ &fn_lFunctionHooked, 0, PTC_C_SetFileTimeName, 0,
/*84*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_SetFilePointerName, 0,
/*85*/ &fn_lFunctionHooked, 0, PTC_C_SetFilePointerName, 0,
/*86*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_FlushFileBufferName, 0,
/*87*/ &fn_lFunctionHooked, 0, PTC_C_FlushFileBufferName, 0,
/*88*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_GetDriveTypeAName, 0,
/*89*/ &fn_lFunctionHooked, 0, PTC_C_GetDriveTypeAName, 0,
/*90*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_GetVolumeInformationAName,0,
/*91*/ &fn_lFunctionHooked, 0, PTC_C_GetVolumeInformationAName,0,
/*92*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_GetFileSizeName, 0,
/*93*/ &fn_lFunctionHooked, 0, PTC_C_GetFileSizeName, 0,
/*94*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_GetLogicalDriveStringsAName,0,
/*95*/ &fn_lFunctionHooked, 0, PTC_C_GetLogicalDriveStringsAName,0,
/*96*/ &fn_lDllHooked, M_FHCryptKey, PTC_C_LoadLibraryAName, 0,
/*97*/ &fn_lFunctionHooked, 0, PTC_C_LoadLibraryAName, 0,
};
/* &fn_lSoftIcePresent, M_SoftIceWanted, "\\\\.\\NTICE", 0,*/