Ver Mensaje Individual
  #1  
Antiguo 04-01-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Reputación: 22
ArdiIIa Va por buen camino
MINI PROTECCION DE APLICACIONES

Hace tiempo puse un truco que estaba en la sección de columnas pero no he llegado a encontrarlo, así que vuelvo a ponerlo por considerarlo de interés general:

En sí, lo que hace es introducir la información del disco duro dentro de un RESOURCE del programa. Posteriormente verifica que esa información introducida en el RESOURCE, se corresponda con el número de serie del disco duro donde se ejecuta el programa, en el caso de que existan diferencias quiere decir que el programa se está ejecutando en otro ordenador (o disco duro) o que el disco duro formateado.
De un modo u otro, si la aplicación detecta esto último, deja de ejecutarse.
El procedimiento, una vez que se "automodifica", se autoejecuta, por ese motivo siempre trata de borrar la copia antigua del programa "borrame.dat".
Ni que decir tiene que este procedimiento ha de ser llamado cuando el programa comienza a ejecutarse, a mi juicio el modo mas apropiado es cuando el Form principal se está creando.

A título informativo, diré que las funciones utilizadas en este procedimiento, referentes a recursos, pueden ser utilizadas por cualquier programa para introducir cualquier información o fichero dentro de nuestro propio ejecutable. Esto lo comento porque he visto mensajes por ahí preguntando como se podría meter un fichero ejecutable dentro de nuestro programa y este modelo podría servir como introducción haciéndole alguna pequeña modificación.

En fin espero que resulte útil.


Código Delphi [-]
// ESTE PROCEDIMIENDO DETECTA Y MARCA EL EJECUABLE SI ES EL CASO PARA QUE SOLAMENTE
// SE EJECUTE EN UN ORDENADOR EN CONCRETO

Procedure TFormMain.CheckSecurity;

Function Check_HD : string;
Var
   VolumeNameBuffer : array [0..MAX_PATH -1] of Char;
   VolumeSerialNumber : DWord;
   MaximumComponentLength : DWord;
   FileSystemFlags : DWord;
Begin
Result := '*';
      GetVolumeInformation( '\'
                           ,VolumeNameBuffer
                           ,DWORD(sizeof(VolumeNameBuffer))
                           ,@VolumeSerialNumber
                           ,MaximumComponentLength
                           ,FileSystemFlags
                           ,nil
                           ,0);
Check_HD := IntToHEX(VolumeSerialNumber,8);
End;



Function Check_RES : String;
Var
    ResData: HGLOBAL;
    ResInfo: HRSRC;
Begin
 Result := '';
 ResInfo := FindResource(hInstance, 'FULANO', RT_RCDATA);
 if ResInfo <> 0 then
    Begin
      ResData := LoadResource(hInstance, ResInfo);
      if ResData <> 0 then
      try
        Result := PChar(LockResource(ResData));
        Check_Res := TRIM(Result);
        UnlockResource(ResData);
      finally
        FreeResource(ResData);
      End;
    End;

End;


Function Write_Exe : Boolean;
Var hRes : THandle;
    cHD  : String;
Begin
     cHD := Check_HD;
     hRes := BeginUpdateResource(PChar(cAtom+'.exe'),False);
     UpdateResource(hRes,RT_RCDATA,'FULANO',0,Pointer(cHD),Length(cHD));
     Result :=  EndUpdateResource(hRes,False);
End;



var
cTemp : String;
proc_info: TProcessInformation;
startinfo: TStartupInfo;

Begin //Comienzo del Procedimiento
Deletefile('borrame.dat');
cTemp := Check_Res;
If cTemp = '' then
Begin
Aviso('SE VA A REALIZAR UNA OPERACIÓN DE AUTOPROTECCIÓN QUE PUEDE SER DETECTADA POR PROGRAMAS ANTIVIRUS');
CopyFile(Pchar(Application.Exename),cAtom+'.exe',False);
If Write_Exe then
    if MoveFileEx(PChar(Application.Exename),'BORRAME.DAT',MOVEFILE_COPY_ALLOWED) then
        if MoveFileEx(cAtom + '.exe',PChar(Application.Exename),MOVEFILE_COPY_ALLOWED) then
        Begin
            FillChar(proc_info, sizeof(TProcessInformation), 0);
            FillChar(startinfo, sizeof(TStartupInfo), 0);
            startinfo.cb := sizeof(TStartupInfo);
            if CreateProcess(PChar(Application.exename),'',nil,nil,False,IDLE_PRIORITY_CLASS ,nil,nil,startinfo,proc_info) then
               CloseHandle(proc_info.hProcess);
            Application.Terminate;
        End;
End
else if cTemp <> Check_HD then
Begin
AVISO('ESTE PROGRAMA ES UNA COPIA ILEGAL Y NO ESTA AUTORIZADO A EJECUTARSE EN ESTE ORDENADOR');
Application.Terminate;
Sleep(10000);
End;
End;

P.D.
(FULANO) es el nombre del recurso, que obviamente puede ser cualquier nombre...
(cAtom) es una variable de texto que contiene un nombre para asignar al fichero...
Responder Con Cita