Guida Portable Executable Time - Data di compilazione (analisi forense) C++ opensource

JunkCoder

Moderatore
5 Giugno 2020
1,686
25
1,504
653
[TITOLO]PET - Portable Executable Time[/TITOLO]

pet_screen.png

pet_ffox.png

Ho fatto questo progetto per due motivi: il primo e' che mi ero stancato di estrarre il timestamp in hex dall'header del PE e cercare un convertitore online che potesse convertirlo in data leggibile. Il secondo e' che da vero pazzo volevo fare una GUI solo con le API basso livello di Windows (user32) senza ulteriori lib.

Nel download trovate il tool compilato e i source con tanto di solution e risorse, e' in grado di estrarre il tempo di compilazione da qualunque PE (.exe, .dll...) sia a 32 che a 64 bit. Il timestamp di compilazione puo' essere "taroccato" ma fin ora l'ho visto solo fare solo da pochissimi malware, tanto che molti ricercatori si fidano spesso di questo valore e lo usano per tracciare i "progressi" di chi scrive malware.

La parte che estrae il timestamp in particolare e' la seguente:
C++:
void GetPETimestamp(BYTE* pImage, DWORD dwSize)
{
    PIMAGE_DOS_HEADER dosHdr = (PIMAGE_DOS_HEADER)pImage;
    if (dosHdr->e_magic != IMAGE_DOS_SIGNATURE)
    {
        ShowMessage(L"Not a valid PE file");
        return;
    }
    PIMAGE_NT_HEADERS ntHdr = (PIMAGE_NT_HEADERS)(pImage + dosHdr->e_lfanew);
    DWORD dwTime = ntHdr->FileHeader.TimeDateStamp;
    __time32_t time32 = (__time32_t)dwTime;
    struct tm t;
    _localtime32_s(&t, &time32);
    wchar_t result[128];
    swprintf_s(result, L"PE compilation timestamp is: 0x%08X\r\nIn local time: %d-%02d-%02d %02d:%02d"
        , dwTime, (t.tm_year + 1900), (t.tm_mon + 1), t.tm_mday, t.tm_hour, t.tm_min);

    ShowMessage(result, FALSE);
}


Download