ما هي أفضل طريقة لاستخدام الاسم المستعار لاسم قابل للتنفيذ في برنامج WinDBG Crash Script؟

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

سؤال

معلومات اساسية

لحفظ مقالب الأعطال، قمت بتمرير البرنامج النصي إلى cdb.exe في ال Debugger قيمة AeDebug مفتاح التسجيل:

C:\progra~1\debugg~1\cdb.exe -p %ld -e %ld -g -y SRV*c:\mss*http://msdl.microsoft.com/download/symbols -c "$<d:\tgticker\Dumps\RDFD.cdbscript"

هنا هو الجزء الأول من البرنامج النصي:

as /c CrashFirstModule .printf "%mu", @@c++((*(ntdll!_LDR_DATA_TABLE_ENTRY**)&@$peb->Ldr->InLoadOrderModuleList.Flink)->BaseDllName.Buffer) 

.logopen /t d:\tgticker\dumps\${CrashFirstModule}_process.log

* (...)

المشكلة

مع الرموز، يعمل هذا تمامًا كما أريد، أحصل على ملفات سجل بأسماء معقولة مثل:

  • LHCBDRDT.exe_process_147c_2009-01-06_23-10-05-371.log

ومع ذلك، إذا لم تكن الرموز متوفرة، أحصل على اسم ملف السجل مثل هذا:

  • ${CrashFirstModule}_process_17a8_2009-01-06_23-10-01-124.log

وذلك لأن أمر الاسم المستعار فشل في تعيين الاسم المستعار.أمر الاسم المستعار هو الذي حصدت منه موقع DumpAnalogy.org.يقوم هذا الأمر بسحب الاسم من رأس PEB للصورة، باستخدام ntdll.dll.وبدون رموز لنظام التشغيل، فإنه لا يعرف مكان العثور على الوظيفة التي يستدعيها من ntdll.dll.

السؤال

هل يعرف أي شخص أو لديه أمر للحصول على اسم الصورة كاسم مستعار لاستخدامه في أسماء الملفات التي ستظل تعمل في هذه المواقف؟

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

المحلول

وها أنا هنا بعد سنوات مع إجابة.

الاجابة

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

aS ${/v:CrashFirstModule} "UnknownModule"
.foreach /pS b /ps b (name {.imgscan}) { .if($spat("${name}","*.exe") !=0){aS ${/v:CrashFirstModule} "${name}"; .break} }

وبعد هذين السطرين CrashFirstModule سيكون مستعارًا إما لـ "UnknownModule" أو اسم الملف القابل للتنفيذ.يعمل هذا فقط إذا كان الملف القابل للتنفيذ ينتهي بـ ".exe"، لكن هذا يبدو معقولًا بالنسبة لي، ويعمل بشكل جيد في الحالة التي أستخدمه فيها.يمكنك إضافة آخر .if للتعامل مع النهايات الأخرى إذا كنت بحاجة إلى دعم أشياء مثل ".com".

الاجابة:شرح

.imgscan

.imgscan يقدم قائمة بالوحدات القابلة للتنفيذ، والتي ستتضمن .exe و.dll و.drv وما إلى ذلك.هذه هي نقطة البداية للعثور على الاسم القابل للتنفيذ.

0:000> .imgscan
MZ at 01000000, prot 00000002, type 01000000 - size 14000
  Name: notepad.exe
MZ at 73070000, prot 00000002, type 01000000 - size 27000
  Name: WINSPOOL.DRV
MZ at 762b0000, prot 00000002, type 01000000 - size 49000
  Name: comdlg32.dll
MZ at 76f50000, prot 00000002, type 01000000 - size 13000
  Name: Secur32.dll
MZ at 77380000, prot 00000002, type 01000000 - size 91000
  Name: USER32.dll
MZ at 77420000, prot 00000002, type 01000000 - size 103000
  Name: COMCTL32.dll
MZ at 77ba0000, prot 00000002, type 01000000 - size 5a000
  Name: msvcrt.dll
