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

Тема в разделе "Delphi - Сети", создана пользователем SharedNoob, 25 июн 2007.

Статус темы:
Закрыта.
  1. SharedNoob

    SharedNoob Гость

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

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

    Зараннее благодарен.
     
  2. zubr

    zubr Гость

    Я как то делал похожее, для этого перехватывал функцию recvfrom
     
  3. SharedNoob

    SharedNoob Гость

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

    zubr Гость

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

    SharedNoob Гость

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

    zubr Гость

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

Поделиться этой страницей