Simple Anti-Inyector de Dlls
#1
El post no es de mi autoría. Créditos: BloodSharp

BloodSharp escribió:En estas últimas semanas estuve leyendo algunas de las protecciones que realizan algunos sistemas anticheats y me decidí probar algunas de dichas protecciones, en este caso evitar la inyección de cheats en Half-Life y sus mods derivados...

Ahora, bien sabemos que la mayoría de los cheats utilizan inyecciones que se realizan por hilo remoto. Los pasos para crear un hilo remoto son los siguientes:


Encontrar y abrir el proceso (abrir el proceso con permisos)
Almacenar memoria en el proceso para la dirección de la dll o código a ejecutar
Escribir la dirección de la dll o rutina a ejecutar
Crear un hilo remoto para que fuerze al programa ejecutar el código del hack


Como pensé que bloquear cada paso posible no sería muy complicado, cosa que tengo que admitir que me equivoqué (la razón fue porque varias cosas del sistema fallaban y en algunas ocasiones tuve resultados muy azules), decidí directamente bloquear directamente el último y más importante paso que es el que habilita el inicio de los cheats...

Lo que haremos será crear un driver que "hookée" la rutina NtCreateThread y detenga cualquier intento de crear un hilo desde otro programa hacia el juego:

Código PHP:
NTSTATUS NTAPI HOOK_ZwCreateThread(OUT PHANDLE ThreadHandle,IN ACCESS_MASK DesiredAccess,
                                   
IN POBJECT_ATTRIBUTES ObjectAttributes,
                                   
IN HANDLE ProcessHandle,OUT PCLIENT_ID ClientId,
                                   
IN PCONTEXT ThreadContext,IN PUSER_STACK UserStack,
                                   
IN BOOLEAN CreateSuspended)
{
    
NTSTATUS lStatus;
    
CHAR CurFileName[MAX_PATH]={0},ProcFileName[MAX_PATH]={0};
    
HANDLE CurrentPID=PsGetCurrentProcessId();
    
HANDLE ProcessHandleId=(HANDLE)GetProcessIdByHandle(ProcessHandle);
    
PEPROCESS EProc;

    
lStatus=PsLookupProcessByProcessId(CurrentPID,&EProc);
    if(
lStatus==STATUS_SUCCESS)
    {
        
ImageFileName(EProc,CurFileName);
        
ObDereferenceObject(EProc);
    }
    
lStatus=PsLookupProcessByProcessId(ProcessHandleId,&EProc);
    if(
lStatus==STATUS_SUCCESS)
    {
        
ImageFileName(EProc,ProcFileName);
        
ObDereferenceObject(EProc);
    }

    if(!
strcmp(_strlwr(ProcFileName),"hl.exe"))
    {
        if(
CurrentPID==ProcessHandleId || !strcmp(_strlwr(CurFileName),"explorer.exe"))
            return 
pZwCreateThread(ThreadHandle,DesiredAccess,ObjectAttributes,
                                    
ProcessHandle,ClientId,ThreadContext,UserStack,
                                    
CreateSuspended);
        else
        {
            
DbgPrint("%s tried to create a remote thread in the game... ACCESS DENIED!!!\n",CurFileName);
            return 
STATUS_UNSUCCESSFUL;
        }
    }
    return 
pZwCreateThread(ThreadHandle,DesiredAccess,ObjectAttributes,ProcessHandle,
                            
ClientId,ThreadContext,UserStack,CreateSuspended);


Este es un código muy simple, estoy seguro que se pueden bloquear mejor y de muchas otras formas las inyecciones...
Responder
#2
[Imagen: Z2IPkbzyREKV-jc9eSxFug.png]

Código PHP:
if(CurrentPID==ProcessHandleId || !strcmp(_strlwr(CurFileName),"explorer.exe"))
            return 
pZwCreateThread(ThreadHandle,DesiredAccess,ObjectAttributes,
                                    
ProcessHandle,ClientId,ThreadContext,UserStack,
                                    
CreateSuspended);
        else
        {
            
DbgPrint("%s tried to create a remote thread in the game... ACCESS DENIED!!!\n",CurFileName);
            return 
STATUS_UNSUCCESSFUL;
        } 


Código PHP:
!strcmp(_strlwr(CurFileName),"explorer.exe&quot

Quien fue el desgraciado que coloco esa condición ahí, tranquilamente inyecto una dll en explorer.exe(un shellcode/pedaso de código asm que cree threads...) o le pongo a mi proceso explorer.exe y inyecto.
Responder
#3
(02/11/2018, 08:58 PM)Pan Bimbo (? escribió: Quien fue el desgraciado que coloco esa condición ahí, tranquilamente inyecto una dll en explorer.exe(un shellcode/pedaso de código asm que cree threads...) o le pongo a mi proceso explorer.exe y inyecto.

Acordate que esto es conceptual, es sólo para ver el funcionamiento de las cosas y darse una idea, y no codearlo perfectamente al %100 ...

Volviendo al tema, el código es en modo ring0, si te fijás bien, cualquier Thread que quieras crear en el juego directamente no te funciona, así que por más que inyectes en explorer.exe, como harías para cargar todo en hl.exe ?
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
Responder
#4
(02/11/2018, 09:11 PM)Cr3470r escribió:
(02/11/2018, 08:58 PM)Pan Bimbo (? escribió: Quien fue el desgraciado que coloco esa condición ahí, tranquilamente inyecto una dll en explorer.exe(un shellcode/pedaso de código asm que cree threads...) o le pongo a mi proceso explorer.exe y inyecto.

Acordate que esto es conceptual, es sólo para ver el funcionamiento de las cosas y darse una idea, y no codearlo perfectamente al %100 ...

Volviendo al tema, el código es en modo ring0, si te fijás bien, cualquier Thread que quieras crear en el juego directamente no te funciona, así que por más que inyectes en explorer.exe, como harías para cargar todo en hl.exe ?

Y es una boludes, pones un export en la dll, y modificas los importes de hl.exe o alguna dll que este ahi, y creas el thread o lo q fuere.

No empeces con las boludeces de "ay i zi te blokio el imphort xdxdxd?"
Responder
#5
Dejo algunos repositorios que podrían ser util para cualquiera que le interese este tema:
https://github.com/SagaanTheEpic/Sagaan-AntiCheat-V2.0/
https://github.com/SLAUC91/AntiCheat
ninguno llego a nada serio, no son mas que recopilaciones de metodos que se pueden encontrar en otros lados si se busca bien

Y este que da pena jaja (si lo haces funcional, no es mas que una broma para poner en tu servidor made in casa)
https://github.com/moien007/AntiCheat
Responder
#6
(02/11/2018, 09:31 PM)Destro escribió: Dejo algunos repositorios que podrían ser util para cualquiera que le interese este tema:
https://github.com/SagaanTheEpic/Sagaan-AntiCheat-V2.0/
https://github.com/SLAUC91/AntiCheat
ninguno llego a nada serio, no son mas que recopilaciones de metodos que se pueden encontrar en otros lados si se busca bien

Y este que da pena jaja (si lo haces funcional, no es mas que una broma para poner en tu servidor made in casa)
https://github.com/moien007/AntiCheat

Voy a tomar algunos codes de ahí para darme ideas, sobre todo las detenciones a modo ring 3, buena info!

(02/11/2018, 09:29 PM)Pan Bimbo (? escribió: Y es una boludes, pones un export en la dll, y modificas los importes de hl.exe o alguna dll que este ahi, y creas el thread o lo q fuere.

No empeces con las boludeces de "ay i zi te blokio el imphort xdxdxd?"

Estamos para discutir sobre el tema, pero tampoco irnos al carajo y lo sabes jajaja...
Bueno, vamos a simplificar todo de esta manera...

Te bloqueo la creación de Threads en el hl.exe, cambias el export de una dll y modificas los importes del hl.exe y ya está, inyectas.
Te hago una validación MD5 de todo los archivos del juego, y me podés hacer un archivo colisionado con una misma MD5 y ya está, inyectas.
Te puedo hacer incluso una validación y unos bloqueos a nivel Kernel y ya está, me parcheas todo e inyectas.
Es más, podemos ir por la más fácil, me hacés un método code-cave y ya está, inyectas lo más tranqui.

Siempre vas a tener una forma de saltearte las cosas a nivel Cliente, haga lo que yo haga, si corre en tu PC, me lo podés bypassear, es por esto que siempre opté porque se haga todo desde el lado servidor y no desde el Cliente ...
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
Responder
#7
Si lo único que vas a hacer es decir que vos lo podés bypassear o hacer mejor no tiene mucho sentido que comentes. Si querés compartir algo compartilo, sino ni comentes.
[Imagen: paypalqr.png]
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)