سؤال كيفية التحقق مما إذا كان الثنائي هو 32 أو 64 بت على Windows؟


هل هناك طريقة سهلة للتحقق مما إذا كان الثنائي هو 32 أو 64 بت على Windows؟ أحتاج إلى التحقق قبل أن أقوم بنقل البرنامج إلى جهاز 32bit وتجربة إخفاق مذهل.


264
2017-11-17 10:29


الأصل


هذا السؤال مشابه، ومع ذلك يتطلب بعض العمل للتحقق من ذلك. - ST3
Guillaume: الصور القابلة للتنفيذ ليست عمليات. يعرض "إدارة المهام" العمليات فقط. - IInspectable
كيف يمكنني تحديد ما إذا كان تطبيق أقوم بتثبيته هو 32 بت أو 64 بت؟ - phuclv


الأجوبة:


بعد فحص قيم الرأس من إجابة ريتشاردلقد توصلت إلى حل سريع وسهل ولا يتطلب سوى محرر نصوص. حتى ويندوز "الافتراضي notepad.exe ستعمل.

  1. افتح الملف التنفيذي في محرر النصوص. قد تضطر إلى السحب والإفلات أو الاستخدام المحرر Open... الحوار ، لأن ويندوز لا تظهر Open with... الخيار في قائمة السياق للملفات التنفيذية.

  2. تحقق من الأحرف الأولى القابلة للطباعة بعد أول ظهور لـ PE. من المرجح أن يكون هذا الجزء محاطًا ببعض المسافات البيضاء على الأقل (يمكن أن يكون كثيرًا منه) ، لذلك يمكن القيام به بسهولة بصريًا.

إليك ما ستجده:

إلى x86:

PE  L

إلى x64:

PE  d†

كلمة للتحذير: استخدام المفكرة الافتراضية على الملفات الكبيرة يمكن أن يكون بطيئًا جدًا ، لذا من الأفضل عدم استخدامه للملفات التي يزيد حجمها عن ميغابايت أو قليل. في حالتي في استغرق حوالي 30 ثانية لعرض ملف 12 MiB. على الرغم من ذلك ، تمكنت Notepad ++ من عرض 120 ميغا بايت قابلة للتنفيذ على الفور تقريبا.

قد يكون هذا الحل مفيدًا إذا احتجت إلى فحص ملف على جهاز لا يمكنك تثبيت أي برامج إضافية عليه.

معلومات إضافية:

إذا كان لديك محرر HEX متاح ، فإن إزاحة توقيع PE موجودة عند الإزاحة 0x3C. التوقيع هو PE\0\0 (الأحرف "P" و "E" متبوعة اثنين بايت البايت) ، متبوعاً بنوع Machine 2 بايت في Little Endian.

القيم ذات الصلة هي 0x8664 ل x64 قابل للتنفيذ و 0x14c ل x86. هناك الكثير من القيم الممكنة ، ولكن ربما لن تواجه أيًا منها ، أو ستتمكن من تشغيل هذه الملفات التنفيذية على كمبيوتر يعمل بنظام Windows.

يمكن العثور على قائمة كاملة بأنواع الماكينات ، إلى جانب باقي مواصفات .exe مواصفات Microsoft PE و COFF  أنواع الآلات الجزء.


277
2018-03-13 17:08



