Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
Veis fallos de liberación de memoria?

Buenas amigos, he creado este código y me gustaria que me dijeran si estoy liberando bien los hilos o me dejo algo por ahí que no debería:
El .h:
Código PHP:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <System.hpp>
#include <Vcl.ComCtrls.hpp>
#include <Syncobjs.hpp>
//---------------------------------------------------------------------------

typedef struct {
    
UCHAR BeingDebugger;
    
UCHAR NTGlobalFlag;
    
UCHAR ProcessHeapFlags;
    
UCHAR ProcessHeapForceFlags;
}
PEB_DETECTION;

PEB_DETECTION *ProtectPeb;

typedef struct {
    
WideString cadena;
    
bool isDebugger;
}
Salida;

typedef struct {
    
Salida IsDebuggerPresent;
    
Salida BeingDebugger;
    
Salida NTGlobalFlag;
    
Salida ProcessHeapFlags;
    
Salida ProcessHeapForceFlags;
    
Salida DebugPort;
    
Salida NtSetInformationThread;
    
Salida CloseHandleWithInvalidHandle;
    
Salida GetTickCount;
    
Salida timeGetTime;
    
Salida QueryPerformanceCounter;
    
Salida OutputDebugString;
}
RETURN_DETECTION;

RETURN_DETECTION *Deteccion;

typedef struct {  //Para truco con QueryPerformanceCounter
    
__int64 TimeInit;
    
__int64 TimeEnd;
}
sTimer64;

class 
TMyThread : public TThread
{
    private:
        
sTimer64 gtctgt;
        
sTimer64 qpc;
        
PEB_DETECTION PEB_Protection;
        
RETURN_DETECTION Return_Detection;

    protected:
        
void __fastcall Execute();
    public:
        
__fastcall TMyThread(bool CreateSuspended,sTimer64,sTimer64,sTimer64);
        
void __fastcall ObtainStringsTimes(sTimer64sTimer64sTimer64);
        
void __fastcall ShowMessagesTimes(void);
        
void __fastcall SendTextColored(Salida s);
};

class 
TMyThread2 : public TThread
{
    private:
        
sTimer64 gtctgt;
        
sTimer64 qpc;
        
TMyThread *hilo//Hilo para poder probar las protecciones de tiempo con una pausa Sleep sin congelar el form
        
void __fastcall CheckDebug(void);
        
void __fastcall ObtenerDatosPEBx64(PEB_DETECTION *Peb_Protection);
        
void __fastcall ObtenerDatosPEBx32(PEB_DETECTION *Peb_Protection);
        
void __fastcall QueryDetectionPEB(PEB_DETECTION *Peb_ProtectionRETURN_DETECTION *Detection);
        
bool __fastcall QueryDebugPortDetection(void);
        
bool __fastcall QueryNtSetInformationThread(void);
        
bool __stdcall ObjectListCheck(RETURN_DETECTION *Detection);
        
bool __fastcall CheckOutputDebugString(void);
    protected:
        
void __fastcall Execute();
    public:
        
__fastcall TMyThread2(bool CreateSuspended);
        static 
TEvent *EventDatosLlenos;
};

class 
TForm1 : public TForm
{
__published:    // IDE-managed Components
        
TButton *ButtonPEB;
        
TCheckBox *CheckBox1;
    
TRichEdit *RichEditLogAntiDebug;
private:    
// User declarations

public:        // User declarations
        
TMyThread2 *hilo2;
        
__fastcall TForm1(TComponentOwner);

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif 
El .cpp:
Código PHP:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <Windows.h>
#include <Mmsystem.h>
#include <winnt.h>
#pragma hdrstop

#include "Unit1.h"

#define ObjectAllInformation 3
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

TEventTMyThread2::EventDatosLlenos = new TEvent(false);

//#undef _WIN64  //Para poder compilar en x32
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponentOwner)
        : 
TForm(Owner)
{
    
hilo2 = new TMyThread2(false);
}
//---------------------------------------------------------------------------

