Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ DC-клиенты _ Скрипт бана читеров

Автор: Setuper 25.5.2009, 17:05

Вот накатал скрипт для бана читеров.
Используем грейлинк, для того, чтобы банить читеров big_smile.gif

Название скрипта: cheats-detector
Версия: 1.1
Автор: Setuper
Описание: Ловит несоответствия в размере шары. В действиях можно указать бан пользователя.
Команды:
/checkshare nick - проверка пользовтеля с указанным ником
/checkshare - проверка всех пользователей данного хаба
/luafile startup.lua - команда запуска скрипта
/lua dcpp = nil - команда остановки скрипта

Для работы скрипта в папке lua должны находиться библиотеки lua32.dll и dcutil32.dll (или соответствующие 64 разрядные)
Сам скрипт кидаем в папку scripts. Скрипт будет запускаться автоматически при старте клиента.

Открываем файл Settings/CustomMessages.ini и дописываем туда:

Код
/lua dcpp = nil
/luafile startup.lua
/checkshare
После этого можно будет не запоминать команды, а юзать меню "пользовательские сообщения".


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

Юзаем и отписываем сюда если что не так big_smile.gif


 startup.lua ( 4.45 килобайт ) : 150

Автор: ustas 25.5.2009, 19:24

немного изменил код, добавил

Код
local sMsg1 = [[Юзер [NI] с IP: [I4] не балуется читами
    Тэг: [TAG]
    Размер файл-листа: [SIZE] байт
    Шара: [SS] байт
]]

и
Код
function dcpp.OnDownloadFinished(sFile, uid)
  local iSize, tUser, tList = 0, tAPI:GetUserInfo(uid), dcutil.loadlist(sFile..".xml.bz2")
  for _, v in pairs(tList) do
    iSize = iSize + v.size
  end
  if iSize < tonumber(tUser.SS) then
    tAPI:new():SimPublicMessage(tUser.HL, tAPI:ToUtf8(("<%s> "):format(sBot)..SetParams(tUser, sMsg):gsub("%[SIZE%]", iSize)))
    if sAction then
      tAPI:new():SendPublicMessage(tUser.HL, tAPI:ToUtf8(SetParams(tUser, sAction)))
    end
    else
    tAPI:new():SimPublicMessage(tUser.HL, tAPI:ToUtf8(("<%s> "):format(sBot)..SetParams(tUser, sMsg1):gsub("%[SIZE%]", iSize)))
  end
end


и проверил, вот что получилось
Цитата
[2009-05-25 20:14] :?? <LUABOT> Проверяю файл-лист пользователя: ustas
[2009-05-25 20:17] :?? <LUABOT> Юзер ustas с IP: 127.0.0.1 не балуется читами
Тэг: <UstasDC++ V:1.0,M:A,H:0/0/2,S:3,L:5128>
Размер файл-листа: 917406161892 байт
Шара: 912392882203 байт

размеры разные. Читы отключены
проверяет 3 минуты - это нормально? (100 мбит)
p.s. 3 минуты из-за большой шары, для шары 50 Мб почти мгновенно
баг - после того, как запустил проверку юзера, когда пытаюсь скачать файллист другого юзера, тоже выполняется его проверка

Автор: Delion 25.5.2009, 19:35

Цитата
Ловит несоответствия в размере шары

Непонятно. Что в точности он делает?
И будет ли работать в других клиентах с поддержкой LUA?

Автор: Setuper 25.5.2009, 19:47

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

Можно использовать небольшие читы и детектор не сработает. Он будет срабатывать только при явном завышении шары, при завышении примерно на 3%.

ustas: Насчёт твоей дописки, не вижу в ней смысла. Это только будет не по детски грузить клиент (как раз минуты 3). Нужно выводить сообщение только если найден чит!

Кстати говоря, в сообщении sMsg можно использовать следующие тэги:

