pykd

Форк
0
/
stdstring.py 
36 строк · 1.3 Кб
1

2
import pykd
3

4
#it's exact name of the std::string class. We need it later.
5
stringClassName = "basic_string<char,std::char_traits<char>,std::allocator<char> >"
6
fullStringClassName = "std::" + stringClassName
7

8
# get a malloc function. May be we have not its prototype in pdb file, so we need to define prototype manually
9
PVoid = pykd.typeInfo("Void*")
10
size_t = pykd.typeInfo("Int8B") if pykd.getCPUMode() == pykd.CPUType.AMD64 else pykd.typeInfo("Int4B")
11
mallocProto = pykd.defineFunction( PVoid, pykd.callingConvention.NearC )
12
mallocProto.append("size", size_t)
13

14
malloc = pykd.typedVar(mallocProto, pykd.getOffset("malloc") ) #getOffset("malloc") may take a long time
15

16
# get a type of a std::string
17
stringClass = pykd.typeInfo(fullStringClassName)
18
 
19
# allocate memory
20
buffer = malloc( stringClass.size() )
21

22
# get a typed access to memory. As you may see the instance of the std::string is not initialized
23
stringVar = pykd.typedVar( stringClass, buffer )
24

25
# set up parameters for a constructor call.
26
param = pykd.stackAlloc(100)
27

28
pykd.writeCStr(param, "hello")
29

30
# call ctor for initalizing. std::string has several forms of constructor so we need to note prototype
31
ctor = stringVar.method( stringClassName, "Void(__thiscall)(Char*)" )
32
ctor(param)
33

34
#check result:
35
print( pykd.loadCStr( stringVar.c_str() ) ) 
36

37
pykd.stackFree(100)
38

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.