2017-10-04 47 views
-3

Je lis sur Windows et Accrocher les entrailles de executables Win32 (https://en.wikipedia.org/wiki/Hooking#Windows) et a vu ce bloc de code:IMAGE_DOS_HEADER Accrocher

PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module; 
PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew); 
PIMAGE_IMPORT_DESCRIPTOR pImgImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)pImgDosHeaders + pImgNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); 

for (IMAGE_IMPORT_DESCRIPTOR *iid = pImgImportDesc; iid->Name != NULL; iid++) 

Mon C est un peu rouillé et je dois probablement rafraîchir (pointeurs toujours me confondre), mais je pense que la façon dont cela fonctionne est de créer un pointeur IMAGE_IMPORT_DESCRIPTOR appelé iid. iid pointe vers un IMAGE_IMPORT_DESCRIPTOR et est défini sur un objet nommé pImgImportDesc. Donc, il regarde pImgImportDesc propriété Name, et si elle n'est pas définie, il ira à la suivante? Donc, fondamentalement, il cherche le dernier?

Aussi des recommandations pour des livres ou des vidéos pour voir plus sur les choses de très bas niveau comme ça? La lecture du code m'a tout confondu.

+0

Il ira à côté si elle est ** ** ensemble. Donc, ça passe par-dessus chacun d'eux. – rkapl

+1

Le code analyse un en-tête PE. Il n'y a pas d'accroche nulle part, et ce n'est pas du tout un niveau bas. Poser des questions sur la syntaxe C de base n'est pas ce à quoi Stack Overflow est destiné. – IInspectable

+0

Merci pour l'entrée, mais comment est-ce pas bas niveau?Je veux dire ne traite pas des en-têtes PE à un niveau assez bas, à moins que vous ne le compariez à l'assemblage (je demande sincèrement, je ne suis pas très familier avec ça). Désolé la plupart de mes antécédents dans tout type de programmation est de haut niveau java/développement web, j'essayais juste de faire face à des trucs comme ça. J'ai vu beaucoup de questions ici traitant des explications/syntaxes de base pour certaines choses. – JimmySmithJR

Répondre

5
PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module; 
  • Un processus se charge à une adresse mémoire particulière du choix du système d'exploitation. Le handle d'instance HMODULE pour le processus est le même que son adresse de chargement. Il s'agit donc d'un pointeur vers la structure IMAGE_DOS_HEADER du processus au début de l'adresse de chargement.

PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew); 
  • Le champ e_lfanew est le décalage de struct IMAGE_NT_HEADERS du processus. Il est en train de transtyper pImgDosHeaders en un pointeur BYTE*, en incrémentant sa valeur par e_lfanew octets, puis en transtypant le résultat en IMAGE_NT_HEADERS*.

PIMAGE_IMPORT_DESCRIPTOR pImgImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)pImgDosHeaders + pImgNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); 
  • Même chose que ci-dessus. DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress est un décalage par rapport à la première structure IMAGE_IMPORT_DESCRIPTOR de la table Imports du processus. pImgDosHeaders est incrémenté par autant d'octets, puis est transtypé en IMAGE_IMPORT_DESCRIPTOR*.

for (IMAGE_IMPORT_DESCRIPTOR *iid = pImgImportDesc; iid->Name != NULL; iid++) 
  • C'est une boucle à travers l'ensemble de la table des importations. iid pointe vers le premier descripteur de la table et la boucle continue à travers la table jusqu'à ce qu'elle trouve un descripteur sans Name affecté, indiquant la fin de la table.

Lire cet article MSDN pour plus de détails:

Peering Inside the PE: A Tour of the Win32 Portable Executable File Format