كيف يمكنني اختبار Windows DLL الملف لتحديد ما إذا كان 32 بت أو 64 بت?[مكررة]

StackOverflow https://stackoverflow.com/questions/495244

  •  20-08-2019
  •  | 
  •  

سؤال

هذا السؤال سبق الجواب هنا:

أود أن أكتب اختبار البرنامج النصي أو البرنامج الذي يؤكد على أن كل ملفات DLL في دليل معين من معين نوع البناء.

وأود أن استخدام هذا التعقل تحقق في نهاية عملية بناء على SDK للتأكد من أن الإصدار 64 بت لم بطريقة ما حصلت على بعض 32 بت ملفات DLL في ذلك والعكس بالعكس.

هل هناك طريقة سهلة للبحث في ملف DLL و تحديد نوع ؟

الحل يجب أن تعمل على كل xp32 و xp64.

هل كانت مفيدة؟

المحلول

التفاصيل المروعة

DLL يستخدم PE للتنفيذ تنسيق و ليس من الصعب جدا قراءة هذه المعلومات من الملف.

ترى هذا المقالة MSDN على ملف PE Format لمحة عامة.تحتاج إلى قراءة MS-DOS رأس ، ثم قراءة IMAGE_NT_HEADERS هيكل.هذا يحتوي على IMAGE_FILE_HEADER الهيكل الذي يحتوي على المعلومات التي تحتاج إليها في آلة الأعضاء التي تحتوي على واحدة من القيم التالية

  • IMAGE_FILE_MACHINE_I386 (0x014c)
  • IMAGE_FILE_MACHINE_IA64 (0x0200)
  • IMAGE_FILE_MACHINE_AMD64 (0x8664)

هذه المعلومات يجب أن تكون ثابتة الإزاحة في الملف ، ولكن كنت لا تزال توصي تعبر الملف والتحقق من التوقيع على MS-DOS header و IMAGE_NT_HEADERS للتأكد من يمكنك التعامل مع أي تغييرات في المستقبل.

استخدام ImageHelp قراءة رؤوس...

يمكنك أيضا استخدام ImageHelp API للقيام بذلك - تحميل DLL مع LoadImage و سوف تحصل على LOADED_IMAGE هيكل والتي سوف تحتوي على مؤشر إلى IMAGE_NT_HEADERS هيكل.تخصيص LOADED_IMAGE مع ImageUnload.

أو التكيف مع هذا الخام Perl

وهنا الخام Perl الذي يحصل على هذه المهمة.فإنه يتحقق ملف دوس رأس ، ثم يقرأ PE تعويض من IMAGE_DOS_HEADER 60 بايت في الملف.

ومن ثم يسعى إلى بداية PE جزء يقرأ توقيع الشيكات ومن ثم استخراج قيمة نحن مهتمون.

#!/usr/bin/perl
#
# usage: petype <exefile>
#
$exe = $ARGV[0];

open(EXE, $exe) or die "can't open $exe: $!";
binmode(EXE);
if (read(EXE, $doshdr, 64)) {

   ($magic,$skip,$offset)=unpack('a2a58l', $doshdr);
   die("Not an executable") if ($magic ne 'MZ');

   seek(EXE,$offset,SEEK_SET);
   if (read(EXE, $pehdr, 6)){
       ($sig,$skip,$machine)=unpack('a2a2v', $pehdr);
       die("No a PE Executable") if ($sig ne 'PE');

       if ($machine == 0x014c){
            print "i386\n";
       }
       elsif ($machine == 0x0200){
            print "IA64\n";
       }
       elsif ($machine == 0x8664){
            print "AMD64\n";
       }
       else{
            printf("Unknown machine type 0x%lx\n", $machine);
       }
   }
}

close(EXE);

نصائح أخرى

طريقة فجة سيكون الاتصال dumpbin مع رؤوس الخيار من أدوات Visual Studio على كل DLL والبحث عن الإخراج المناسب:

dumpbin /headers my32bit.dll

PE signature found

File Type: DLL

FILE HEADER VALUES
             14C machine (x86)
               1 number of sections
        45499E0A time date stamp Thu Nov 02 03:28:10 2006
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
            2102 characteristics
                   Executable
                   32 bit word machine
                   DLL

OPTIONAL HEADER VALUES
             10B magic # (PE32)

يمكنك أن ترى زوجين القرائن في ذلك الإخراج الذي هو 32 بت DLL ، بما في ذلك 14C القيمة التي يذكر بولس.ينبغي أن يكون من السهل أن ننظر في النص.

إذا كان لديك Cygwin تثبيت (وأنا أوصي بشدة لأسباب متنوعة), هل يمكن استخدام " ملف "المساعدة" على " DLL

file <filename>

التي من شأنها أن تعطي انتاج مثل هذا:

icuuc36.dll: MS-DOS executable PE  for MS Windows (DLL) (GUI) Intel 80386 32-bit

Walker تبعية يحكي عن(جيد تقريبا).http://www.dependencywalker.com/

لا "تثبيت" -مجرد الحصول عليه, استخراج وتشغيل exec.يعمل على أي x32 أو x64 windows وحدة|تطبيق.

على ما أذكر أنه واضحة إلى حد ما أن ترى كل التبعيات ، أيdll وحدات منذ appl.هو مبلغ من التبعيات واحد يمكن التأكد مما إذا كان كامل x64 و x32(x86) أو قليلا من كل.

نوع وحدة المعالجة المركزية أن وحدة بنيت في "وحدة المعالجة المركزية" عمود.معظم 64 بت aps لا يزال قليلا من كل ولكن 32 بت ap w/ب كل x86.

جميل البرنامج لالمهوسون/المبرمجين و هو حر...

كنت قد كتبت أداة بسيطة جدا أن يفعل ذلك بالضبط يسمى PE ديكونستروكتور.

ببساطة اطلاق النار عليه تحميل ملف DLL:

enter image description here

في المثال أعلاه, تحميل DLL 32-بت.

يمكنك تحميله من هنا (أنا فقط لديك إصدار 64 بت جمعت الصراف الآلي):
http://files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exe

السن 32-بت متوفرة هنا:
http://dl.dropbox.com/u/31080052/pedeconstructor.zip

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top