21 Eylül 2017 Perşembe

Portable Executable Formatı

Portable Executable Formatı
Giriş
Portable Executable (PE) Windows'ta binary dosya formatı. PE'yi yüklemek için şöyle yaparız.
auto hmod = LoadLibrary"consolepp.exe";
Compiler Stamp ve Debugger Stamp
Bu timestamp alanlarına artık sabit değer veriliyor. Açıklaması şöyle
One of the changes to the Windows engineering system begun in Windows 10 is the move toward reproducible builds. This means that if you start with the exact same source code, then you should finish with the exact same binary code.

[…]

Timestamps are another source of non-determinism. Even if all the inputs are identical, the outputs will still be different because of the timestamps. [...] Setting the timestamp to be a hash of the resulting binary preserves reproducibility.
DOS Header
PE'nin ilk başı şöyledir.
struct DOS_Header 
 {
     char signature[2] = "MZ";
     short lastsize;
     short nblocks;
     short nreloc;
     short hdrsize;
     short minalloc;
     short maxalloc;
     void *ss;
     void *sp;
     short checksum;
     void *ip;
     void *cs;
     short relocpos;
     short noverlay;
     short reserved1[4];
     short oem_id;
     short oem_info;
     short reserved2[10];
     long  e_lfanew;
 }
İlk MZ Mark Zbikowski'den geliyor.

DOS Stub
EntryPoint'i bulmak için şöyle yaparız.
void runMain(HINSTANCE hInst)
{
  typedef BOOL(WINAPI *PfnMain)(int, char*[]);

  auto imageNtHeaders = ImageNtHeader(hInst);
  auto pfnMain = (PfnMain)(DWORD_PTR)
    (imageNtHeaders->OptionalHeader.AddressOfEntryPoint + (DWORD_PTR)hInst);

  char* args[] = { R"(<console_app_path>)", R"(arg1)", R"(arg2)" };
  pfnMain(3, args);
}

ELF Formatı
ELF Formatı yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder