Получение подробной информации о версии выполненной программы - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь получить информацию о версии исполняемого файла из аварийного дампа.Это не так просто, поэтому, пожалуйста, прочитайте весь вопрос, прежде чем придете к ответу, который не работает.

lm vm appname

В основном я могу сделать lmv, чтобы получить подробную информацию о версии, и это именно та информация, которую я хочу.

Если вы не знаете, как получить информацию о версии исполняемого файла, вы можете немного погуглить и получить этот ответ , который предлагает

lm vm appname (без .exe)

Это работает, вероятно, в 90% случаев.Однако у него есть следующие две проблемы, которые я хочу решить в автоматическом анализе:

  1. Что такое appname, если я заранее не знаю исполняемый файл?
  2. ВВ особых случаях, таких как Notepad ++, имя модуля не notepad++, а скорее notepad__

Теперь я могу узнать имя исполняемого файла, используя |, но извлекая имяисполняемого файла из этого вывода нетривиально.

Поиск exe-файла в списке модулей

В списке модулей можно найти исполняемые файлы с помощью команды, подобной

.shell -ci "lmf" findstr "\.exe"

Затем мы можем извлечь адрес и перечислить детали с помощью

.foreach /ps 9999 (exe {.shell -ci "lmf" findstr "\.exe"}) {lmva exe}

. Тем не менее, существует проблема: процессы .NET могут загружать сборки, которые не являются DLL, а EXE.В этом случае вывод может быть неправильным, если первый результат - не основной исполняемый файл, а загруженный позже EXE-файл.

Список модулей

Можно получить список модулей, используя lm1m.И, как правило, первым в этом списке является исполняемый файл.

Затем можно извлечь первую строку и получить для нее сведения.Команда выглядит так:

.foreach /ps 9999 (exe {lm1m}) { lm vm ${exe}}

К сожалению, не гарантируется, что исполняемый файл является первым модулем.Модули отсортированы по адресу.И IMHO может случиться так, что исполняемый файл загружен по более высокому адресу.

Вопрос

Как получить lmv информацию для основного исполняемого файла надежно.

Предположения, которыеможно сделать:

  • аварийный дамп пользовательского режима типа /ma
  • только один процесс отлаживается

1 Ответ

0 голосов
/ 23 мая 2019

Как упомянуто в комментариях Jeroen Mostert , подходящая команда может быть

lmv a $exentry

. Это работает, потому что lm достаточно умен, чтобы принимать адреса, которые находятся внутри модуля.,$exentry дает точку входа первого исполняемого файла.

Вы найдете описание в синтаксисе псевдорегистра:

$ exentry: адрес точки входа первого исполняемого файлатекущего процесса.

[Источник: справка WinDbg]

Для части C # мы можем использовать для тестирования следующий фрагмент кода:

using System;
using System.IO;
using System.Reflection;

namespace exentry
{
    class Program
    {
        static void Main()
        {
            var fullExe = Assembly.GetEntryAssembly().Location;
            var path = Path.GetDirectoryName(fullExe);
            var newexe = Path.Combine(path, "exentry2.exe");
            File.Copy(fullExe, newexe);

            Assembly.LoadFrom(newexe);
            Console.WriteLine("Debug now");
            Console.ReadLine();
        }
    }
}
...