#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-м вызове.