Код
    [NI] -- ник
    [I4] -- ip
    [DE] -- описание
    [EM] -- email
    [SS] -- точная шара
    [SSshort] -- форматированния шара
    [TAG] -- тэг
    [TA] -- тэг
    [VE] -- версия клиента
    [US] -- тип соединения
    [CO] -- тип соединения
    [HN] -- hubs unreg
    [HR] -- hubs reg
    [HO] -- hubs op
    [SL] -- слоты
    [ST] -- магический байт
    [AW] -- режим away (== "1" иначе nil)
    [LOC] -- местоположение
    [OP] -- статус оператора (== "1" иначе nil)
    [HL] -- хаб
    [ME] -- я (== "1" иначе nil)
    [RG] -- зарегистрирован на данном хабе


В других клиентах с поддержкой lua совершенно другие функции api, поэтому работать не будет однозначно. Сомневаюсь, что другие клиенты с поддержкой lua настолько же богаты api функциями.

Автор: ustas 25.5.2009, 19:50

Цитата(Setuper @ 25.5.2009, 20:44) *
Насчёт твоей дописки, не вижу в ней смысла. Это только будет не по детски грузить клиент (как раз минуты 3). Нужно выводить сообщение только если найден чит!
согласен. Просто хотел проверить, как работает.

Автор: Setuper 25.5.2009, 20:00

Цитата(ustas @ 25.5.2009, 20:24) *
баг - после того, как запустил проверку юзера, когда пытаюсь скачать файллист другого юзера, тоже выполняется его проверка

Это не баг. Проверка будет выполняться при любом скачивании файл-листа, в противном случае, если делать проверку только по команде, то нагрузка на проверку того, что я качаю файл-лист только для проверки будет значительной.

Безусловно лучше конечно делать проверку юзеров непосредственно при их входе на хаб, однако такой функции пока нет.

Автор: ustas 25.5.2009, 20:16

добавил в грее 100 ГБ

Цитата
[21:14:29] <LUABOT> Юзер ustas с IP: 127.0.0.1 не балуется читами
Тэг: <UstasDC++ V:1.0,M:A,H:0/1/1,S:3,L:5128>
Размер файл-листа: 1025778261638 байт
Шара: 1020764981949 байт

фейк шару не определил

Автор: Setuper 25.5.2009, 20:34

Мда... Под петабайт слишком большая шара.
Если у человека расшарено под петабайт, то не думаю, что он будет подделывать шару, и даже если и будет, то это не так важно. big_smile.gif
В общем из-за сжатия конечно косяк.

Автор: ustas 25.5.2009, 20:44

Цитата(Setuper @ 25.5.2009, 21:34) *
Мда... Под петабайт слишком большая шара.
Если у человека расшарено под петабайт, то не думаю, что он будет подделывать шару, и даже если и будет, то это не так важно. big_smile.gif
В общем из-за сжатия конечно косяк.

оставил только фейк шару
Цитата
[21:40:37] <LUABOT> Юзер ustas с IP: 127.0.0.1 не балуется читами
Тэг: <UstasDC++ V:1.0,M:A,H:0/1/1,S:3,L:5128>
Размер файл-листа: 104857909510 байт
Шара: 104857909510 байт

Автор: Setuper 25.5.2009, 20:49

Хехе.
Данный скрипт не проверяет подлинность файл-листа, он только сравнивает шару и размер файлов в файл-листе.
Для проверки нужно скачать случайный файл, что в принципе можно реализовать в скрипте.

Автор: ustas 25.5.2009, 20:54

Цитата(Setuper @ 25.5.2009, 21:49) *
Для проверки нужно скачать случайный файл, что в принципе можно реализовать в скрипте.

допустим у меня реальная шара 50 ГБ + фейков на 50 ГБ. Все файлы качать нереально, тогда как скрипт определит, что вот этот файл фейковый, а этот реальный?

Автор: Setuper 25.5.2009, 21:03

Никак. Повторяю, что данный скрипт предназначен только против настройки "плюс к шаре"!
Против подделки файл-листа методов борьбы думаю, что нету.

