Возможно ли записать во входной буфер, переданный в функцию, больше, чем ожидалось? (нет переполнения стека)

#c #c #buffer #recv

#c #c #буфер #recv

Вопрос:

Я делаю какой-то патч для перевода пакетов. Моя dll внедряется в китайскую игру, перехватывает recv, прослушивает пакеты и переводит строки, полученные на китайском языке. Я кодировал, и кодировал, и кодировал… Пока я не узнал, как я должен записывать в buf больше, чем длина пакета?

 int __stdcall Hooked_recv(SOCKET s, char *buf, int len, int flags)
{
    h_recv.PreHook();

    int ret_val = recv(s, buf, len, flags);
//ret_val is the number of bytes received. Ok, I can increase it, but...
//what to do with buf? Sure I can write there as much as no access violation appears.
//but I need a safe way.
//I guess if I do buf = new char[NEW_SIZE] then caller will fail to read buf because of pointer changed?
//what could I do to make received packet longer?
//I no want to reverse exe and increase buffer in hex editor. at least for now.

    h_recv.PostHook();

    return ret_val;
}
  

Ответ №1:

Просто заполните буфер настолько, насколько сможете. Если у вас остались какие-либо остатки, сохраните их для следующего вызова вашей подключенной функции приема (поместите это первым, если это заполнит его, повторите сохранение нового остатка). Вам нужно будет использовать буфер, это неизбежно.

Комментарии:

1. Я не знаю размер буфера. Все, что я могу сделать, это заполнить его до нарушения доступа. может быть, есть какой-то способ просканировать память всего процесса на предмет указателя на buf и изменить его?

2. Цель len — сообщить вам, сколько байтов вы можете поместить в буфер.

3. Но buf поставляется с предопределенным размером. ppls объявляют некоторый char * buf[1024] и передают его в функцию recv. Только после вызова recv они знают, сколько байтов фактически получено. размер буфера никогда не меняется.

4. мой плохой: ( вы правы. не заметил значения len

5. Правильное решение, но может быть важно указать, что вам следует избегать пересылки на базовый recv в случае, если у вас достаточно буферизованных данных для удовлетворения вызова. Риск заключается в том, что буфер может стать неограниченным, если при переводе будут добавлены дополнительные данные. Например. предположим, что перехват добавляет один байт к каждому полученному 1 КБ. Это приведет к медленному увеличению буфера, но после считывания 1 ГБ буфер будет содержать 1 МБ. Правильное решение — вернуть только буфер при 1025-м вызове.