مهلا ، هذا هو بالأحرى hacky. وإلى الأفضل ، لأن هذا في الواقع يبدو أن الحل الأسرع والأسهل للغالبية العظمى من الحالات :) - Septagram
مثال نادر عندما فاز المفكرة على المفكرة ++. يظهر المفكرة هذا الحق ، في المفكرة لديك الفوضى مع الترميز للحصول عليها لإظهار لكنه نجح! - zar
CoDEmanX يعني هذا الخيار أن IDE أو JIT يجعلك تختار. نرى هذا السؤال أو هذا مشاركة مدونة لمزيد من التفاصيل. - Alexander Revo
IInspectable إذا كنت قد ازعجت في الواقع لقراءة كل وظيفة قبل downvoting ذلك ، كنت قد رأيت الرابط ل Microsoft PE and COFF Specification، وهو عقد موثق بقدر ما يمكن الحصول عليه ، بالإضافة إلى تعليمات حول كيفية العثور على العنوان الدقيق لرأس PE في أي .exe ملف. إذا كان لديك مصدر أكثر موثوقية من مواصفات Microsoft الرسمية على تنسيق Microsoft القابل للتنفيذ ، أود أن أعرف ما هو هذا. - Alexander Revo
بالنسبة للملفات التي تبدأ بـ "MZ" ، يجب أن تنظر إلى أبعد قليلاً. لقد وجدت PE..L في الإزاحة 0x110 ، فقط بعد "RichMQ _........". - jnnnnn


أداة SDK dumpbin.exe مع ال /headers يتضمن الخيار هذه المعلومات ، قارن هذين الاثنين (لقد قمت بإضافة الغامق للحصول على المعلومات الأساسية)

PS [64] E: \ # 4> dumpbin / headers C: \ Windows \ system32 \ cmd.exe
Microsoft (R) COFF / PE Dumper Version 10.00.40219.01
حقوق النشر (C) شركة مايكروسوفت. كل الحقوق محفوظة.


تفريغ الملف C: \ Windows \ system32 \ cmd.exe

تم العثور على توقيع PE

نوع الملف: EXECUTABLE IMAGE

قيم ملف الرأس
             8664 آلة (x64)
               6 عدد الأقسام
        4CE798E5 وقت تاريخ الطوابع السبت 20 نوفمبر 09:46:13 2010
               0 مؤشر الملف إلى جدول الرموز
               0 عدد الرموز
              F0 حجم رأسية اختيارية
              22 خصائص
                   تنفيذ
                   يمكن للتطبيق معالجة عناوين كبيرة (> 2GB)
[...]

و

PS [64] E: \ # 5> dumpbin / رؤوس C: \ Windows \ syswow64 \ cmd.exe
Microsoft (R) COFF / PE Dumper Version 10.00.40219.01
حقوق النشر (C) شركة مايكروسوفت. كل الحقوق محفوظة.


تفريغ الملف C: \ Windows \ syswow64 \ cmd.exe

تم العثور على توقيع PE

نوع الملف: EXECUTABLE IMAGE

قيم ملف الرأس
              الجهاز 14C (x86)
               4 عدد الأقسام
        ختم التاريخ الزمني 4CE78E2B السبت 20 نوفمبر 09:00:27 2010
               0 مؤشر الملف إلى جدول الرموز
               0 عدد الرموز
              E0 حجم رأسية اختيارية
             102 الخصائص
                   تنفيذ
                   آلة 32 بت كلمة
[...]

112
2017-11-17 12:14



يمكنك أيضًا رؤية (IA64) لـ 64bit Itanium exe. - Darryl Braaten
كما قرأت في مكان آخر على مستخدم متميز ، باستخدام dumpbin /headers | findstr "machine" يبسط إلى حد كبير عرض ما يبحث عنه ضمان الجودة ... - user1055604
يقع Dumpbin.exe هنا: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin - Devid
David: ليس بالضرورة (إصدار مختلف من VS ، لا يستخدم موقع التثبيت الافتراضي ، باستخدام إصدار من Windows SDK): ولهذا السبب لم أقم بتحديده. - Richard
من الأسهل استخدام dumpbin إذا قمت بتشغيله من سطر أوامر الاستوديو المرئي: stackoverflow.com/a/477389/1390430 - Ben


إذا لم يكن لديك Windows SDK أو Visual Studio بأكمله أو تريده ، فيمكنك استخدامه sigcheck.exe من SysInternals:

sigcheck.exe C:\Windows\Notepad.exe

انتاج:

Sigcheck v2.1 - File version and signature viewer
Copyright (C) 2004-2014 Mark Russinovich
Sysinternals - www.sysinternals.com

