J'ai un problème avec le chargement d'une adresse 64 bits dans un registre à partir d'un LKM en utilisant l'assemblage en ligne arm64. J'essaye de configurer un crochet de fonction dans la mémoire de noyau. Donc, à chaque fois qu'une fonction spécifique est appelée, elle doit se connecter à ma fonction à la place.ARM64 - branche d'assemblage à l'adresse de fonction
Mon idée était de charger une adresse dans un registre, qui est obtenu lors de l'exécution en utilisant ceci:
unsigned long address = &hooked_do_undefinstr;
Et puis écrire l'opcode correspondant de
BLR X3
dans la mémoire.
J'ai essayé de charger l'adresse dans X3 registre (parce que son un OS 64 bits) avec
__asm__ __volatile__ ("MOV x3, %[var]" : [var] "=r" (address));
Parce que je dois obtenir l'adresse lors de l'exécution, je ne peux pas utiliser la commande LDR. lors de l'insertion du module je reçois l'erreur suivante:
[email protected]___ :~# insmod mod_init.ko
[ 70.386938] mod_init: Unknown symbol x19 (err 0)
[ 70.391508] mod_init: Unknown symbol x3 (err 0)
Avec cette commande, la sortie quand j'imprimer le contenu X3 est égal à zéro:
[ 558.948492] MOV x3 Register value 0x0
Ma question est maintenant, est-il un moyen de charger une adresse 64bit dans un registre? Ou y a-t-il une meilleure façon d'implémenter ma fonction hook pour passer à mon adresse?
Salutations et merci pour votre aide
Merci pour votre réponse. Je n'ai pas pensé, que le registre pourrait être écrasé. J'ai déjà désactivé la protection en écriture de la mémoire et créé une sauvegarde pour le code que j'écrase. De plus, je dois convertir votre code hexadécimal en little endian. Avec votre code je devrais enregistrer (à partir des entrées d'origine) 8Byte pour les deux commandes plus 8 octets pour l'adresse droite? Mais j'essaie ça. Merci encore – MajorasKid
Edit: je viens de vérifier et j'ai vu que votre OPCode est déjà en petit boutiste – MajorasKid