Fonction C++ Crochet (adresse mémoire uniquement)
J'ai une adresse en mémoire, à la mémoire d'adresse d'une fonction dans un autre programme (l'un de ses dll). Je suis déjà chargé dans le programme par injection de DLL. J'ai déjà la basse de l'adresse et de l'emplacement réel de la fonction à chaque fois que le programme se charge. Donc, ce n'est pas un problème.
Je veux juste simplement un crochet que l'emplacement, et de saisir les variables. Je sais que la fonction de pseudo-code. Ce n'est donc pas un problème. OU une autre approche qui serait génial c'est de faire un point d'arrêt à cet emplacement de la mémoire et de saisir les registres de débogage.
Je ne peut pas trouver un clair exemple de ceci. Je n'aime pas le "nom" de la fonction, j'ai juste l'adresse de la mémoire. Est-il possible de travailler avec une adresse de mémoire? La plupart, si pas tous les exemples que vous utilisez le nom de la fonction, je n'ai pas.
Si quelqu'un pouvait me pointer dans la bonne direction afin que je puisse accomplir cette tâche, je vous en serais très reconnaissante. Il se peut aussi aider beaucoup d'autres personnes qui peuvent avoir la même question.
Modifier: je dois aussi mentionner que je préfère ne pas surcharger mon programme avec quelqu'un d'autre code, je veux juste que les barebones, beaucoup comme une base pour la voiture avec un roll-up de windows. Pas de forfaits de luxe, pour moi, s'il vous plaît.
OriginalL'auteur User | 2012-10-23
Vous devez vous connecter pour publier un commentaire.
Vous avez manqué la partie la plus importante, est-ce pour 32 ou 64 bits de code? En tout cas, le projet de code a une bonne et lib ici qui couvre à la fois.
Si vous souhaitez faire de cette "vieille école", alors il peut être fait tout simplement:
tout d'abord, vous devez trouver l'adresse virtuelle de la fonction que vous voulez crochet (en raison de l'ASLR, vous ne devez jamais compter sur d'être dans le même lieu), ce qui est généralement fait avec de la RVA + module de la base de l'adresse de chargement pour les fonctions qui ne sont pas exportés, pour des fonctions exportées, vous pouvez utiliser
GetProcAddress
.À partir de là, le type crochet dépend de ce que vous voulez accomplir, dans votre cas, il existe deux méthodes:
la première est plus simple, mais salissant car elle implique généralement certains assembly en ligne (sauf si vous êtes un accrochage
/HOTPATCH
binaire ou vous voulez juste stub), la deuxième est beaucoup plus propre, mais nécessite un peu de travail à l'aide d'un débogueur.La fonction que vous allez sauter de doivent avoir les mêmes paramètres et la convention d'appel (ABI) comme la fonction d'accrochage, cette fonction est où vous pouvez saisir les paramètres passés, de les manipuler, de filtrer les appels ou ce que vous êtes après.
pour les deux, vous avez besoin d'un moyen d'écrire un peu de montage à faire les finitions, sous windows,
WriteProcessMemory
est votre premier port d'escale (remarque: vous avez besoin de permissions RWX pour ce faire, d'où les appels àVirtualProtect
), c'est un peu la fonction d'utilité qui crée un 32bit relative de l'appel ou de sauter (en fonction de l'opcode passé commeeType
)Cette fonction fonctionne très bien pour la méthode 2, mais pour la méthode 1, vous aurez besoin de sauter à un intermédiaire de l'assemblée du trampoline à restaurer n'importe quel code que le patch a remplacé, avant de revenir à la fonction d'origine, cela devient très fastidieux, c'est pourquoi il vaut mieux utiliser un existant et testé bibliothèque.
De les sons de celui-ci, à l'aide de la méthode 1 et de la correction d'un saut sur le prologue de votre cible en fonction de tout ce dont vous avez besoin, car il semble que vous n'avez pas de soins sur l'exécution de la fonction que vous avez patché.
(il existe une troisième méthode à l'aide de HW points d'arrêt, mais c'est très fragile, et peut devenir problématique, que vous êtes limité à 4 HW points d'arrêt).
la première partie oui, mais la deuxième partie répond à la question.
Êtes-vous absolument sûr que cela fonctionne seulement avec les emplacements de la mémoire? Dans les exemples que je les vois, en utilisant des noms de fonctions à rechercher dans la DLL, je n'ai pas.
oui, au lieu d'utiliser
GetProcAddress
, vous devriez juste jeté l'AV de la fonction pour accrocher à unvoid*
/ULONG_PTR
Merci pour cet aperçu détaillé de ce qui doit arriver. J'ai vraiment l'apprécier, et je suis sûr que d'autres personnes le faire.
OriginalL'auteur Necrolis
Votre "exemple" est ici:
http://www.codeproject.com/Articles/4610/Three-Ways-to-Inject-Your-Code-into-Another-Proces#section_1
Normalement, lorsque vous "crochet" dans la DLL, vous mettez votre fonction en face de l'un dans la DLL qui est appelé, de sorte que votre fonction est appelé à la place. Vous capturez ce que vous voulez, l'appel de la fonction, la capture de ses valeurs de retour et tout le reste, puis retourner à l'appel original.
OriginalL'auteur CashCow