Saya ingin menentukan apakah perakitan asli dipenuhi sebagai x64 atau x86 dari aplikasi kode terkelola ( C # ).
Saya pikir itu pasti di suatu tempat di header PE karena loader OS perlu mengetahui informasi ini, tetapi saya tidak dapat menemukannya. Tentu saja saya lebih suka melakukannya dalam kode yang dikelola, tetapi jika perlu, saya bisa menggunakan bahasa asli C ++.
Jawaban:
Anda dapat menggunakan DUMPBIN juga. Gunakan bendera
/headers
atau/all
dan header file pertama yang terdaftar.64-bit
32-bit
'temukan' dapat membuat hidup sedikit lebih mudah:
sumber
mspdb100.dll
:(mspdb100.dll
ke folder di manadumpbin.exe
berada.DUMPBIN
bisa lari setelah itu. Bagi saya, EXE di<Visual Studio Install folder>\VC\bin
dan DLL di<Visual Studio Install folder>\Common7\IDE
.Ada cara mudah untuk melakukan ini dengan CorFlags . Buka Prompt Perintah Visual Studio dan ketik "corflags [perakitan Anda]". Anda akan mendapatkan sesuatu seperti ini:
Anda sedang melihat PE dan 32BIT secara khusus.
CPU apa pun :
PE: PE32
32BIT: 0
x86 :
PE: PE32
32BIT: 1
x64:
PE: PE32 +
32BIT: 0
sumber
Trik ini berfungsi dan hanya membutuhkan Notepad.
Buka file dll menggunakan editor teks (seperti Notepad) dan temukan kemunculan pertama string
PE
. Karakter berikut mendefinisikan apakah dll adalah 32 atau 64 bit.32 bit:
64 bit:
sumber
The
Magic
bidangIMAGE_OPTIONAL_HEADER
(meskipun tidak ada opsional tentang header pada Windows gambar executable (file DLL / EXE)) akan memberitahu Anda arsitektur PE.Berikut adalah contoh mengambil arsitektur dari file.
Dua konstanta arsitektur saat ini adalah:
Bersulang
PEMBARUAN Sudah lama sejak saya memposting jawaban ini, namun saya masih melihat bahwa itu mendapat beberapa upvotes sekarang dan lagi jadi saya pikir itu layak diperbarui. Saya menulis cara untuk mendapatkan arsitektur
Portable Executable
gambar, yang juga memeriksa untuk melihat apakah itu dikompilasiAnyCPU
. Sayangnya jawabannya adalah dalam C ++, tetapi seharusnya tidak terlalu sulit untuk port ke C # jika Anda memiliki beberapa menit untuk mencari struktur diWinNT.h
. Jika orang tertarik, saya akan menulis porta dalam C #, tetapi kecuali orang benar-benar menginginkannya, saya tidak akan menghabiskan banyak waktu untuk menekankannya.Fungsi ini menerima pointer ke gambar PE dalam memori (sehingga Anda dapat memilih racun Anda tentang cara mendapatkannya; memetakan memori atau membaca semuanya ke dalam memori ... apa pun).
sumber
32BIT
benderanya dari dalam PE, saya tidak tahu dari atas kepala saya.Untuk file DLL yang tidak dikelola, Anda harus terlebih dahulu memeriksa apakah itu file DLL 16-bit (mudah-mudahan tidak). Kemudian periksa
IMAGE\_FILE_HEADER.Machine
bidangnya.Orang lain sudah mengambil waktu untuk menyelesaikan ini, jadi saya hanya akan mengulangi di sini:
sumber
Anda dapat menemukan implementasi sampel C # di sini untuk
IMAGE_FILE_HEADER
solusinyasumber
Binari 64-bit disimpan dalam format PE32 +. Coba baca http://www.masm32.com/board/index.php?action=dlattach;topic=6687.0;id=3486
sumber
Buka dll dengan hex editor, seperti HxD
Jika ada "dt" pada baris ke-9 itu adalah 64bit.
Jika ada "L." pada baris ke-9 itu adalah 32bit.
sumber
Saya menulis ulang solusi c ++ sebagai jawaban pertama dalam skrip PowerShell. Script dapat menentukan jenis file .exe dan .dll ini:
solusi ini memiliki beberapa keunggulan dibandingkan corflags.exe dan memuat perakitan melalui Assembly.Load di C # - Anda tidak akan pernah mendapatkan BadImageFormatException atau pesan tentang header yang tidak valid.
contoh penggunaan:
Anda dapat menghilangkan parameter kedua jika Anda tidak perlu melihat detailnya
sumber
Cara cepat dan mungkin kotor untuk melakukannya dijelaskan di sini: https://superuser.com/a/889267 . Anda membuka DLL dalam editor dan memeriksa karakter pertama setelah urutan "PE".
sumber
Rupanya Anda dapat menemukannya di header portable executable. Utilitas corflags.exe dapat menunjukkan kepada Anda apakah ia menargetkan x64 atau tidak. Semoga ini membantu Anda menemukan lebih banyak informasi tentang itu.
sumber
>corflags libzmq.dll \n\n ... corflags : error CF008 : The specified file does not have a valid managed header