MZ at 77c00000, prot 00000002, type 01000000 - size 48000
  Name: GDI32.dll
MZ at 77c50000, prot 00000002, type 01000000 - size a0000
  Name: RPCRT4.dll
MZ at 77e40000, prot 00000002, type 01000000 - size 102000
  Name: KERNEL32.dll
MZ at 7c800000, prot 00000002, type 01000000 - size c3000
  Name: ntdll.dll
MZ at 7c8d0000, prot 00000002, type 01000000 - size 7ff000
  Name: SHELL32.dll
MZ at 7d180000, prot 00000002, type 01000000 - size 52000
  Name: SHLWAPI.dll
MZ at 7d1e0000, prot 00000002, type 01000000 - size 9c000
  Name: ADVAPI32.dll

.foreach

.foreach يستخدم للتنقل في قائمة الصور. /pS يحدد مدى وصول القيمة الأولى إلى القائمة. /ps يحدد المسافة بين القيم.(ب = 11 بالنظام الست عشري) وهذا ضروري .foreach سوف تنفصل على المساحات.مع هذه الوسيطات، تصبح القائمة:

0:000> .foreach /pS b /ps b (name {.imgscan}) { .echo name }
notepad.exe
WINSPOOL.DRV
comdlg32.dll
Secur32.dll
USER32.dll
COMCTL32.dll
msvcrt.dll
GDI32.dll
RPCRT4.dll
KERNEL32.dll
ntdll.dll
SHELL32.dll
SHLWAPI.dll
ADVAPI32.dll

$بصق

$spat هي دالة مطابقة سلسلة حرف البدل MASM.وسوف يطابق الوسيطة الأولى مع النمط الموجود في الوسيطة الثانية.إنه ليس حساسًا لحالة الأحرف، لذلك سيتطابق مع NOTPAD.EXE بالإضافة إلى NotePad.eXe وما إلى ذلك.

.if($spat("${name}","*.exe") !=0) {.echo "found it!"}

${}

${} هو مترجم الاسم المستعار.قمت بتضمين ${<alias name>} أينما تريد كتابة قيمة الاسم المستعار الخاص بك في سلسلة.إذا كنت تستخدم الاسم المستعار في أمر ما، فيمكنك استخدامه فقط .echo CrashFirstmodule سوف صدى بها notepad.exe.في تلك الحالات التي تقصد فيها اسم الاسم المستعار فعليًا، يمكنك تحديده كـ ${/v:<alias name>} والتي سوف تحل فقط إلى الاسم المستعار.يُعد منع التوسيع هذا ضروريًا عند إعادة تعيين اسم مستعار. aS CrashFirstModule "${name}" قد يؤدي إلى تحديد الاسم المستعار UnknownModule ل notepad.exe, ، مثل CrashFirstModule كان سيتم توسيعها إلى قيمتها قبل تنفيذ الأمر.

مثل

aS هو أحد أوامر تعيين الأسماء المستعارة. aS تم إنهاؤه بواسطة ؛أو نهاية السطر وسيتم تجريد " من الإدخال.السطر التالي سيكون الاسم المستعار CrashFirstModule ل UnknownModule:

aS ${/v:CrashFirstModule} "UnknownModule"

.استراحة

.break ينتهي .foreach بعد العثور على المباراة.

نهاية

هذه هي كل القطع التي تشكل الأمر الذي أستخدمه.آمل أن يستفيد شخص آخر من هذا السؤال والإجابة!

نصائح أخرى

لماذا لا تستخدم معلومات بيب؟وفيما يلي ما تحتاجه:

?? @$peb->ProcessParameters

ntdll.dll سيكون موجودًا في كل عملية، لذا أعتقد أن المشكلة تكمن في تحميل الرمز.

على أية حال، يجب أن يعمل هذا على التخلص من فاصل الأسطر:

.foreach(Module {lm 1m}) { aS CrashApp Module; .break }

.foreach(Module {lm 1m a $exentry}) { aS CrashApp Module }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top