Через NFQUEUE перехватываю пакеты, чтобы изменить отпечаток системы, но никак не получается задать опцию TIMESTAMP, кроме как 0.
Кусок кода максимально короткий, но вот так я устанавливаю 0 и он распознается и соединение не ломается. Если же задать какое-либо значение, то не получаю ответа.
void process_tcp_options(unsigned char *options, int options_size) {
int offset = 0;
size_t option_index = 0;
while (offset < options_size && option_index < selected_signature.tcp_options_order.size()) {
TcpOptionKind kind = selected_signature.tcp_options_order[option_index++];
if (kind == EOL) { // EOL
options[offset] = EOL;
offset++;
continue;
}
if (kind == NOP) { // NOP
options[offset] = NOP;
offset++;
continue;
}
if (kind == MSS) { // Maximum Segment Size
options[offset] = MSS;
options[offset + 1] = 4;
*reinterpret_cast<uint16_t *>(&options[offset + 2]) = htons(selected_signature.mss);
offset += 4;
} else if (kind == WINDOW) { // Window Scale
options[offset] = WINDOW;
options[offset + 1] = 3;
options[offset + 2] = selected_signature.wscale;
offset += 3;
} else if (kind == TIMESTAMP) {
options[offset] = TIMESTAMP;
options[offset + 1] = 10;
// Устанавливаем TSval на 0 (не получается установить любой другой)
*reinterpret_cast<uint32_t *>(&options[offset + 2]) = htonl(0);
// TSecr оставляем 0
*reinterpret_cast<uint32_t *>(&options[offset + 6]) = 0;
offset += 10;
} else if (kind == SACKPERM) { // Selective Acknowledgment Permitted
options[offset] = SACKPERM;
options[offset + 1] = 2;
offset += 2;
}
}
}
Хотелось бы все же передавать какое-то значение не равное 0, но никак не получается. Прошу помощи.