Как я могу воспроизвести сохранённый RPC?

roman_vodola

Известный
Автор темы
170
19
Всем привет, использую данный проект https://www.blast.hk/threads/163884/, и в нём есть эмуляция RPC. Я сохранил bitstream RPC, который я отправляю на сервер в текстовый файл и там он находится в следующем виде - 14, 225, 1, 0, 0, 12, 0, 99, 101, 102, 95, 114, 112, 99, 95, 97, 117, 116, 104, 31, 0, 131, 164, 100, 97, 116, 97, 169, 86, 101, 110, 121, 97, 104, 50, 50, 50, 162, 105, 100, 166, 113, 101, 55, 48, 105, 112, 163, 107, 101, 121, 1. Знаю ID RPC и имею bitstream RPC я лично попытался вот таким образом сделать
C++:
bool emulateRPCFromFile(const std::string& filename, int rpcId, RakNet::BitStream& bs) {
    // Открываем файл для чтения
    std::ifstream inFile(filename);
    if (!inFile.is_open()) {
        MessageBoxA(NULL, "Unable to open file for reading", "File Error", MB_OK | MB_ICONERROR);
        return false;
    }

    // Читаем содержимое файла как текст
    std::string line;
    std::getline(inFile, line);
    inFile.close();

    // Очистка BitStream
    bs.Reset();

    // Записываем ID RPC
    //bs.Write(rpcId);

    // Записываем размер данных (количество байтов через запятую)
  /*  unsigned int size = static_cast<unsigned int>(std::count(line.begin(), line.end(), ', ') + 1);
    bs.Write(size);*/
    std::ofstream outFile("test.txt");
    if (!outFile.is_open()) {
        MessageBoxA(NULL, "Unable to open test.txt for writing", "File Error", MB_OK | MB_ICONERROR);
        return false;
    }
    // Записываем строку данных в BitStream как есть
    std::istringstream iss(line);
    std::string token;
    while (std::getline(iss, token, ',')) {
        int byte = std::stoi(token);  // Преобразуем строку в число
        bs.Write(static_cast<unsigned char>(byte));  // Записываем байт в BitStream
        outFile << byte << " ";  // Записываем байт в файл
    }

    // Выполняем эмуляцию RPC с данным битстримом
    rakhook::emul_rpc(rpcId, bs);
    outFile.close();
    return true;
}


void Plugin::mainloop(const decltype(hookCTimerUpdate)& hook) {
    static bool inited = false;
    //if (!inited && samp::RefChat() != nullptr && rakhook::initialize()) {
    RakNet::BitStream bs;
    int rpcId = 252;
    emulateRPCFromFile("rpc_20240827_224029.txt",rpcId, bs);
    if (!inited && rakhook::initialize()) {
        using namespace std::placeholders;
        //samp::RefChat()->AddMessage(0xFFFFFFFF, "Plugin loaded");
        StringCompressor::AddReference();
        //rakhook::on_receive_rpc += std::bind(&PluginRPC::onServerMessage, &RPC, _1, _2);
        rakhook::on_receive_rpc += std::bind(&PluginRPC::onReceiveRPC, &RPC, _1, _2);
        rakhook::on_receive_rpc += std::bind(&PluginRPC::onReceiveCEF, &RPC, _1, _2);
        rakhook::on_receive_packet += std::bind(&PluginRPC::onReceivePacket, &RPC, _1);
        rakhook::on_send_rpc += std::bind(&PluginRPC::onSendRPC, &RPC, _1, _2, _3, _4, _5, _6);
        inited = true;
    }
    return hook.get_trampoline()();
}
Однако почему-то не работает...