我有一个垃圾场。我试图在内存中查找包含特定字符串的对象。对于有效的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
字段的偏移量。如何检查该值是否为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)您搜索宽字符串并获取其地址然后直接开始操作该地址?
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> >]