<p>Details techniques</p>
<p>Un DLL utilise le format d’executable PE, et il n’est pas trop complique de lire ces informations a partir du fichier.</p>
<p>Consultez cet <a href="http://reversingproject.info/wp-content/uploads/2009/05/an_in-depth_look_into_the_win32_portable_executable_file_format_part_1.pdf">article MSDN sur le format de fichier PE</a> pour un apercu. Vous devez lire l’en-tete MS-DOS, puis lire la structure <a href="http://msdn.microsoft.com/en-us/library/ms680336(VS.85).aspx">IMAGE_NT_HEADERS</a>. Celle-ci contient la structure <a href="http://msdn.microsoft.com/en-us/library/ms680313(VS.85).aspx">IMAGE_FILE_HEADER</a> qui contient l’information dont vous avez besoin dans le membre Machine, qui contient l’une des valeurs suivantes :</p>
<ul>
<li>
<p>IMAGE_FILE_MACHINE_I386 (0x014c)</p>
</li>
<li>
<p>IMAGE_FILE_MACHINE_IA64 (0x0200)</p>
</li>
<li>
<p>IMAGE_FILE_MACHINE_AMD64 (0x8664)</p>
</li>
</ul>
<p>Ces informations devraient se trouver a un emplacement fixe dans le fichier, mais je recommanderais tout de meme de parcourir le fichier et de verifier la signature de l’en-tete MS-DOS et de IMAGE_NT_HEADERS pour etre sur de gerer tout changement futur.</p>
<p>Utiliser ImageHelp pour lire les en-tetes…</p>
<p>Vous pouvez egalement utiliser l’<a href="http://msdn.microsoft.com/en-us/library/ms680321(VS.85).aspx">API ImageHelp</a> pour cela - chargez la DLL avec <a href="http://msdn.microsoft.com/en-us/library/ms680209(VS.85).aspx">LoadImage</a> et vous obtiendrez une structure <a href="http://msdn.microsoft.com/en-us/library/ms680349(VS.85).aspx">LOADED_IMAGE</a> qui contiendra un pointeur vers une structure IMAGE_NT_HEADERS. Liberez la LOADED_IMAGE avec ImageUnload.</p>
<p>…ou adaptez ce script Perl approximatif</p>
<p>Voici un script Perl approximatif qui fait le travail. Il verifie que le fichier possede un en-tete DOS, puis lit le decalage PE depuis IMAGE_DOS_HEADER a 60 octets dans le fichier.</p>
<p>Il se positionne ensuite au debut de la partie PE, lit la signature et la verifie, puis extrait la valeur qui nous interesse.</p>
<p>`#!/usr/bin/perl</p>
<h1><a name="p-30034-h-1" class="anchor" href="#p-30034-h-1" aria-label="Heading link"></a></h1>
<h1><a name="p-30034-usage-petype-exefile-2" class="anchor" href="#p-30034-usage-petype-exefile-2" aria-label="Heading link"></a>usage: petype </h1>
<h1><a name="p-30034-h-3" class="anchor" href="#p-30034-h-3" aria-label="Heading link"></a></h1>
<p>$exe = $ARGV[0];</p>
<p>open(EXE, $exe) or die “can’t open $exe: $!”;<br>
binmode(EXE);<br>
if (read(EXE, $doshdr, 64)) {</p>
<p>($magic,$skip,$offset)=unpack(‘a2a58l’, $doshdr);<br>
die("Not a</p>
<p><em>(Reponse tronquee)</em></p>