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

  • Автор темы SharedNoob
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

SharedNoob

Гость
#1
Доброго времени суток.
Пишу Античит для сетевой игры.
Есть локальная сеть, допустим 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.

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

Зараннее благодарен.
 
Z

zubr

Гость
#2
Я как то делал похожее, для этого перехватывал функцию recvfrom
 
S

SharedNoob

Гость
#3
а можно поподробнее ? что искать, где копать ?
если можно примерчик, ато сижу за этими пакетами который день, и чем дольше сижу тем мне больше кажется что эти пакеты одинаковые, и копать надо в другом направлении.
 
Z

zubr

Гость
#4
Вот только что могу тебе показать (весь проект выкладывать не буду):
Код:
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-приложений"
 
S

SharedNoob

Гость
#5
хм. Но ведь в этом случае мне мало адреса источника ! Если я буду перехватывать все функции, а пропускать только те которые связаны с main.exe (exe игры), здается мне что ничем хорошим не закончится. Я могу конечно все неправильно понимать, но мне нужно перехватить те функции которые как бы связаны с моим клиентом античита и с main.exe.
 
Z

zubr

Гость
#6
Ну так процесс в котором recvfrom вызывается легко определить - определяешь модуль в контексте которого выполняется dll-ка-перехватчик. Если чужой процесс, то просто передал управление на оригинальную функцию (ничего страшного не произойдет, ведь перехват будет происходить в контексте данного процесса), если свой - проверяй адрес.
 
Статус
Закрыто для дальнейших ответов.