Как мы можем инструментировать конкретную инструкцию с помощью dyninst?
Используя Dyninst API, мы можем выполнять как статическое, так и динамическое двоичное инструментирование.
В статическом инструментовании мы можем переписать двоичный файл и ввести дополнительный код (фрагменты) в определенные точки.
Я протестировал следующий код, чтобы исправить двоичный код. Однако этот код вводит фрагменты кода в entery заинтересованной функции, то есть foo.
Как мы можем внедрить фрагменты кода по определенному адресу?
это и есть код (ссылка на исходный код)
#include <stdio.h> #include "BPatch.h" #include "BPatch_addressSpace.h" #include "BPatch_function.h" #include "BPatch_binaryEdit.h" #include "BPatch_point.h" int main(int argc, const char *argv[]) { // Use BPatch_* classes to initialize BPatch bpatch; BPatch_addressSpace *app = bpatch.openBinary("hello", true); bool flag = false; flag = app->loadLibrary("liblib.so"); BPatch_image* image = app->getImage(); std::vector<BPatch_function*> func; image->findFunction("code_to_inject", func); std::cout<<"\nFunction is: "<<func[0]->getName()<<std::endl; std::vector<BPatch_snippet*> openArgs; BPatch_funcCallExpr enter_call(*(func[0]), openArgs); func.clear(); std::vector<BPatch_point *> *points; image->findFunction("foo1", func); points = func[0]->findPoint(BPatch_entry); app->insertSnippet(enter_call, *points); BPatch_binaryEdit *appBin = dynamic_cast<BPatch_binaryEdit *>(app); appBin->writeFile("newbinary"); return 0; }
Что я уже пробовал:
Я думаю, что мы должны использовать функцию BPatch_function и передать определенный адрес, но я хочу получить модифицированный код. Может быть, нам стоит использовать Dyninst::Address.
Спасибо за помощь