ОБСУЖДЕНИЕ

Как отличить пакеты ?

5 ответов 6,6 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Доброго времени суток.
Пишу Античит для сетевой игры.
Есть локальная сеть, допустим IP адрес компьютера игрока 192.168.0.2 , а ip сервера игры 192.168.0.1.
Далее так.
Запускается клиент игры, пакеты которого я направляю на клиент античита то есть на 192.168.0.2:6661, Клиент античита перенаправляет пакеты на сервер античита 192.168.0.1:7771, Сервер античита проверяет IP с которого присланы пакеты, если Ip разрешено(или к примеру не запрещено) подключатся к серверу игры то он перенаправляет пакеты на порт сервера игры 192.168.0.1:4444, иначе откидывает эти пакеты.

Далее я думал что чит посылает пакеты непосредственно на порт сервера, и я начал шифровать пакеты, при этом следя за тем что бы пакеты были посланны именно клиентом античита, для этого я изменял пакет и добалял к нему несколько символов, на стороне сервера античита я проверял наличие этих символов если есть то возвращаю пакет в иходное состояние и перенаправляб пакет ына порт сервера игры, иначе отбрасываю их.

Но как оказалось, чит перехватывает пекеты посланные клиентом игры, сохраняет их у себя и потом начинает их плодить (чем добивается к примеру увиличения в N раз скрорости атаки). Посылает он их по тому же маршруту, что и клиент, то есть читерный пакет тоже проходит и шифровку и расшифровку и в итоге все таки попадает на сервер.

Для мапинга пакетов использую Indy IdMappedPortTCP.

Подсткажыте как отличить пакеты посланные читом от пакетов посланных клинетом игры ?

Зараннее благодарен.
 
Я как то делал похожее, для этого перехватывал функцию recvfrom
 
а можно поподробнее ? что искать, где копать ?
если можно примерчик, ато сижу за этими пакетами который день, и чем дольше сижу тем мне больше кажется что эти пакеты одинаковые, и копать надо в другом направлении.
 
Вот только что могу тебе показать (весь проект выкладывать не буду):
Код:
function NewRecvfrom(s:TSocket; var Buf; len, flags: Integer;
var from: TSockAddr; var fromlen: Integer):Integer; stdcall;
var
Data:array[0..$FFFF] of Char;
hmutex:cardinal;
b:boolean;
i:Integer;
ss:string;
hFile, nb:cardinal;
struct:_OFSTRUCT;
//ipbuf:PChar;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, AdrRecvfrom,
@OldRecvfrom, SizeOf(OldCode), bw);
Result:=recvfrom(s, Data[0], len, flags, from, fromlen);
LoopProv1;
b:=Flag;
If not b then
begin
hFile:=OpenFile('c:\log.txt', struct, OF_CREATE);
WriteFile(hFile, from.sin_addr.S_addr, 4, nb, nil);
For i:=1 to FSpisokIp.count do
begin
WriteFile(hFile, FSpisokIp.spisok[i], 4, nb, nil);
If FSpisokIp.spisok[i]=from.sin_addr.S_addr then
begin
b:=True;
break;
end;
end;
CloseHandle(hFile);
end;
If b then
begin
Move(Data[0], Buf, Result);
end
else
begin
FillChar(Buf, Result, 0);
fromlen:=0;
from.sin_addr.S_addr:=0;
Result:=0;
end;
WriteProcessMemory(INVALID_HANDLE_VALUE, AdrRecvfrom,
@StabRecvfrom, SizeOf(far_jmp), bw);
end;
Перехватывая функцию, в одном из параметров определяем адрес источника, если правильный передаем буфер в оригинальную функцию, иначе - ничего не передаем.
Как перехватывать API-функции смотри на wasm.ru, также неплохо почитать Джеффри РИХТЕР "Создание эффективных WIN32-приложений"
 
хм. Но ведь в этом случае мне мало адреса источника ! Если я буду перехватывать все функции, а пропускать только те которые связаны с main.exe (exe игры), здается мне что ничем хорошим не закончится. Я могу конечно все неправильно понимать, но мне нужно перехватить те функции которые как бы связаны с моим клиентом античита и с main.exe.
 
Ну так процесс в котором recvfrom вызывается легко определить - определяешь модуль в контексте которого выполняется dll-ка-перехватчик. Если чужой процесс, то просто передал управление на оригинальную функцию (ничего страшного не произойдет, ведь перехват будет происходить в контексте данного процесса), если свой - проверяй адрес.
 
Статус
Закрыто для дальнейших ответов.