c:\windows\notepad.exe:
    Verified:       Signed
    Signing date:   8:59 AM 8/22/2013
    Publisher:      Microsoft Windows
    Description:    Notepad
    Product:        Microsoft« Windows« Operating System
    Prod version:   6.3.9600.16384
    File version:   6.3.9600.16384 (winblue_rtm.130821-1623)
    MachineType:    64-bit

41
2017-09-06 15:02



يبدو أنه غير دقيق دائمًا: حاول استخدامه مع LinqPad.exe (AnyCPU-64bit version) وسيحدد Sigcheck أنه "32 بت" ... - Matt
@ مات مثيرة للاهتمام. يبدو LinqPad مثل التطبيق. أتساءل ما إذا كان sigcheck يعمل بشكل صحيح فقط على الملفات التنفيذية الأصلية (لهذا الغرض). - briantist
نعم ، إنه تطبيق .NET. في .NET ، إذا لم يتم تحويله مسبقًا ، يمكنك إما استهداف "x86" أو "AnyCPU". سيتم تشغيل "x86" دائمًا كـ 32 بت ، ولكن سيتم تشغيل AnyCPU كـ 64 بت على نظام 64 بت ، ولكن 32 بت على نظام 32 بت. يجب SigCheck النظر في هذا وتظهر على الأقل ".NET 32 بت أو 64 بت (AnyCPU)". ILSpy على سبيل المثال يقول في هذه الحالة "هندسة: AnyCPU (تفضيل 64 بت)" - لكن ILSpy لن يعمل لـ EXE الخاص بـ .NET. - Matt
قد يكون هذا هو الحال ، مثل الرأس "MZ" القديم الذي يوجد فقط لنظام التشغيل Windows ("DOS") قائلا "هذا التطبيق يتطلب Microsoft Windows" ... ؛-) - Matt
نعم ، الأوقات القديمة الجيدة ، حيث كان لديك مصحح أخطاء DOS في shell ويمكن تفكيك التعليمات البرمجية (التي تحتوي فقط على استدعاء DOS واحد واحد طباعة هذه الرسالة) ... واستبدال النص بواسطة "الإجابة 42". :-د - Matt


أستطيع أن أؤكد أن file الأداة المساعدة (على سبيل المثال من cygwin) سوف تميز بين الملفات التنفيذية 32 و 64 بت. تظهر على النحو التالي:

32.exe: PE32 executable (GUI) Intel 80386, for MS Windows
64.exe: PE32+ executable (console) x86-64, for MS Windows

كما ترون ، من الواضح جدا وهو الذي. بالإضافة إلى ذلك فإنه يميز بين التنفيذية والمفوضات التنفيذية واجهة المستخدم الرسومية ، كما هو واضح الذي هو.


33
2018-01-17 02:08



هذا الحل متوفر بشكل شائع لأي مطور قام بتثبيت msysgit. - FrontierPsycho
لماذا الملفات التنفيذية في ويندوز ديك MZ بدلا من PE؟ - Mohammadreza Panahi


هناك طريقة بسيطة لتشغيلها (على افتراض أنك تثق بها) وإلقاء نظرة على علامة التبويب العملية في مدير المهام. سوف تعرض عمليات 32 بت "* 32" في نهاية اسم العملية. إذا لم تكن ترغب في تشغيلها على جهاز الكمبيوتر الخاص بك ، يمكنك محاولة ذلك إكسب إكسبلورر. وسوف تظهر مجموعة كاملة من المعلومات حول الملفات التنفيذية بما في ذلك إذا كانت 32 أو 64 بت.


30
2017-11-17 10:39



لسوء الحظ ، هذا يتطلب منك تشغيل الملف التنفيذي. ربما تحتاج إلى التحقق من بنية البرنامج كأسلوب استكشاف الأخطاء وإصلاحها حول سبب عدم تشغيله. - Mike Christiansen
كيف أنت تشغيل DLL؟ - user34660
@ user34660 RUNDLL32.EXE <اسم dllname> ، <entrypoint> - samsara
samusarin التي ينبغي أن تكون في وظيفة. - user34660
@ user34660 أنت صحيح تقنيًا ، لا يحتوي ملف DLL على main نقطة الدخول وهكذا لن تنفذ كعملية قائمة بذاتها. توجد دالة تهيئة تسمى عند تحميلها ولكنها ليست "رئيسية". - samsara