Автор: ustas 25.5.2009, 21:29

Цитата(Setuper @ 25.5.2009, 22:03) *
Никак. Повторяю, что данный скрипт предназначен только против настройки "плюс к шаре"!
Против подделки файл-листа методов борьбы думаю, что нету.
Так в грее при использования "+ к шаре" как раз используется фейковая шара. Т.е. грей не отловить. Жаль

Автор: FallenAngel 25.5.2009, 22:28

Обнаружен читер!
Ник: [PNZ]Джони
IP: IP
Тэг: <gl++ V:5.57,M:A,H:6/1/0,S:16>
Размер файл-листа: 25097765796 байт
Шара: 25946967410 байт

[23:20:33] <[=БОТ=]> *** Ошибка [PNZ]Джони не на хабе.

Потом по IP посмотрел- ник у юзера [PNZ]Джони
С этим как бороться?big_smile.gif Ну я то его вручную забанил. А эт "на заметку" чтоль..

Автор: Setuper 25.5.2009, 22:49

Исправил баг. Скрипт перезалил.

Автор: FallenAngel 26.5.2009, 7:20

Хм... А как именно определяется несоответствие шар? А то выдает несколько ников- якобы у них шара поддельная, но проверяю сам файлист у них-но шара нормальная вполне. Нету ни одного "лишнего" файла...

Автор: Delion 26.5.2009, 10:04

Цитата
Данный скрипт не проверяет подлинность файл-листа, он только сравнивает шару и размер файлов в файл-листе

Пффф. Без обид,но ты изобрёл велосипед.
Очередная неудавшаяся пиар-акция Грея.

Автор: Setuper 26.5.2009, 12:17

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

Автор: Otshelnik-Fm 26.5.2009, 22:26

Всё сделал как написано в первом посте. Запускаю клиент - пишет что скрипт запущен... а дальше ничего не происходитю Как действовать? запускаю командой /checkshare -

Цитата
[02:32:13] <LUABOT> Проверяю файл-листы всех пользователей
- и за сутки ничего в чат так и не выдало. В чем причина? Знаю что из 200 человек один но с обманной шарой.

Сорри - Надо скачать файл листы со всех пользователей!

Разобрался

а вот это нормально?

Цитата
[23:12:50] <LUABOT> Обнаружен читер!
Ник: paiper
IP: 95.84.48.214
Тэг: <ApexDC++ V:s14,M:A,H:12/0/0,S:9>
Размер файл-листа: 33691368196 байт
Шара: 33796225796 байт
- в списке файлов написал 31.38 Гб шара

С виду вроде нормальная шара - ну отличается она на 2 гига от того что написал бот
. А другой юзер с 200 гигами fdgjhfjhbgjbndgjkbndjghnb.avi файлов и 50 гигами нормальных файлов - не забанен. так смысл в этой "фишке"?

Стоит не банить юзера а просто выдавать админу в чат что подозрительный юзер на хабе...
Закоментировав 27 строку
Код
local sAction = "!ban [NI] Подделка шары"
- я же не буду банить пользователей?

Автор: Setuper 26.5.2009, 22:56

Ещё раз повторяю, что скрипт предназначен против циферного добавления шары. Скрипт не отлавливает подделанные файл-листы.

Для отключения бана нужно просто не ставить действие:

Код
local sAction = nil
или так
Код
local sAction = false

Автор: Otshelnik-Fm 26.5.2009, 23:08

Скрипт можно настроить чтобы он потом анализировал по согласным буквам? по 5 согласным буквам подряд - и если находит - то админу сообщение? примеры из реальной шары: ggvbfdwh hzz uuxr.avi glgphmd tjnljd egmjjyx.avi fatsljge dbznqthud.mkv - а в русском, да и в английском языке я, думаю, что слов с 5 подряд согласными буквами нет... а если есть то для них можно со временем сделать список исключений. А если между согласными символ (Р.С,Ф,С,Р - к примеру) - то такие не отлавливать

Автор: Setuper 26.5.2009, 23:17

