Se le estensioni dei file sono state incasinate, come si può distinguere un eseguibile da una DLL?Come sapere se un file è un EXE o una DLL?
Entrambi sembrano avere punti di ingresso e tutto ...
Se le estensioni dei file sono state incasinate, come si può distinguere un eseguibile da una DLL?Come sapere se un file è un EXE o una DLL?
Entrambi sembrano avere punti di ingresso e tutto ...
Vedere this article per una buona spiegazione di un eseguibile portatile su Windows.
E poi guarda la sezione sull'intestazione PE. Anche il codice there-in mostra in C il modo di aprire ed esaminare un file PE usando Win32. Questa informazione che stai cercando è memorizzata nello IMAGE_FILE_HEADER. Nello specifico nel campo Characteristics
che includerebbe la bandiera IMAGE_FILE_DLL 0x2000
se è una dll.
Questo dovrebbe fornire informazioni sufficienti per creare una piccola utility che rende la determinazione di un gruppo di file, se questo è ciò che stai cercando.
I bit di codice più rilevanti a scopo di riferimento, copiati dall'articolo precedente e modificati per rimuovere dettagli estranei/gestione degli errori.
void DumpFile(LPWSTR filename)
{
HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
LPVOID lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpFileBase;
PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + (DWORD)pDosHeader->e_lfanew);
if ((pNTHeader->FileHeader.Characteristics & IMAGE_FILE_DLL))
printf("dll");
if ((pNTHeader->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE))
printf("exe");
else
printf("????");
UnmapViewOfFile(lpFileBase);
CloseHandle(hFileMapping);
CloseHandle(hFile);
}
Grab OllyDbg e aprire il file EXE/DLL in esso. Apri la mappa della memoria facendo clic sul grande pulsante M in alto. Scorri verso il basso fino a trovare l'intestazione PE del modulo che corrisponde al tuo programma. Fare doppio clic per aprirlo nel dump della memoria. Scorri verso il basso fino a dove vedi la firma PE (probabilmente 0xF8 dalla base immagine) e se è una DLL, le caratteristiche avranno la bandiera DLL su di essa. Le caratteristiche dovrebbero essere un po 'scadute dalla firma PE.
dumpbin *.* | grep "File Type"
funziona per me. Non ricordo esattamente cosa usare se non hai installato grep, ma ti suggerisco di farlo.
Queste informazioni si trovano nell'intestazione PE. Per visualizzarlo, è possibile aprirlo con un programma di esplorazione PE come NTCore CFF Explorer e aprire il campo Characterics dell'intestazione del file, in cui è possibile verificare se si tratta di una DLL o di un file eseguibile.
+1 questo è fantastico. Grazie! – Mehrdad
se chiunque sia interessato ecco il codice in C#, testati per file PE 32 bit.
public static class PECheck
{
public static bool IsDll(Stream stream)
{
using (BinaryReader reader = new BinaryReader(stream))
{
byte[] header = reader.ReadBytes(2); //Read MZ
if (header[0] != (byte)'M' && header[1] != (byte)'Z')
throw new Exception("Invalid PE file");
stream.Seek(64 - 4, SeekOrigin.Begin);//read elf_new this is the offset where the IMAGE_NT_HEADER begins
int offset = reader.ReadInt32();
stream.Seek(offset, SeekOrigin.Begin);
header = reader.ReadBytes(2);
if (header[0] != (byte)'P' && header[1] != (byte)'E')
throw new Exception("Invalid PE file");
stream.Seek(20, SeekOrigin.Current); //point to last word of IMAGE_FILE_HEADER
short readInt16 = reader.ReadInt16();
return (readInt16 & 0x2000) == 0x2000;
}
}
}
a livello di programmazione? – CharlesB
@OmerPT, @CharlesB: Intendo più simile alle loro caratteristiche (ad esempio le intestazioni PE, il loro smontaggio, ecc.) – Mehrdad
Rinominarlo con estensione 'exe' e provare ad eseguirlo in un ambiente Windows. Se fa qualcosa, è un exe. : P Sono davvero curioso anche di questo ... – bdares