#ifdef _WIN64
void __fastcall TForm1::ObtenerDatosPEBx64(PEB_DETECTION *Peb_Protection)
{
    
DWORD64 PEB;
    
DWORD64 read;
    
DWORD64 dwBeingDebuggerdwNTGlobalFlagdwProcessHeapFlagsdwProcessHeapForceFlags;

    
//Obtengo el PEB
    
__asm
    
{
        
mov raxgs:[0x60];
        
mov PEBrax;
    }

    
//Obtenemos el valor de BeingDebugger
    
dwBeingDebugger PEB+0x2;
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)dwBeingDebugger,&Peb_Protection->BeingDebugger ,sizeof(Peb_Protection->BeingDebugger),(DWORD64*)&read);

    
//Obtenemos el valor de NtGlobalFlag

    
dwNTGlobalFlag PEB+0xBC;
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)dwNTGlobalFlag,&Peb_Protection->NTGlobalFlag,sizeof(Peb_Protection->NTGlobalFlag),(DWORD64*)&read);

    
//Obtenemos el valor de ProcessHeapFlags
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)(PEB+0x30),&dwProcessHeapFlags ,sizeof(dwProcessHeapFlags),(DWORD64*)&read);
    
dwProcessHeapFlags += 0x70;
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)(dwProcessHeapFlags),&Peb_Protection->ProcessHeapFlags ,sizeof(Peb_Protection->ProcessHeapFlags),(DWORD64*)&read);

    
//Obtenemos el valor de ProcessHeapForceFlags
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)(PEB+0x30),&dwProcessHeapForceFlags ,sizeof(dwProcessHeapForceFlags),(DWORD64*)&read);
    
dwProcessHeapForceFlags += 0x74;
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)(dwProcessHeapForceFlags),&Peb_Protection->ProcessHeapForceFlags ,sizeof(Peb_Protection->ProcessHeapForceFlags),(DWORD64*)&read);
}

#elif defined _WIN32

void __fastcall TMyThread2::ObtenerDatosPEBx32(PEB_DETECTION *Peb_Protection)
{
    
DWORD PEB;
    
DWORD read;
    
DWORD dwBeingDebuggerdwNTGlobalFlagdwProcessHeapFlagsdwProcessHeapForceFlags;

    
//Obtengo el PEB
    
__asm
    
{
        
mov eaxfs:[0x30];
        
mov PEBeax;
    }

    
//Obtenemos el valor de BeingDebugger
    
dwBeingDebugger PEB+0x2;
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)dwBeingDebugger,&Peb_Protection->BeingDebugger ,sizeof(Peb_Protection->BeingDebugger),(DWORD*)&read);

    
//Obtenemos el valor de NtGlobalFlag

    
dwNTGlobalFlag PEB+0x68;
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)dwNTGlobalFlag,&Peb_Protection->NTGlobalFlag,sizeof(Peb_Protection->NTGlobalFlag),(DWORD*)&read);

    
//Obtenemos el valor de ProcessHeapFlags
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)(PEB+0x18),&dwProcessHeapFlags ,sizeof(dwProcessHeapFlags),(DWORD*)&read);
    
dwProcessHeapFlags += 0x40;
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)(dwProcessHeapFlags),&Peb_Protection->ProcessHeapFlags ,sizeof(Peb_Protection->ProcessHeapFlags),(DWORD*)&read);

    
//Obtenemos el valor de ProcessHeapForceFlags
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)(PEB+0x18),&dwProcessHeapForceFlags ,sizeof(dwProcessHeapForceFlags),(DWORD*)&read);
    
dwProcessHeapForceFlags += 0x44;
    
ReadProcessMemory(GetCurrentProcess(),(LPVOID)(dwProcessHeapForceFlags),&Peb_Protection->ProcessHeapForceFlags ,sizeof(Peb_Protection->ProcessHeapForceFlags),(DWORD*)&read);
}
#endif

//---------------------------------------------------------------------------

bool __fastcall TMyThread2::QueryDebugPortDetection(void)
{
        
ULONG ProcessDebugPort 7;
        
DWORD read;
        
HMODULE NtDll;
        
ULONG status;
        
bool retval;

        
NtDll LoadLibrary(L"ntdll.dll");
        
LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandleULONG ProcessInformationClassPVOID ProcessInformationULONG ProcessInformationLengthPULONG ReturnLength);
        *(
FARPROC *)&NtQueryInformationProcess GetProcAddress(NtDll"NtQueryInformationProcess");

        
HANDLE DebugPort;
        
status NtQueryInformationProcess(GetCurrentProcess(), ProcessDebugPort, &DebugPortsizeof(DebugPort), &read);

        if(
DebugPort)
        {
                
retval=true;
        }
        else
        {
                
retval=false;
        }
        return 
retval;
}
//---------------------------------------------------------------------------

