HusseinAl-haj Ответов: 0

Как мы можем инструментировать конкретную инструкцию с помощью 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.
Спасибо за помощь

0 Ответов