Да прямо сейчас могу написать как это сделать)))

Автор: Delion 26.5.2009, 23:24

Цитата
в русском, да и в английском языке я, думаю, что слов с 5 подряд согласными буквами нет


РСДРП
RSXPP

Бредовая идея.

Автор: Otshelnik-Fm 26.5.2009, 23:27

Да вопрос не в этом.. можно 7 букв (да и про список исключений не забыть)

Setuper - юмор понял

Автор: Delion 26.5.2009, 23:29

Цитата
можно 7 букв (да и про список исключений не забыть)

Такие аббревиатуры найдутся. И с исключениями ни фига не выйдет - первый же претендент будет спорным.
Да и до семи согласных гласная где-нить да проскочит.

Автор: Setuper 26.5.2009, 23:43

В общем можно после строки iSize = iSize + v.size добавить код:

Код
if CheckName(v.name) then
  tAPI:new():SimPublicMessage(tUser.HL, tAPI:ToUtf8(("<%s> Сработал фильтр."):format(sBot)))
  if sAction then
    tAPI:new():SendPublicMessage(tUser.HL, tAPI:ToUtf8(SetParams(tUser, sAction)))
  end
  return
end
и добавить функцию CheckName:
Код
function CheckName(sName)
  -- Тут находим в имени sName всё, что угодно.
  -- Если найденное нас не устраивает, пишем return true
end


Это был не юмор!

При помощи lua скриптов на имена файлов можно накладывать любые фильтры.
Скрипт располагает следующей информацией о каждом файле в файл-листе: tth, path, name, size

Предлагайте фильтры! А я напишу что нужно.

Автор: Otshelnik-Fm 26.5.2009, 23:46

А в

Код
function CheckName(sName)
  -- Тут находим в имени sName всё, что угодно.
- сюда что вбивать все возможные совпадения??
или я что то не понял..

Нет не в имени пользователя а в шаре файл кино но с названием fghfrdrity.avi - я про это

Цитата
Такие аббревиатуры найдутся. И с исключениями ни фига не выйдет - первый же претендент будет спорным.
Да и до семи согласных гласная где-нить да проскочит.
- для этого его не банить сразу а привлекать внимание администрации - чтобы она анализировала и изменяла фильтр скрипта

Автор: Setuper 26.5.2009, 23:53

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

Можно попробовать проверять не слишком маленькие и не слишком большие фрагменты английских слов, которые словами не являются.

Автор: Otshelnik-Fm 26.5.2009, 23:59

почему не катит ? Указываем что >6 согласных Ssogl подряд (из списка Ssogl= qwrtpsdfghklzxcvbnm ) - если они встречаются то sendMessage админу -"тревога! возможно читер" - а админ смотрит глазками и действует ( поймите не несколько а много согласных подряд) - сам только что у 4 юзеров глядел из 100 фейковых файлов .avi у 5 файлов как минимум подряд огромное количество согласных!

Автор: Setuper 27.5.2009, 0:23

тогда после строки iSize = iSize + v.size добавляем код

Код
local sName = CheckName(v.name)
if sName then
  tAPI:new():SimPublicMessage(tUser.HL, tAPI:ToUtf8(("<%s> Сработал фильтр. Подозрительное имя файла: %s. Паттерн: %s. Пользователь: %s [%s]"):format(sBot, v.name, sName, tUser.NI, tUser.I4)))
  return
end


И добавляем функцию:
Код
local sCN = "[bcdfghjklmnpqrstvwxz]"
local iNumRep = 7 -- число повторений подряд согласных букв в имени файла
function CheckName(sName)
  return sName:match("("..sCN:rep(iNumRep)..")")
end


Действительно даже 7 согласных подряд достаточно часто попадаются big_smile.gif Поэтому это действительны будет выходом. Сейчас напишу получше реализацию скрипта.

Автор: Otshelnik-Fm 27.5.2009, 0:28

а где в грее лог ошибок можно посмотреть (из файла) - подскажи - вот скрин:


