- 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()();
}