Qu'est-ce que l'injection de DLL et comment est-il utilisé pour inverser l'ingénierie inverse Stack échange

La réponse de DCoder est bonne. Pour étendre l'utilisation un peu, je le plus souvent injection DLL dans le contexte de forcer un processus existant pour charger une DLL par CreateRemoteThread. De là, le point d'entrée de la DLL sera exécuté par le système d'exploitation une fois qu'il est chargé. Dans le point d'entrée, je puis appeler une routine qui exécute patcher en mémoire de tous les endroits dans le binaire original qui me intéressent, et réoriente leur exécution dans ma DLL via une variété de modifications. Si je suis intéressé à modifier ou d'observer l'interaction du processus avec une fonction importée, alors j'écrasera l'entrée IAT pour cette fonction et le remplacer par un pointeur vers quelque chose que je contrôle. Si je veux faire la même chose par rapport à une fonction qui existe dans le binaire, je vais faire une sorte de patch-style au début des détours de la fonction. Je peux même faire des crochets très chirurgicaux et ciblés à des endroits arbitraires, semblables à patcher octets old-school. Mon DLL fait ses affaires dans les crochets individuels, puis est programmé pour rediriger le contrôle au processus original.







injection DLL fournit une plate-forme pour manipuler l'exécution d'un processus en cours d'exécution. Il est très souvent utilisé pour les informations de journalisation en ingénierie inverse. Par exemple, vous pouvez brancher l'entrée IAT pour une fonction de bibliothèque du système d'exploitation importé donné, puis connectez-vous les arguments de la fonction sur le disque. Cela vous donne une source de données qui peuvent aider à inverser rapidement la cible d'ingénierie.

injection DLL ne se limite pas à l'exploitation forestière, cependant. Compte tenu du fait que vous avez le champ libre pour exécuter tout le code que vous voulez dans le processus espace d'adressage, vous pouvez modifier le programme de quelque façon que vous choisissez. Cette technique est souvent utilisée dans le monde de piratage de jeu pour coder les robots.

Tout ce que vous pourriez faire avec patching octets, vous pouvez le faire avec l'injection de DLL. Sauf injection DLL sera probablement plus facile et plus rapide, parce que vous pouvez coder vos patchs en C au lieu de langage assembleur et ne pas au travail sur faire des modifications manuelles au fichier binaire et sa structure de PE, trouver des grottes de code, etc. injection de DLL presque entièrement élimine la nécessité d'utiliser le langage d'assemblage tout en faisant à un binaire des modifications; la seule langue d'assemblage nécessaire sera de petits morceaux de code à proximité de l'entrée et de sortie à un crochet particulier pour sauver et restaurer les valeurs des registres / les drapeaux. Il fait également une modification binaire simple et rapide, et ne modifie pas les signatures de chiffrement de l'exécutable que vous patcher.

injection DLL peut être utilisé pour résoudre des problèmes d'ingénierie inverse très non triviales. L'exemple suivant est nécessairement vague à certains égards, en raison des accords de non-divulgation.







J'employé une solution à base d'injection DLL qui a fonctionné comme suit:

Au début, je faisais tout cela à la main pour chaque nouvelle construction. C'était trop fastidieuse. Un code de la version I d'injection DLL, je ne devais entreprendre ce travail important et manuel jamais.

injection DLL est pas très connu ou utilisé dans l'ingénierie inverse à l'extérieur de piratage informatique de jeu. Ceci est très regrettable, car il est une technique extrêmement puissante, flexible et simple qui devrait faire partie du répertoire de tout le monde. Je l'ai utilisé des dizaines de fois et il semble trouver un rôle dans tous mes projets dynamiques. Au moment où ma tâche devient trop lourd à faire avec un script de débogage, je passe à l'injection DLL.

Dans le spectre des techniques d'ingénierie inverse, toutes les capacités d'injection DLL est proposée par instrumentation binaire dynamique (DBI) des outils aussi bien, et DBI est encore plus puissant encore. Cependant, DBI n'est pas furtive et encourt une surcharge grave en termes de consommation de mémoire et peut-être la performance. J'essaie toujours d'utiliser l'injection de DLL avant de passer à DBI.

Pour certaines ressources sur l'injection de DLL, il y a une grande série en huit parties sur l'écriture d'un bot de poker basé par injection de DLL. Vois ici ; commencer par le bas et lire les entrées numérotées dans l'ordre.

Injection DLL fonctionne en piégeant / forcer le processus cible dans le chargement d'une DLL de votre choix. Après cela, le code dans cette DLL va s'exécuter dans le cadre du processus cible et sera en mesure de faire quoi que ce soit le processus lui-même peut. La partie amusante sera de comprendre comment obtenir votre code appelé par le processus cible.

DLL peuvent être injectées par:

  • en remplaçant simplement votre DLL pour un processus utilise généralement - par exemple si vous nommez votre DLL ddraw.dll. beaucoup de jeux se fera un plaisir charger au lieu de la DLL réelle Direct Draw. Je l'ai vu ce fait pour forcer le jeu à utiliser Direct Draw en mode émulation logicielle uniquement, pour accélérer sur processeurs graphiques spécifiques.
  • trompant le chargeur dans le chargement d'une DLL connue à partir d'un autre dossier - voir The Old New Thing.
  • en remplaçant une partie du code de procédure avec des instructions pour charger votre DLL.
  • en utilisant beaucoup d'autres façons.

La prochaine étape sera l'obtention de votre code de DLL pour exécuter réellement. Mais si vous voulez faire quelque chose de significatif, ce sera difficile - vous devez savoir ce que le processus fait, quelles structures de données qu'il utilise, etc. de sorte que vous aurez probablement besoin de le démonter.

  • Vous pouvez créer un nouveau thread dans le processus cible pour invoquer une fonction de votre DLL. Suspendre les threads existants d'abord pour préserver votre santé mentale et d'éviter les bugs de multithreading funky.
  • Si vous remplacez une DLL connue avec votre propre, le processus s'attendra votre DLL pour répondre aux appels de fonctions spécifiques - vous feriez mieux de savoir ce que ces fonctions sont et fournir leurs remplaçants dans votre DLL.
  • Si vous avez modifié l'exécutable pour appeler votre DLL en plus de DLL connus. vous avez dû prendre l'exécutable en dehors déjà. Maintenant, allez trouver des lieux d'intérêt, et insérez des appels à vos fonctions DLL là-bas. Voir la grotte de code.

J'ai effectué une injection DLL en lançant le processus cible en tant que processus débogué, quelques octets en écrasant son code de démarrage avec une séquence de code personnalisé qui appelle LoadLibrary ( « mydll.dll »); GetProcAddress (myLib, "myFunc") ;. et la réécriture du code dans l'exécutable pour passer à des fonctions dans la DLL à la place.

En utilisant cette méthode quelques amis et moi avons écrit une assez grande DLL non officielle bugfix / amélioration du Commandement - Conquer: Red Alert 2 - aujourd'hui que DLL est d'environ 15% la taille de l'exécutable du jeu original. Par conséquent, les mises à jour plus tard officielles du jeu étaient limitées aux seules choses leur personnel pourrait faire sans recompiler le binaire, qui était inhabituellement gentil de EA.

répondu le 14 juin '13 à 16h02







Articles Liés