8
votes

Crochet ZwterminateProcessé dans le pilote X64 (sans SSDT)

J'ai trouvé et j'ai lu cette question mais je n'ai pas trouvé ma réponse SSDT Accrochage alternative dans les systèmes X64 forts>

Je tiens à protéger ma demande de résiliation par d'autres programmes. Dans la version 32 bits de Windows, j'ai utilisé l'accrochage code> SSDT CODE> pour connecter zwterminateProcess code> ou zwopenprocess code>. Je dois mettre à niveau mon programme pour utiliser la version 64 bits de Windows maintenant. Et malheureusement dans les fenêtres 64 bits, nous ne pouvons pas utiliser ssdt code> Hook ( parce que Patch Guard (KPP) strong> ), remarquez que je ne veux pas contourner PG dans ce cas et que je n'ai utilisé que l'accrochage en mode noyau. Par exemple, je ne veux pas commencer mon programme terminé (même) par le code suivant: p> xxx pré>

Pour effectuer ce travail, j'ai utilisé la fonction suivante ( NewzwopenProcess code>) et remplacez-le par l'original zwopenprocess code> dans SSDT mais dans X64 Windows, je ne sais pas que dois-je faire :(: p>

NTSTATUS NewZwOpenProcess(
        OUT PHANDLE ProcessHandle,
        IN ACCESS_MASK DesiredAccess,
        IN POBJECT_ATTRIBUTES ObjectAttributes,
        IN PCLIENT_ID ClientId OPTIONAL)
{
        HANDLE ProcessId;

    __try 
    {
            ProcessId = ClientId->UniqueProcess;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
       return STATUS_INVALID_PARAMETER;
    }
   
   if (ProcessId == (HANDLE)11) //Check if the PID matches our protected process PID (My programm)
    {
     return STATUS_ACCESS_DENIED; 
    }
  else 
    return OldZwOpenProcess(ProcessHandle, DesiredAccess,ObjectAttributes, ClientId);
}


4 commentaires

Et c'est pourquoi nous aimons le protège-patch.


@Hanspassant :), oui, nous aimons PG, mais je développe un logiciel de sécurité et c'est important pour moi de protéger mes programmes.


Microsoft a développé PG afin que vous n'ayez plus besoin de ce genre de hacks gawdawful.


@Hanspassant Oui Vous avez raison, mais PG n'empêche que les cochons malveillants de rootkits et de mode noyau et n'est pas pour la défense des utilisateurs.


4 Réponses :


13
votes

J'ai trouvé ma réponse, j'utilise Mode Kernel Callbacks.

#include <ntddk.h>

// coded by Behrooz

//-----------------------------------------------
//  Defines
//-----------------------------------------------

//Process Security and Access Rights
#define PROCESS_CREATE_THREAD  (0x0002)
#define PROCESS_CREATE_PROCESS (0x0080)
#define PROCESS_TERMINATE      (0x0001)
#define PROCESS_VM_WRITE       (0x0020)
#define PROCESS_VM_READ        (0x0010)
#define PROCESS_VM_OPERATION   (0x0008)
#define PROCESS_SUSPEND_RESUME (0x0800)


#define MAXIMUM_FILENAME_LENGTH 256
//-----------------------------------------------
// callback
//-----------------------------------------------

PVOID _CallBacks_Handle = NULL;

typedef struct _OB_REG_CONTEXT {
    __in USHORT Version;
    __in UNICODE_STRING Altitude;
    __in USHORT ulIndex;
    OB_OPERATION_REGISTRATION *OperationRegistration;
} REG_CONTEXT, *PREG_CONTEXT;


//-----------------------------------------------
// PID2ProcName
//-----------------------------------------------
extern UCHAR *PsGetProcessImageFileName(IN PEPROCESS Process);

extern   NTSTATUS PsLookupProcessByProcessId(
     HANDLE ProcessId,
    PEPROCESS *Process
);
typedef PCHAR (*GET_PROCESS_IMAGE_NAME) (PEPROCESS Process);
GET_PROCESS_IMAGE_NAME gGetProcessImageFileName;

LPSTR GetProcessNameFromPid(HANDLE pid);



//-----------------------------------------------
//  Forward Declaration
//-----------------------------------------------
NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT DriverObject, 
    IN PUNICODE_STRING RegistryPath
    );

VOID UnloadDriver(
    IN PDRIVER_OBJECT DriverObject
    );

OB_PREOP_CALLBACK_STATUS ObjectPreCallback(
  IN  PVOID RegistrationContext,
  IN  POB_PRE_OPERATION_INFORMATION OperationInformation
  );

VOID ObjectPostCallback(
  IN  PVOID RegistrationContext,
  IN  POB_POST_OPERATION_INFORMATION OperationInformation
  );

NTSTATUS RegisterCallbackFunction() ;
NTSTATUS FreeProcFilter();


5 commentaires

Merci de partager, dites-moi quelle version de WDK utilisez-vous?


@navossoc de votre choix, Winddk Ver 7600.16385.1


J'ai essayé ce code mais le obregistristercallbacks retour Status_access_denied Même si j'ai signé mon pilote. aidez-moi s'il vous plaît,


@Behroz, votre solution fonctionne également dans Windows 32 bits?


@Behroz, pouvez-vous partager le fichier .inf que vous avez utilisé?



2
votes

Quelqu'un peut faire "obunregistercallbacks" et même enregistrer leur propre pour vous empêcher de le détecter.


1 commentaires

Et votre propre code peut vérifier si le rappel est toujours présent. C'est ce que le plus décent AVS ou ACS le fait, ils tentent d'enregistrer à nouveau le rappel, et si l'action réussit, le rappel a été supprimé de manière à punir!



3
votes

Merci pour votre code et je l'essaie de réussir Win10 x64. BTW, j'ai été trouvé que l'ObregisterCallbacks retour Statut_access_denied, même si j'ai signé mon pilote. Donc, je demande beaucoup de peuples, puis je trouve une solution pour cela. Ajouter ce texte dans votre fichier "source": Linker_Flags = / IntegrityCheck

Ensuite, vous pouvez reconstruire et résoudre votre conducteur. Il a été trouvé dans bbs.pediy.com


0 commentaires

1
votes

On dirait que le fichier .inf n'est pas nécessaire. Juste SC Créer un nom de serveur = noyau binpath = pathtoyourfile.


0 commentaires