Мне интересно, есть ли у кого-нибудь из вас опыт чтения / записи входных аргументов инструментального метода?
Технически это так просто и просто, когда метод имеет некоторый примитивный тип данных в качестве входных параметров. Например, integer
или double
. Однако, когда это более сложный тип данных, такой как string
, я столкнулся со странным поведением в структуре фреймворка. В двух словах, я не могу восстановить исходный ввод данных.
Ниже вы видите мою измерительную функцию. Он просто пытается напечатать входные аргументы, переданные инструментальному методу.
VOID start_of_execution(uint64_t hash_name, int type,
ADDRINT input_arg1,
ADDRINT input_arg2
){
cout << "int arg:" << input_arg1 << endl; // prints the integer input
cout << "string*:" << hex << input_arg2 << endl; // prints the pointer value
cout << "string arg:" << *(reinterpret_cast<string*>(input_arg2)) << endl; // prints nothing!
}
Вот инструментальный метод, единственная функциональность которого заключается в печати входных аргументов.
int sample_method(int i, string* str){
cout << "-----" << endl;
cout << "i: " << i << ", str:" << *str <<", ptr:" << str << endl;
return 0;
}
Ниже вывод:
$ sudo ../../../pin -t obj-intel64/code/mypin.so -- ./code/a.out
int arg:5
string*:0x1704434923
string arg:
-----
i: 5, str:sample text, ptr:0x1704434923
Как видите, целочисленный аргумент (номер 5) был получен правильно. Однако, даже если указатель строки действителен, PIN не смог восстановить входной аргумент строки.
Кто-нибудь имеет представление о моей проблеме?