كثير من الناس لديهم ممتاز 7-الرمز البريدي مثبتة ، وقمت بإضافة المجلد 7-Zip إلى PATH. 7-zip يفهم تنسيقات الملفات بخلاف ZIP و RAR ، مثل ملفات MSI والملفات التنفيذية PE. ببساطة استخدم سطر الأوامر 7z.exe على ملف PE (Exe أو DLL) في السؤال:

7z l some.exe | more
7z l some.exe | findstr CPU

سوف تشمل الإخراج خطوط على النحو التالي ، مع CPU قراءة خط سواء x86 أو x64وهو ما يتم طرحه هنا:

Path = C:\Extra\AV\neroAacEnc.exe
Type = PE
CPU = x86
Characteristics = Executable 32-bit

Path = C:\Extra\AV\LAME\lame_enc.dll
Type = PE
CPU = x86
Characteristics = Executable DLL 32-bit

Path = C:\Extra\AV\FFmpeg\bin\ffmpeg.exe
Type = PE
CPU = x64
64-bit = +
Characteristics = Executable LargeAddress NoRelocs NoLineNums NoLocalSyms NoDebugInfo

Path = C:\Extra\AV\FFmpeg\bin\avcodec-56.dll
Type = PE
CPU = x64
64-bit = +
Characteristics = Executable DLL LargeAddress NoLineNums NoLocalSyms NoDebugInfo

21
2017-10-04 10:56



نجاح باهر لم أكن أعرف أبدا أن 7Z يمكن القيام بذلك. ربما يحتوي على file تنفيذ الداخل؟ - phuclv


النسخة 64 بت من عملية المستكشف يمكن ان يخبرك. ببساطة تشغيل الملف التنفيذي وفتح نافذة خصائص العملية. في علامة التبويب الرئيسية هناك إدخال يقول "صورة: 32 بت" أو "صورة: 64 بت".

enter image description here


18
2017-11-17 13:36



Simply run the executable وماذا لو كنت لا تريد ذلك يركض البرنامج؟ - Synetech
Synetech السؤال الأصلي لا يعني هذا هو الحال. - Andrew Lambert
هذا هو أسهل طريقة بالنسبة لي على ما أعتقد ، ما لم يكن تنفيذي سريع للغاية. - starbeamrainbowlabs
كيف أنت تشغيل DLL؟ - user34660


الطريقة الأكثر بسيطة (عندما تكون البيانات غير سرية)

أجد أن فايروس توتال  File detail هي أبسط طريقة لمعرفة ما إذا كان الثنائي هو 32 بت أو 64 بت.

ال Additional information يوفر الخيار بالإضافة إلى ذلك الكثير من المعلومات المفيدة حول الملف.

Virustotal analysis


[Virustotal TrID


14
2018-01-05 16:53





طريقة تشغيل برنامج قابل للتنفيذ ثم التحقق من عملية المستكشف أو أداة مشابهة لها بعض العيوب الواضحة:

  1. علينا تنفيذ العملية.
  2. بالنسبة للعمليات قصيرة العمر (مثل أنواع صدى hello world.) ، قد لا يسجل مستكشف العمليات حتى أن عملية جديدة قد بدأت.

يمكن للطريقة Dumpbin.exe حل الغرض على الأرجح.

بديل آخر سيكون استخدام cygwin ملف أمر. ومع ذلك ، لم أختبره على النوافذ. وهو يعمل بشكل جيد على اللينكس.

Usage: file program_under_test.exe

تحرير: مجرد اختبار file.exe على النافذة. يعمل بشكل جيد. :)


13
2017-09-27 07:08



