Я не могу понять логику 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