
Primitives alternatives de lecture et d'écriture utilisant les fonctions Rtl* de manière détournée.
Un dépôt contenant des scripts pour démontrer des primitives de lecture et d'écriture alternatives utilisant les fonctions Rtl* d'une manière non conventionnelle.
RtlFillMemory prend trois arguments : un pointeur vers la mémoire de destination, le nombre d'octets à écrire, et une valeur d'un seul octet. Elle n'écrit qu'un octet dans le bloc mémoire spécifié.
Primitive d'écriture utilisant une combinaison de RtlInitializeBitMapEx et RtlFillMemory.
D'abord, elle parcourt la chaîne par blocs de 16 octets, en divisant chaque bloc en deux valeurs de 8 octets. Le premier bloc de 8 octets est stocké dans le premier argument de RtlInitializeBitMapEx et le second bloc de 8 octets est stocké dans le second argument.
Ensuite, s'il reste un bloc supplémentaire de 8 octets, elle l'écrit en utilisant RtlInitializeBitMapEx avec un second paramètre NULL.
Enfin, s'il reste moins de 8 octets, elle les écrit un octet à la fois en utilisant RtlFillMemory jusqu'à ce que la chaîne entière soit copiée dans le tampon de destination.
Primitive de lecture utilisant RtlQueryDepthSList. Utile pour la recherche de gadgets ROP, la comparaison d'octets, la détection de hooks, etc. Ici, je démontre une simple injection de processus avec un gadget ROP. RtlQueryDepthSList accepte un seul argument — l'adresse mémoire à lire, mais elle ne lit que 2 octets et retourne une valeur de 4 octets.