Как перебрать дамп памяти в Windbg? - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть массив относительных виртуальных адресов (RVA), расположенных по определенному адресу памяти.Я могу сбросить его в windbg и увидеть список RVA, как показано ниже:

dd 77f10000 + 00002650 и вывод: 77f12650 000034a6 000034af 000034b9 000034ce ....

Здесь 77f10000 - этоБазовый адрес DLL, а 00002650 - это RVA массива, который я отобразил.

Теперь каждый из этих RVA в дампе памяти может быть добавлен к базовому адресу DLL и соответствующей строке вместоположение можно просмотреть.

Например, если я возьму первую запись в массиве: 000034a6

Добавив этот RVA к базовому адресу DLL, 77f10000 и отобразив его следующим образом:

da 77f10000 + 000034a6 и вывод: 77f134a6 "AbortDoc"

теперь, таким образом, я могу просмотреть следующую строку для следующего соответствующего RVA в массиве, выполнив следующее:

da 77f10000 + 000034af и вывод: 77f134af "AbortPath"

Точно так же я хочу перебрать оставшиеся записи в массиве и отобразить соответствующие строки.

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

Я думаю, что для этого можно использовать команду .foreach:

Пример: .foreach (myVariable {dd 77f10000 + 00002650}) {! Do} myVariable будет хранить выходные данные команды windbg.Однако мне нужно выбрать один элемент за раз из строки и выполнить итерацию.

Любая помощь будет принята.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 28 декабря 2011

К сожалению, это сложнее, чем должно быть, потому что команда dd отображает не только результат, но и адрес результата, поэтому .foreach будет выполнять итерации по обоим.Хотя я не мог сделать это в одной строке, я сделал это в файле сценария, который выглядит длинным только из-за комментариев:

$$ Set up the base of the RVA array as a pointer to an integer.
r? @$t0 = ((int *)(0x8068f764))

$$ To break down the command:

$$ r?                - Allows you to assign a pseudo register and give it a type
$$ @$t0              - Pseudo register for use in scripting
$$ ((int *)(address) - Assign the type int * to the result


$$ Loop over the entries in the array, 100 is arbitrary and should be replaced
.for (r @$t1 = 0; @$t1 < 100; r @$t1 = @$t1 + 1) 
{
    $$ Display the ASCII string at the given offset. This is similar to:
    $$ 
    $$ printf("%s\n", baseAddr+(offsetArray[i])
    $$
    $$ @@c++() is required so that @$t0 is treated as an int *

    da nt+(@@c++(@$t0[@$t1]));
}

Сохраните в файл TXT и запустите следующую команду:

0: kd> $$><c:\dumps\dumprvas.txt
80691a4b  "CcCanIWrite"
80691a57  "CcCopyRead"
80691a62  "CcCopyWrite"
80691a6e  "CcDeferWrite"
80691a7b  "CcFastCopyRead"
80691a8a  "CcFastCopyWrite"
...

Если бы я делал это по-настоящему, я бы убрал это еще больше и сделал бы базовый адрес и параметры количества записей в скрипте, что сделало бы его более полезным.Я оставил это здесь для ясности (ну, так много ясности, как можно ожидать с этими сценариями:)).

-scott

1 голос
/ 10 мая 2014

очень поздний ответ, но здесь запрошенный ответ:)

0:000> .foreach /ps 1  /pS 1 (place { dd /c 1 gdi32+2650 l?5 }) {da gdi32 + place } 

тестовый вывод

0:000> .foreach /ps 1  /pS 1 (place { dd /c 1 gdi32+2650 l?5 }) {da gdi32 + place } 
77f134a6  "AbortDoc"
77f134af  "AbortPath"
77f134b9  "AddFontMemResourceEx"
77f134ce  "AddFontResourceA"
77f134df  "AddFontResourceExA"
...