أردت فقط أن أقول ، أن هناك بعض الحالات ، حيث لن تكون طريقة دراكس مفيدة كثيرًا. - anishsane
>> هذا لا يزال يتطلب تشغيل البرنامج الذي أراد المؤلف تجنبه: لا .. نقوم بتشغيله مثل: file.exe program_under_test.exe - anishsane
وأولئك الذين يرغبون في تجنب تركيب كامل cygwin الحزمة يمكن الاستيلاء على gnuwin32 file صفقة. - Bob
anishsane مخطئ تمامًا. file ببساطة يقرأ البيانات من القرص في شكل ثنائي والتحقق من أي أرقام سحرية تعرف عليها ، مقارنة مقابل قاعدة بيانات. تأتي برامج 32 بت من Windows مثل PE32 ، وتأتي كل من برامج 64 بت و. NET كـ PE32 +. الشاهد من file في حد ذاته يجعل الفرق صفر تماما - يمكن لكل من تطبيقات 32 بت و 64 بت قراءة البيانات من القرص ، وهو كل ما يحتاج إليه. - Bob
MarcH ها! أن هو مثير للإعجاب. أنا أعتقد أن هذا يعني أن وقت تشغيل NET هو 32 بت. لذا فهو يشغّل عملية 32 بت لجزء من الثانية ، ولكن كل هذه العملية لا تبدأ في وقت التشغيل .NET ، مما يؤدي إلى إنشاء عملية 64-بت أصلية. - clacke


وهنا حل Powershell ، أي تبعيات خارجية أو أي شيء. افتح Powershell ، قم بلصق الوظيفة هناك (اضغط Enter مرتين حتى تعود إلى المطالبة) ، ثم استخدمها كما في الأمثلة أدناه:

function Test-is64Bit {
    param($FilePath=“$env:windir\notepad.exe”)

    [int32]$MACHINE_OFFSET = 4
    [int32]$PE_POINTER_OFFSET = 60

    [byte[]]$data = New-Object -TypeName System.Byte[] -ArgumentList 4096
    $stream = New-Object -TypeName System.IO.FileStream -ArgumentList ($FilePath, 'Open', 'Read')
    $stream.Read($data, 0, 4096) | Out-Null

    [int32]$PE_HEADER_ADDR = [System.BitConverter]::ToInt32($data, $PE_POINTER_OFFSET)
    [int32]$machineUint = [System.BitConverter]::ToUInt16($data, $PE_HEADER_ADDR + $MACHINE_OFFSET)
    $stream.Close()

    $result = "" | select FilePath, FileType, Is64Bit
    $result.FilePath = $FilePath
    $result.Is64Bit = $false

    switch ($machineUint) 
    {
        0      { $result.FileType = 'Native' }
        0x014c { $result.FileType = 'x86' }
        0x0200 { $result.FileType = 'Itanium' }
        0x8664 { $result.FileType = 'x64'; $result.is64Bit = $true; }
    }

    $result
}

هنا مثال على الناتج:

D:\> Test-is64bit

FilePath               FileType Is64Bit
--------               -------- -------
C:\Windows\notepad.exe x64         True


D:\> Test-is64bit 'C:\Program Files (x86)\Mozilla Firefox\firefox.exe'

FilePath                                           FileType Is64Bit
--------                                           -------- -------
C:\Program Files (x86)\Mozilla Firefox\firefox.exe x86        False

10
2018-03-19 12:09



النعومة. يبدو أن البرنامج النصي أعلاه يترك إشارة إلى الملف مفتوحًا. لا يمكن بناء حتى أول إغلاق powershell (تشغيل البرنامج النصي لاستجواب DLL في \ bin). - samsara
رائع جدا. +1. إيتانيوم هو بالتأكيد 64bit على الرغم من :) - Rich Homolka
@ samusarin: ربما إضافة $stream.dispose(); بعد الإغلاق؟ يجب الإفراج عن مقابض الملف. ( stackoverflow.com/questions/1999858/... ) - Yorik
يمكن العثور على نسخة أكثر اكتمالاً في تحقق مما إذا كان exe هو 64 بت - phuclv