windbg脚本查找是否unique_ptr 为空且字符串匹配

问题描述 投票:0回答:1

我有一个垃圾场。我试图在内存中查找包含特定字符串的对象。对于有效的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.
};

实现此目标的最佳方法是什么?

我写了以下脚本,我可以在其中获取具有特定字符串的所有位置。

我有classC字段的偏移量。如何检查该值是否为emptyclassC->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;
}


windbg
1个回答
0
投票

我无法理解您脚本中的逻辑1)您搜索宽字符串并获取其地址然后直接开始操作该地址?

i presume您知道std :: wstring是一个结构我也认为您知道您上面的搜索结果是std :: wstring.c_str()的地址

我还假定您对短字符串优化的理解 in std :: wstring

std :: wstring将并且可以在自身内嵌入一个短字符串或提供指向字符串的指针

所以我再次假定您理解该地址与A类没有关系

您通过搜索地址空间获得的地址将在std :: wstring之内

((因为您的字符串太长而无法调用sso)

或指向由std :: wstring分配的任意内存的指针构造函数(可能在堆一些地方)

减去0x30并将0xa8等添加到该地址都将导致垃圾回收

您似乎正在将此垃圾地址转换为指向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> >]
© www.soinside.com 2019 - 2024. All rights reserved.