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 Pour effectuer ce travail, j'ai utilisé la fonction suivante ( 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 ( 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 Réponses :
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();
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 code> retour Status_access_denied code> 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é?
Quelqu'un peut faire "obunregistercallbacks" et même enregistrer leur propre pour vous empêcher de le détecter. P>
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!
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 P>
Ensuite, vous pouvez reconstruire et résoudre votre conducteur. Il a été trouvé dans bbs.pediy.com p>
On dirait que le fichier .inf n'est pas nécessaire. Juste SC Créer un nom de serveur = noyau binpath = pathtoyourfile. p>
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.