bool __fastcall TMyThread2::QueryNtSetInformationThread(void)
{
    
HMODULE NtDll;
    
NTSTATUS ntStat;
    
bool check false;
    
bool retval=false;
    
int ThreadHideFromDebugger 0x11;

    
NtDll LoadLibrary(L"ntdll.dll");
    
LONG (WINAPI *NtSetInformationThread)(HANDLE ThreadHandleULONG ThreadInformationClassPVOID ThreadInformationULONG ThreadInformationLength);
    
LONG (WINAPI *NtQueryInformationThread)(HANDLE ThreadHandleULONG ThreadInformationClassPVOID ThreadInformationULONG ThreadInformationLengthPULONG ReturnLength);
    *(
FARPROC *)&NtSetInformationThread GetProcAddress(NtDll"NtSetInformationThread");
    *(
FARPROC *)&NtQueryInformationThread GetProcAddress(NtDll"NtQueryInformationThread");

    
//invalid parameter
    
ntStat NtSetInformationThread(NULLThreadHideFromDebugger, &checksizeof(ULONG));
    if (
ntStat >= 0//it must fail
    
{
        
//Detectado con metodo 1
        
return true;
    }

    
//invalid handle
    
ntStat NtSetInformationThread((HANDLE)0xFFFFFThreadHideFromDebugger00);
    if (
ntStat >= 0//it must fail
    
{
        
//Detectado con metodo 2
        
return true;
    }

    
//En x32 si estamos depurandolo se cerrará directamente el proceso
    
ntStat NtSetInformationThread(NULLThreadHideFromDebugger00);

    if (
ntStat >= 0)
    {
        
//only available >= VISTA
        
ntStat NtQueryInformationThread(NULLThreadHideFromDebugger, &checksizeof(bool), 0);
        if (
ntStat >= 0)
        {
            if (!
check)
            {
                
//Detectado con metodo 4
                
return true;
            }
            else
            {
                return 
false;
            }
        }
        else
        {
            
ShowMessage("Query ThreadHideFromDebugger no disponible!");
            
retval=false;
        }
    }
    else
    {
        
//Detectado con metodo 3
        
return true;
    }
    return 
retval;
}
//---------------------------------------------------------------------------

void __fastcall TMyThread2::QueryDetectionPEB(PEB_DETECTION *Peb_ProtectionRETURN_DETECTION *Detection)
{
        
#ifdef _WIN64
            
ObtenerDatosPEBx64(Peb_Protection);
        
#elif defined _WIN32
            
ObtenerDatosPEBx32(Peb_Protection);
        
#else
            #error "Error. Solo sirve para Windows"
        #endif

        
if(Peb_Protection->BeingDebugger == 0x1)
        {
                
Detection->BeingDebugger.cadena "BeingDebugger te ha detectado.";
                
Detection->BeingDebugger.isDebugger true;
        }else{
                
Detection->BeingDebugger.cadena "BeingDebugger no te ha detectado.";
                
Detection->BeingDebugger.isDebugger false;
        }

        if(
Peb_Protection->NTGlobalFlag == 0x70)
        {
                
Detection->NTGlobalFlag.cadena "NtGlobalFlag te ha detectado.";
                
Detection->NTGlobalFlag.isDebugger true;
        }else{
                
Detection->NTGlobalFlag.cadena "NtGlobalFlag no te ha detectado.";
                
Detection->NTGlobalFlag.isDebugger false;
        }

        if(
Peb_Protection->ProcessHeapFlags != 2)
        {
                
Detection->ProcessHeapFlags.cadena "ProcessHeapFlags te ha detectado.";
                
Detection->ProcessHeapFlags.isDebugger true;
        }else{
                
Detection->ProcessHeapFlags.cadena "ProcessHeapFlags no te ha detectado.";
                
Detection->ProcessHeapFlags.isDebugger false;
        }

        if(
Peb_Protection->ProcessHeapForceFlags != 0)
        {
                
Detection->ProcessHeapForceFlags.cadena "ProcessHeapForceFlags te ha detectado.";
                
Detection->ProcessHeapForceFlags.isDebugger true;
        }else{
                
Detection->ProcessHeapForceFlags.cadena "ProcessHeapForceFlags no te ha detectado.";
                
Detection->ProcessHeapForceFlags.isDebugger false;
        }
}
//---------------------------------------------------------------------------

bool __fastcall TMyThread2::CheckOutputDebugString(void)
{
    
wchar_t lpOutputString[]=L"Hello Debugger!";
    
char outputDebugStringBuffer[1000] = {0};
    
bool retval;

    
WideCharToMultiByte(CP_ACP0lpOutputString, -1outputDebugStringBuffersizeof(outputDebugStringBuffer), 00);

    
ULONG_PTR args[4];

    
//unicode
    
args[0] = (ULONG_PTR)wcslen(lpOutputString) + 1;
    
args[1] = (ULONG_PTR)lpOutputString;

    
//ansi for compatibility
    
args[2] = (ULONG_PTR)wcslen(lpOutputString) + 1;
    
args[3] = (ULONG_PTR)outputDebugStringBuffer;

    
__try
    
{
        
RaiseException(0x4001000A04args);//DBG_PRINTEXCEPTION_WIDE_C
        
retval true;
    }
    
__except(EXCEPTION_EXECUTE_HANDLER)
    {
        
retval false;
    }

    return 
retval;
}
//---------------------------------------------------------------------------


void __fastcall TMyThread2::CheckDebug(void)
{
    
ProtectPeb= new(PEB_DETECTION);
    
Deteccion = new(RETURN_DETECTION);
    
HANDLE hTrucho = (HANDLE)1234//Para truco con CloseHandle

    
QueryPerformanceCounter((LARGE_INTEGER*)&qpc.TimeInit); //Obtenemos el tiempo inicial con QueryPerformanceCounter
    
tgt.TimeInit timeGetTime();
    
gtc.TimeInit GetTickCount(); //Obtenemos el tiempo inicial con GetTickCount

    
if(hilo == NULL)
        
hilo = new TMyThread(false,gtc,tgt,qpc); //Creo un hilo para controlar el tiempo y poder pausar para probar el antiantidebug

    
if(ProtectPeb != NULL && Deteccion != NULL  && hilo != NULL)
    {
        
Deteccion->IsDebuggerPresent.isDebugger IsDebuggerPresent();
        if(
Deteccion->IsDebuggerPresent.isDebugger){
            
Deteccion->IsDebuggerPresent.cadena "Detectado por IsDebuggerPresent.";
        }else{
            
Deteccion->IsDebuggerPresent.cadena "No detectado por IsDebuggerPresent.";
        }
        
Deteccion->CloseHandleWithInvalidHandle.cadena "No detectado por CloseHandle con un handle inválido.";
        
Deteccion->CloseHandleWithInvalidHandle.isDebugger false;
        
__try{
                
CloseHandle(hTrucho);
        }
        
__except(EXCEPTION_EXECUTE_HANDLER){
                
Deteccion->CloseHandleWithInvalidHandle.cadena "Detectado por CloseHandle con un handle inválido.";
                
Deteccion->CloseHandleWithInvalidHandle.isDebugger true;
        }

        
QueryDetectionPEB(ProtectPebDeteccion);

        
Deteccion->DebugPort.isDebugger QueryDebugPortDetection();
        if(
Deteccion->DebugPort.isDebugger){
            
Deteccion->DebugPort.cadena "DebugPort te ha detectado.";
            
Deteccion->DebugPort.isDebugger true;
        }
        else
        {
            
Deteccion->DebugPort.cadena "DebugPort no te ha detectado.";
            
Deteccion->DebugPort.isDebugger false;
        }

        
Deteccion->OutputDebugString.isDebugger CheckOutputDebugString();
        if(
Deteccion->OutputDebugString.isDebugger){
            
Deteccion->OutputDebugString.cadena "Debugger detectado con OutputDebugString.";
            
Deteccion->OutputDebugString.isDebugger true;
        }
        else
        {
            
Deteccion->OutputDebugString.cadena "Debugger no detectado con OutputDebugString.";
            
Deteccion->OutputDebugString.isDebugger false;
        }

        
Deteccion->BeingDebugger.cadena Deteccion->BeingDebugger.cadena " Resultado = 0x"+WideString(IntToHex((int)ProtectPeb->BeingDebugger,2));
        
Deteccion->NTGlobalFlag.cadena Deteccion->NTGlobalFlag.cadena " Resultado = 0x"+WideString(IntToHex((int)ProtectPeb->NTGlobalFlag,2));
        
Deteccion->ProcessHeapFlags.cadena Deteccion->ProcessHeapFlags.cadena +  " Resultado = 0x"+WideString(IntToHex((int)ProtectPeb->ProcessHeapFlags,2));
        
Deteccion->ProcessHeapForceFlags.cadena Deteccion->ProcessHeapForceFlags.cadena " Resultado = 0x"+WideString(IntToHex((int)ProtectPeb->ProcessHeapForceFlags,2));

        
//Deteccion->NtSetInformationThread.isDebugger = QueryNtSetInformationThread();
        
if(Deteccion->NtSetInformationThread.isDebugger)
        {
            
Deteccion->NtSetInformationThread.cadena "NtSetInformationThread nos ha desatacheado.";
        }else{
            
Deteccion->NtSetInformationThread.cadena "NtSetInformationThread pasado con éxito.";
        }

        
EventDatosLlenos->SetEvent();

    }else{
        
ShowMessage("Hubo un problema al asignar memoria");
    }
}
//---------------------------------------------------------------------------


__fastcall TMyThread::TMyThread(bool CreateSuspendedsTimer64 sGetTickCountsTimer64 sTimeGetTimesTimer64 sQueryPerformanceCounter): TThread(CreateSuspended)
{
    
//FreeOnTerminate=true;
    
memcpy(&gtc,&sGetTickCount,sizeof(sTimer64));
    
memcpy(&tgt,&sTimeGetTime,sizeof(sTimer64));
    
memcpy(&qpc,&sQueryPerformanceCounter,sizeof(sTimer64));
}
//---------------------------------------------------------------------------

void __fastcall TMyThread::Execute()
{
    if(
Form1->CheckBox1->Checked)
        
Sleep(3000); //Necesario para comprobar si nos detectan por tiempo aunque asi nos detecte siempre
    
else
        
Sleep(100);
    
ObtainStringsTimes(tgt,gtc,qpc);
    
Synchronize(ShowMessagesTimes);
    
delete ProtectPeb;
    
delete Deteccion;
}
//---------------------------------------------------------------------------

void __fastcall TMyThread::SendTextColored(Salida s)
{
    if(
s.isDebugger==true)
        
Form1->RichEditLogAntiDebug->SelAttributes->Color clRed;
    else
        
Form1->RichEditLogAntiDebug->SelAttributes->Color clLime;

    
Form1->RichEditLogAntiDebug->Lines->Add(s.cadena);
}
//---------------------------------------------------------------------------

void __fastcall TMyThread::ShowMessagesTimes()
{
    
TMyThread2::EventDatosLlenos->WaitFor(INFINITE);

    
//Mostramos los datos
    
Form1->RichEditLogAntiDebug->Clear();
    
SendTextColored(Deteccion->IsDebuggerPresent);
    
SendTextColored(Deteccion->BeingDebugger);
    
SendTextColored(Deteccion->NTGlobalFlag);
    
SendTextColored(Deteccion->ProcessHeapFlags);
    
SendTextColored(Deteccion->ProcessHeapForceFlags);
    
SendTextColored(Deteccion->DebugPort);
    
SendTextColored(Deteccion->CloseHandleWithInvalidHandle);
    
SendTextColored(Deteccion->OutputDebugString);
    
SendTextColored(Deteccion->NtSetInformationThread);

    
//Mostramos si nos ha detectado con GetTickCount o no y posicionamos al inicio el TMEMO
    
SendTextColored(Deteccion->GetTickCount);

    
SendTextColored(Deteccion->timeGetTime);

    
SendTextColored(Deteccion->QueryPerformanceCounter);
}
//---------------------------------------------------------------------------

void __fastcall TMyThread::ObtainStringsTimes(sTimer64 tgcsTimer64 gtc,sTimer64 qpc)
{
    
__int64 frec=0;
    
gtc.TimeEnd GetTickCount(); //Obtenemos el tiempo final con GetTickCount
    
tgc.TimeEnd timeGetTime(); //Obtenemos el tiempo final con timeGetTime
    
QueryPerformanceCounter((LARGE_INTEGER*)&(qpc.TimeEnd)); //Obtenemos el tiempo final con QueryPerformanceCounter

    //Obtenemos la frecuencia
    
QueryPerformanceFrequency((LARGE_INTEGER*)&frec);

    
//Aqui comprobamos que el tiempo transcurrido no pase de 2 segundos en milisegundos
    
if((gtc.TimeEnd gtc.TimeInit) > 2000)
    {
            
Deteccion->GetTickCount.cadena "Detectado con método GetTickCount.";
            
Deteccion->GetTickCount.isDebugger true;
    }else{
            
Deteccion->GetTickCount.cadena "No detectado con método GetTickCount.";
            
Deteccion->GetTickCount.isDebugger false;
    }

    
//Aqui comprobamos que el tiempo transcurrido usando timeGetTime no pase de 2 segundos en milisegundos
    
if((tgc.TimeEnd tgc.TimeInit) > 2000)
    {
            
Deteccion->timeGetTime.cadena "Detectado con método timeGetTime.";
            
Deteccion->timeGetTime.isDebugger true;
    }else{
            
Deteccion->timeGetTime.cadena "No detectado con método timeGetTime.";
            
Deteccion->timeGetTime.isDebugger false;
    }

    
//Aqui comprobamos que el tiempo transcurrido usando QueryPerformanceCounter no pase de 2 segundos en milisegundos
    
if((qpc.TimeEnd qpc.TimeInit)/(frec/1000) > 2000)
    {
            
Deteccion->QueryPerformanceCounter.cadena "Detectado con método QueryPerformanceCounter.";
            
Deteccion->QueryPerformanceCounter.isDebugger true;
    }else{
            
Deteccion->QueryPerformanceCounter.cadena "No detectado con método QueryPerformanceCounter.";
            
Deteccion->QueryPerformanceCounter.isDebugger false;
    }

}
//---------------------------------------------------------------------------

__fastcall TMyThread2::TMyThread2(bool CreateSuspended)
{
    
FreeOnTerminate true;
    
hilo=NULL;
}
//---------------------------------------------------------------------------

void __fastcall TMyThread2::Execute()
{
    do{
    if(
hilo != NULL){
        
hilo->WaitFor();
        
delete hilo;
        
hilo NULL;
    }
    
CheckDebug();
    }while(
true);
}
//--------------------------------------------------------------------------- 
La aplicacion aparentemente realiza bien la tarea aunque no me ha gustado tener que poner un Sleep(100) para que no parpadee la pantalla cuando no marco el checkbox ya que limpio el RichEdit y lo vuelvo a pintar. Se que eso se arreglaba desactivando el repintado o algo asi y luego pintando (no recuerdo como era...
¿Como lo mejoraríais?
Responder Con Cita
  #2  
Antiguo 31-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
Para solucionar lo del parpadeo intenté esto:
Código PHP:
__fastcall TForm1::TForm1(TComponentOwner)
        : 
TForm(Owner)
{
    
RichEditLogAntiDebug->DoubleBuffered true;
    ...
}

void __fastcall TMyThread::ShowMessagesTimes()
{
    
TMyThread2::EventDatosLlenos->WaitFor(INFINITE);

    
//Mostramos los datos
    
Form1->RichEditLogAntiDebug->Lines->BeginUpdate();
    
Form1->RichEditLogAntiDebug->Clear();
    
SendTextColored(Deteccion->IsDebuggerPresent);
    
SendTextColored(Deteccion->BeingDebugger);
    
SendTextColored(Deteccion->NTGlobalFlag);
    
SendTextColored(Deteccion->ProcessHeapFlags);
    
SendTextColored(Deteccion->ProcessHeapForceFlags);
    
SendTextColored(Deteccion->DebugPort);
    
SendTextColored(Deteccion->CloseHandleWithInvalidHandle);
    
SendTextColored(Deteccion->OutputDebugString);
    
SendTextColored(Deteccion->NtSetInformationThread);

    
//Mostramos si nos ha detectado con GetTickCount o no y posicionamos al inicio el TMEMO
    
SendTextColored(Deteccion->GetTickCount);
    
SendTextColored(Deteccion->timeGetTime);
    
SendTextColored(Deteccion->QueryPerformanceCounter);

    
Form1->RichEditLogAntiDebug->Lines->EndUpdate();

El problema es que no muestra absolutamente nada en el RichEdit.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Fallos de memoria en Firebird (error 335544676) Sergio-ponchito Firebird e Interbase 7 22-03-2018 18:58:18
Problema con la liberación de memoria. TecnoBestia Varios 3 12-03-2012 15:47:13
Liberación de memoria de Tbitmap Marck Silencer Gráficos 11 27-01-2011 08:29:06
Liberación de memoria de punteros Data de un Tree. afxe Varios 5 20-06-2007 17:12:34
Liberación de memoria Jome OOP 5 22-02-2007 14:44:56


La franja horaria es GMT +2. Ahora son las 13:13:31.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi