поиск сценариев windbg, если unique_ptr <object>пусто и строки совпадают - PullRequest
0 голосов
/ 01 марта 2020

У меня есть свалка. Я пытаюсь найти объекты в памяти, которые содержат указанную строку c. ClassA->name должен быть равен (18750736-6e77-48a7-9dca-8fdf041e05d2:132257155499245423) и ClassA->classC объект не должен быть empty и ClassA->name == ClassA->classC->name2 для действительного ClassA объекта.

ClassA
{
   // at offset 0x30
   wstring name; // looking for ClassC objects which have name == (18750736-6e77-48a7-9dca-8fdf041e05d2:132257155499245423)

   unique_ptr<ClassC> classC; // at offset 0xa8
};


ClassC
{
   wstring name2; // name2 == name in a valid object.
};

Что такое лучший способ добиться этого?

Я написал следующий сценарий, в котором я могу получить все места в памяти, в которых указана c строка.

Я получил смещение classC поле. Как я могу проверить, является ли значение empty или нет и classC->name2 == classA->name?

Я считаю, что написание сценария js сложно, так как я не знаю, как interactively отладить проблемы в скрипте. Есть ли другой лучший способ написания скриптов windbg?

function log(a1,a2) 
{ 
    host.diagnostics.debugLog(a1 +"    " +a2 + "\n"); 
}

function exec (cmdstr)
{
    return host.namespace.Debugger.Utility.Control.ExecuteCommand(cmdstr);    
}

function runCommandGetAddresses3()
{
    var temp = exec("s -[w]u 0 L?ffffffff`ffffffff \"(18750736-6e77-48a7-9dca-8fdf041e05d2:132257155499245423)\"").Take(2);
    var addresses = [];

    for ( line of temp ) 
    {
        try
        {
            var token = line.split(" ");
            var addressOfClassAName = token[0];
            var t = exec("dx -r1 ((MyDll!std::unique_ptr<ClassC,std::default_delete<ClassC>>*) (0x" + addressOfClassAName + " - 0x30 + 0xa8))");
            addresses.push(t);
            // how to find if `t` is `empty` or has `value` ?
        }
        catch(ex)
        {
            log(ex, "exception");
        }
    }

    return addresses;
}


1 Ответ

0 голосов
/ 03 марта 2020

Я не могу понять логику c в вашем скрипте
1) Вы ищете широкую строку и берете ее адрес
, а затем начинаете манипулировать этим адресом напрямую ??

я предполагаю вы знаете, что std :: wstring является структурой
Я также предполагаю вы знаете, что
приведенный выше результат поиска - std: : адрес wstring.c_str ()

Я также предполагаю, что вы понимаете оптимизацию коротких строк в std :: wstring

std :: wstring, и может встраивать короткую строку внутри себя или предоставьте указатель на строку

так Я снова предполагаю, что вы понимаете , что этот адрес не имеет отношения к классу A

этот адрес вы получить путем поиска адресного пространства будет либо в std :: wstring

(не может быть так, потому что ваша строка слишком длинная для вызова sso)

или указатель на какой-то произвольный память, которая была выделена std :: wstring в ее конструкторе
(возможно, в Heap Some where)

, вычитая 0x30 и добавляя 0xa8 et c к этому адресу, все приведет к мусору

Вы, кажется, используете эту гарбу ge адрес как указатель на класс C

пожалуйста, исправьте или отредактируйте ваше сообщение, чтобы прояснить ваши намерения

я быстро взломал, чтобы представить ваш класс A и отобразить его в windbg.

0:000> dx Debugger.Utility.Control.ExecuteCommand("s -[w]u 1f0000 l?(285000-1f0000) this").Take(2)

    [0x0]            : 002eb048  0074 0068 0069 0073 0020 0069 0073 0020  t.h.i.s. .i.s. .

0:000> ?? (foo._Mypair._Myval2->Aname._Mypair._Myval2._Bx._Ptr)
wchar_t * 0x002eb048
 "this is Aname's name ANAME"

0:000> dx foo
foo                 : unique_ptr {...} [Type: std::unique_ptr<A,std::default_delete<A> >]
    [<Raw View>]     [Type: std::unique_ptr<A,std::default_delete<A> >]
    [ptr]            : 0x2eaf80 [Type: A *]
    [deleter]        : default_delete [Type: std::_Compressed_pair<std::default_delete<A>,A *,1>]
    [+0x000] bf               : "1337" [Type: char [48]]
    [+0x030] Aname            : "this is Aname's name ANAME" [Type: std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >]
    [+0x048] cf               : ".???" [Type: char [96]]
    [+0x0a8] AnotherClass     : empty [Type: std::unique_ptr<C,std::default_delete<C> >]

Адрес foo равен 0x18f9d0, вы получаете 0x2eb048 для поиска по wstring

0:000> dx &foo
&foo                 : 0x18f9d0 : unique_ptr {...} [Type: std::unique_ptr<A,std::default_delete<A> > *]

адрес std :: wstring находится в HEAP, а std :: unique_ptr foo находится в стеке

std :: wstring

0:000> !address 0x002eb048

Usage:                  Heap
Base Address:           002e0000
End Address:            002f0000
Region Size:            00010000 (  64.000 kB)
State:                  00001000          MEM_COMMIT
Protect:                00000004          PAGE_READWRITE
Type:                   00020000          MEM_PRIVATE
Allocation Base:        002e0000
Allocation Protect:     00000004          PAGE_READWRITE
More info:              heap owning the address: !heap 0x2e0000
More info:              heap segment
More info:              heap entry containing the address: !heap -x 0x2eb048

0:000> !heap -x 0x002eb048
SEGMENT HEAP ERROR: failed to initialize the extention
Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
-----------------------------------------------------------------------------
002eb040  002eb048  002e0000  002e0000        58        c8        18  busy extra fill 

std :: unique_ptr

0:000> !address 0x18f9d0

Usage:                  Stack
Base Address:           0018d000
End Address:            00190000
Region Size:            00003000 (  12.000 kB)
State:                  00001000          MEM_COMMIT
Protect:                00000004          PAGE_READWRITE
Type:                   00020000          MEM_PRIVATE
Allocation Base:        00090000
Allocation Protect:     00000004          PAGE_READWRITE
More info:              ~0k

0:000> ~0k
 # ChildEBP RetAddr  
00 0018f9e0 00216f4c smartptr!main+0x198 smartptr.cpp @ 26 
01 (Inline) -------- smartptr!invoke_main+0x1c 
02 0018fa28 762ced6c smartptr!__scrt_common_main_seh+0xfa 
03 0018fa34 779b37eb kernel32!BaseThreadInitThunk+0xe
04 0018fa74 779b37be ntdll!__RtlUserThreadStart+0x70
05 0018fa8c 00000000 ntdll!_RtlUserThreadStart+0x1b
...