Автор: Setuper 27.5.2009, 0:37

Да. Ошибки только там. Опечатку я сделал, поэтому и ошибка

Код
tUser.I4
точка вместо запятой.

Автор: Otshelnik-Fm 27.5.2009, 0:45

Работает... теперь дополнение - т.к. очень много срабатываний :

Цитата
[01:41:11] <LUABOT> Сработал фильтр. Подозрительное имя файла: AEGIS_aaaaaaaaarghhhhhh_B.wav. Паттерн: rghhhhh. Пользователь: xxx [78.29.109.223]
[01:41:15] <LUABOT> Сработал фильтр. Подозрительное имя файла: cnbjprn2.ic_. Паттерн: cnbjprn. Пользователь: Mileda [88.147.223.196]
[01:41:18] <LUABOT> Сработал фильтр. Подозрительное имя файла: cphttprequest.js. Паттерн: cphttpr. Пользователь: Р’РЅСѓРє_РјРѕСЂРѕР·Р·Р·Р·Р·Р· [88.147.141.43]
[01:41:20] <LUABOT> Сработал фильтр. Подозрительное имя файла: schemeejmrrbrjvn.pdf. Паттерн: jmrrbrj. Пользователь: axel [88.147.130.155]
[01:41:24] <LUABOT> Сработал фильтр. Подозрительное имя файла: adadasssssssssssssss.png. Паттерн: sssssss. Пользователь: ЖивыеЛюDРё [88.147.140.176]

то добавить искать только в расширении .avi и возможно (хотя лишнее) .mp3 - или по размеру менее 400 метров файлы не трогать (ну и папки тоже)

и чегото с кодировками русскими в названии ника не так :
Цитата
Пользователь: Р’РЅСѓРє_РјРѕСЂРѕР·Р·Р·Р·Р·Р· [88.147.141.43]


это в этой строке
Цитата
tAPI:new():SimPublicMessage(tUser.HL, tAPI:ToUtf8(("<%s> Сработал фильтр. Подозрительное имя
- utf8 надо заменить?

Автор: Setuper 27.5.2009, 0:58

Сейчас всё исправлю.

Вот новая версия. Вроде работает.
По умолчанияю отключил бан, так как многие нормальные файлы попадаются big_smile.gif
+ сделал ограничение на число оповещений от одного пользователя (поставил 3 оповещения от каждого пользователя при куче найденных повторах)

Автор: Otshelnik-Fm 27.5.2009, 1:05

много ловит мелких фоток... а по расширению (как выше писал) - так возможно?

Автор: Setuper 27.5.2009, 1:07

По расширению можно. Сейчас сделаю.

Автор: Otshelnik-Fm 27.5.2009, 1:17

заметил что качая 15 файл листов скачиваешь половину а дальше грей виснет. Можно прокрутить список пользователей - а процесс скачки встает. А когда хочешь ещё один файллист скачать - "не отвечает" - так уже происходило когда я со всех 98 юзеров начал качать файллист big_smile.gif

Автор: Setuper 27.5.2009, 1:21

Очередная версия.

Сделал ограничения по расширению и по размеру файла.

Да уж. Скачка сразу со всех да ещё и анализ файл-листов - это очень очень нагрузочно всё. Поэтому логичным выходом будет проверка пользователя после его непосредственного входа на хаб, однако это в перспективе, пока что надо сделать ручную проверку. Чтобы не тормозило проверяй по одному, а не всех сразу.

Автор: Otshelnik-Fm 27.5.2009, 1:31

offtop:
big_smile.gif - ниодного "знакомого" читера с обманной шарой не осталось - вот еще один критерий паразита - скачал и спать выключив комп... А сам шару накрутить не смог - в новом грее обыскался эту функцию и не нашел (если что о ней в личку).

Автор: Setuper 27.5.2009, 12:07

Ты о чём? Кто не мог накрутить?

Автор: Otshelnik-Fm 27.5.2009, 17:30

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

Автор: Setuper 27.5.2009, 18:56

В первом посту обновил версию. Во всех остальных удалил.

Автор: Otshelnik-Fm 27.5.2009, 20:02

Специально скачивал файл лист у читера. эффекта никакого.

Уменьшил до

Код
-- Число повторений подряд согласных букв в имени файла
local iNumRep = 5
-- Ограничитель по размеру файла
local iFileSize = 10 * 1024 * 1024


и сразу пошел отлов плохишей:
Цитата
[20:55:24] <LUABOT> Сработал фильтр.
Подозрительное имя файла: qax rjvjjqhmsu moqmtf qoudw mshvmwfl.mp3
Паттерн: vmwfl
Ник: DeDushka
IP: 95.84.17.60
Тэг: <gl++ V:5.62,M:A,H:0/1/0,S:3>
Шара: 486010957516 байт

[20:55:24] <LUABOT> Сработал фильтр.
Подозрительное имя файла: kkooyskv - leghvvogf xrbdhmvgn.mp3
Паттерн: hmvgn
Ник: DeDushka
IP: 95.84.17.60
Тэг: <gl++ V:5.62,M:A,H:0/1/0,S:3>
Шара: 486010957516 байт
[20:55:29] <LUABOT> Сработал фильтр.
Подозрительное имя файла: wltkjkv tfdfjpq.mp3
Паттерн: dfjpq
Ник: {_AntG_}
IP: 88.147.226.137
Тэг: <gl++ V:5.62,M:A,H:0/1/0,S:5>
Шара: 400014471967 байт

[20:55:29] <LUABOT> Сработал фильтр.
Подозрительное имя файла: qelryfflw kxujknma zsvdga btptahri zmbkhqjgb.mp3
Паттерн: hqjgb
Ник: {_AntG_}
IP: 88.147.226.137
Тэг: <gl++ V:5.62,M:A,H:0/1/0,S:5>
Шара: 400014471967 байт


Вот еще бы шару он показывал не
Цитата
Шара: 400014471967 байт
- не в байтах а в гигабайтах
И размер папки в которой нашел этот файл.

А на основе этих 2 показателей можно было бы сделать вывод к примеру:
Цитата
"Шара 400.50 Гб
Папка паттерна: 200Гб
Накрученная шара: 200.50 Гб"


Кто там говорил что не катит этот скрипт? - Ведь работает!

Автор: Setuper 27.5.2009, 21:33

Форматированная шара: http://mydc.ru/ipb.html?s=&showtopic=1983&view=findpost&p=15998
Размер папки определить нельзя.

Автор: x-ray 31.5.2009, 8:06

Цитата(Setuper @ 25.5.2009, 17:05) *
Для работы скрипта в папке lua должны находиться библиотеки lua32.dll и dcutil32.dll (или соответствующие 64 разрядные)

Setuper выложить библиотеки или ссылку где их найти можешь?

Сам нашел: http://mydc.ru/r/?http://home.tula.net/greylink/lua.rar

Автор: Kulak75 3.6.2009, 6:20

Из первого поста файл
-- Ограничитель по расширениям
local tExp = {"%.api", "%.mp3"}
явная опечатка.
И кстати наверно проще искать файлы через поиск (.mp3, .avi), раз при скачке файл-листов грей виснет.

Автор: NEW 24.10.2009, 0:06

подскажите пожалуйста, что не так. скрипт запускается, а вот при команде /checkshare nick или /checkshare пишет *** Неизвестная команда: checkshare.
все делалось на грее 5,72.

Автор: Dake 9.10.2010, 22:17

у меня ошибка: [22:16] Синтаксис ...gram Files\PtokaX DC Hub by Dake\scripts\startup.lua:56: attempt to call global 'DC' (a nil value)

Автор: Артём 9.10.2010, 22:29

Dake, laughing.gif c чего взял что все скрипты на этом форуме на птоку? Тему почитай, этот скрипт для DC++ victory.gif , даже в ошибке написано DC