Добавлен , опубликован
Способ реализации:
Версия Warcraft:

Внимание!

Все последующие обновления моих ресурсов будут делаться в моей вк группе, которую можно найти в профиле.

Внимание!

При скачивании, Вам будет доступна тестовая карта, открываемая в JNPG World Editor.
Вы можете как тестировать хаки на этой карте, так и в целом скопировать все триггеры к себе в карту и тестировать в своей карте.
Мой совет, лучше в начале проверьте всё на моей карте, чтобы убедиться в том, что всё работает для ВАС как надо, а затем уже начинайте заниматься переносом.
Тем, кому WE неудобен как мне, можете смело брать war3map,j и из него переносить код, только надо будет немного очистить от ненужного кода WE.
Спасибо за внимание!

Что делает Антихак:

Антихак проверяет валидность байтов по заданным адресам и в случае не соответствия, в зависимости от флага в переменной bIsHackKick решает, что делать. Если хак можно запатчить (отключить), то будет вызвана функция PatchMemory, которая восстановит валидные байты в памяти, которые были изменены хаком. Если же АнтиХак не может запатчить хак, то игрок будет кикнут вне зависимости от флага bIsHackKick.
Кик определяется выделением невыделяемого обычными мерами юнита, благодаря которому, вызывается триггер TriggerRegisterPlayerUnitEvent с ивентом EVENT_PLAYER_UNIT_SELECTED. Что позволяет нам посылать в общий чат сообщение о том, что тот или иной игрок был выкинут за хаки.
Спидхак и в целом изменения системных .dll всегда приводят к выкидыванию нарушителя, так как восстановить системные .dll, а точнее детуры или хуки не является возможным.

Содержит:

  1. 120 адресов, которые потенциально используются хаками.
  2. 30 VТаблиц, которые потенциально используются хаками.
  3. Обнаружение Unreal MapHack от Karaul0v.
  4. Практически полное обнаружение хака W3SH.
  5. Практически полное обнаружение хака RGC Hack.
  6. Практически полное обнаружение TFTLocal.
  7. Обнаружение SpeedHack.

Требования:

  1. JNPG и знания работы с кодом.
  2. Warcraft 3 версии 1.26а и только 1.26а.
  3. Открыть карту в JNPG или же вытащить war3map.j код с помощью MPQ Editor.
Если открыли в JNPG:
  1. Скопируйте все триггеры в вашу карту.
  2. Вызовите функцию Init_MemoryHack ровно 1 раз.
Если открыли в Notepad++
  1. Вставить natives из кода над globals.
  2. Вставить переменные из globals в Вашу карту.
  3. Вставить остальной код сохраняя целостность в любое выбранное Вами место.
  4. Не забыть вызвать функцию Init_MemoryHack (желательно из main функции).
`
ОЖИДАНИЕ РЕКЛАМЫ...
20
0 комментариев и 2 дизлайка - вопрос, за что и почему.
Поясняю, ресурс создан для отлова хаков через карту, хотя видать читерам это и не понравилось...
33
Какие ещё читы, у нас народ что делает, что играет только в Melee карты
32
Unryze, ну хз, кстати в ранних версиях банило за безобидный софт, вроде хп\мп бара.
Кстати совсем забыл, добавили блок кнопки сохранения? То мх с записью уже будет фаталить при сохранении игры.
20
Bergi_Bear:
Какие ещё читы, у нас народ что делает, что играет только в Melee карты
Юмор оценил :)
quq_CCCP:
Unryze, ну хз, кстати в ранних версиях банило за безобидный софт, вроде хп\мп бара.
Кстати совсем забыл, добавили блок кнопки сохранения? То мх с записью уже будет фаталить при сохранении игры.
В ранних моих версиях? Да, я безразборно разбирал хаки и добавлял, потом лишь доходило какой адрес за что отвечает.
Код для блока сейва:
	globals
		timer SaveBlockTimer = CreateTimer( )
		dialog PreventSave___Dialog = DialogCreate()
	endglobals
		
	function PreventSave___Exit takes nothing returns nothing
		call DialogDisplay(GetLocalPlayer(), PreventSave___Dialog, false)
	endfunction

	function PreventSave___StopSave takes nothing returns boolean
		local boolean GameAllowSave = false

		if GameAllowSave == false then
			call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "Save Game is Disabled")
			call DialogDisplay(GetLocalPlayer(), PreventSave___Dialog, true)
		endif

		call TimerStart( SaveBlockTimer, 0.00, false, function PreventSave___Exit)

		return false
	endfunction

	function AntiSaveSystemInit takes nothing returns nothing
		local trigger AntiSaveLocalTrigger = CreateTrigger()
		call TriggerRegisterGameEvent( AntiSaveLocalTrigger, EVENT_GAME_SAVE )
		call TriggerAddCondition( AntiSaveLocalTrigger, Filter(function PreventSave___StopSave ) )
		set AntiSaveLocalTrigger = null
	endfunction
32
Unryze, насчет сейва -
function DisableSaveGameSaveButton takes nothing returns nothing
    local integer pSaveGameSaveButton = GetFrameItemAddress("SaveGameFileEditBox",0)
    if pSaveGameSaveButton > 0 then
        set Memory[pSaveGameSaveButton/4 + 0x1D4/4] = 0
        set Memory[pSaveGameSaveButton/4 + 0x108/4] = 0
        set Memory[pSaveGameSaveButton/4 + 0x1E8/4] = 0
    endif
    set pSaveGameSaveButton = GetFrameItemAddress("FileListFrame",0)
    if pSaveGameSaveButton > 0 then
        set Memory[pSaveGameSaveButton/4 + 0x10C/4] = 0x3B03123E
    endif
endfunction
Вот на мемхаке, этот вариант надежен и не даст сохранить игру и вызвать фатал.
20
quq_CCCP:
Unryze, насчет сейва -
function DisableSaveGameSaveButton takes nothing returns nothing
    local integer pSaveGameSaveButton = GetFrameItemAddress("SaveGameFileEditBox",0)
    if pSaveGameSaveButton > 0 then
        set Memory[pSaveGameSaveButton/4 + 0x1D4/4] = 0
        set Memory[pSaveGameSaveButton/4 + 0x108/4] = 0
        set Memory[pSaveGameSaveButton/4 + 0x1E8/4] = 0
    endif
    set pSaveGameSaveButton = GetFrameItemAddress("FileListFrame",0)
    if pSaveGameSaveButton > 0 then
        set Memory[pSaveGameSaveButton/4 + 0x10C/4] = 0x3B03123E
    endif
endfunction
Вот на мемхаке, этот вариант надежен и не даст сохранить игру и вызвать фатал.
Ну, без мемхака это дело тоже решается, кодом выше, я просто не хочу юзать мемхак там, где это не нужно, но за код спасибо (не помню был ли он в оригинальном мемхаке).
32
Unryze, был и в оригинале, темболее у тебя так или иначе мх на запись, т.е сломанный массив, так что тут уже глупо отнекиватся. На хайве GetFraemAdress есть под 1.26, кстати мб тебе мемхак кинуть под 1.27+?
20
quq_CCCP:
Unryze, был и в оригинале, темболее у тебя так или иначе мх на запись, т.е сломанный массив, так что тут уже глупо отнекиватся. На хайве GetFraemAdress есть под 1.26, кстати мб тебе мемхак кинуть под 1.27+?
Мемхак мне толком не интересен, потому это бесполезно, да и при желании я и сам смогу это сделать, если разберу game.dll новых версий, но это бесполезно.
Про "отнекивание" речь шла о том, что это бесполезный код и можно решить эту проблему менее затратным результатом, про "оригинал" я о том, что выложил Драколич, когда я его брал - это было года 3 назад, может и больше.
32
Не драколич этот код и придумал, чтобы его дота не фаталила при сейве игры, это был самый простой способ - запретить сейв, вот этот кусок с хайва, обьем меньше в разы, нет не триггеров, не таймеров, вовсе хендлов.
20
quq_CCCP:
Не драколич этот код и придумал, чтобы его дота не фаталила при сейве игры, это был самый простой способ - запретить сейв, вот этот кусок с хайва, обьем меньше в разы, нет не триггеров, не таймеров, вовсе хендлов.
Однако, чтобы этот код вызывать нужно вставлять мемхак, а мой код можно вставить в карты без мемхака, непривычно досконально пояснять банальную информацию.
Я и не говорил, что он его придумал, я сказал о сорсе, с которого я взял основу.
Пойми уже, пихать везде мемхак - ужасная затея, особенно туда, где он явно не нужен.
П.С. скинул тебе в дискорд версию Антихака с детектом sHack.
32
Unryze, смысли, прям из твоего кода, лол, твой детект и есть мемхак который требуется для запуска этого дела... Ничего болье, ну кроме одной переменной - pGetFrameItemAddress = GameDLL + 0x09EF40.
20
quq_CCCP:
Unryze, смысли, прям из твоего кода, лол, твой детект и есть мемхак который требуется для запуска этого дела... Ничего болье, ну кроме одной переменной - pGetFrameItemAddress = GameDLL + 0x09EF40.
В дискорде отвечал, но сюда ответ закину.
Смысл в том, что удобнее использовать отдельный код, который может работать без мемхака, в этом вся суть. Хотя добавить в АнтиХак это дело вполне логичная тема.
Сообщение просто для пояснения, не более.
30
Смысл в том, что удобнее использовать отдельный код, который может работать без мемхака
Мемхак может работать без мемхака, это как-то странно.
20
NazarPunk:
Смысл в том, что удобнее использовать отдельный код, который может работать без мемхака
Мемхак может работать без мемхака, это как-то странно.
Чего...? Речь о коде для антисейва, читайте внимательно.
16
не понял, нафига в антихаке ряд повторяющихся бессмысленных проверок
		call CheckAddrData(   7, 0x36143C, 0x00000001 ) //							|
		call CheckAddrData(   8, 0x36143D, 0x00000001 ) //							|
		call CheckAddrData(   9, 0x36143E, 0x00000001 ) //							|
		call CheckAddrData(  10, 0x36143F, 0x00000001 ) //__________________________|
4 подряд на один и тот же адрес, потому что чтения нечетных адресов нет
20
DracoL1ch:
не понял, нафига в антихаке ряд повторяющихся бессмысленных проверок
		call CheckAddrData(   7, 0x36143C, 0x00000001 ) //							|
		call CheckAddrData(   8, 0x36143D, 0x00000001 ) //							|
		call CheckAddrData(   9, 0x36143E, 0x00000001 ) //							|
		call CheckAddrData(  10, 0x36143F, 0x00000001 ) //__________________________|
4 подряд на один и тот же адрес, потому что чтения нечетных адресов нет
Ну, эти адреса были в ZodCraft и шли они вот так подряд, я исходил из этого, ну и похожее было в Neon хаке (не Xenon), просто я думал, что раз они по ним делают изменения, то должен же быть смысл - это одни из первых адресов, которые я вписывал, тогда считай на абум добавлял, если реально это бессмысленно и тому есть прямое подтверждение, то убрать не проблема.
Но тогда спрашивается почему разработчики хаков это делают? :D
Так же если их читать через GameDll а не через мемхак по GameBase то получается вот это:
CheckMHData( 7, 0x36143C, 0x00000001 );
CheckMHData( 8, 0x36143D, 0xD3000000 );
CheckMHData( 9, 0x36143E, 0xE8D30000 );
CheckMHData( 10, 0x36143F, 0x3BE8D300 );
Не исключено, что чтение через C++ идёт в разрез с чтением через мемхак, но адреса выдают же значения, а не пустышки, хотя они нечётные.
16
так ты когда офсет на 4 делишь, у тебя падают все 4 к "36143C/4", три последующих не имеют смысла, поэтому и сказал
20
DracoL1ch:
так ты когда офсет на 4 делишь, у тебя падают все 4 к "36143C/4", три последующих не имеют смысла, поэтому и сказал
А, точно, вот с этим я затупил (мы же делим целочисленные), спасибо, а то я в глаза долбился, 2 + за наводку :)
16
а в 79/80 у тебя будет ложное срабатывание, если GameDLL окажется не на 6F000000
20
DracoL1ch:
а в 79/80 у тебя будет ложное срабатывание, если GameDLL окажется не на 6F000000
На удивление ещё ни разу не было, но, как вариант, что нужно сделать, чтобы GameDLL был не на 6F000000? Просто это чудо уже отслужило в FOA/MVB/AFB/NL/NWU и ещё паре карт, но вот когда я VTables проверял тупо как адреса, вот там ложных срабатываний была уйма :(
Кстати, я по твоей подсказке зачистил от лишних адресов, думаю позже апдейтнуть. И такой вопрос, можно ли как-то Мемхаком как в С взять и "реверсить" хак? Ну, возвращать оригинальное значение? В С вышло, а вот на Джассе не хочет падла, фаталит :(
16
это рандомно, часто садится на 6F, но когда ут ебя будет 20к разнообразных клиентов ежедневно, быстро увидишь огромное количество вылетов
берешь и переписываешь память, предварительно её разлочив на запись. а хак может повторить перезапись. смысла мало
и у меня модуль Msseax.m3d дефолтно используется игрой, а у тебя он считается хаком
20
DracoL1ch:
это рандомно, часто садится на 6F, но когда ут ебя будет 20к разнообразных клиентов ежедневно, быстро увидишь огромное количество вылетов
берешь и переписываешь память, предварительно её разлочив на запись. а хак может повторить перезапись. смысла мало
и у меня модуль Msseax.m3d дефолтно используется игрой, а у тебя он считается хаком
Ну, Mssseax я кстати местами спутал с Reverb2.flt, но этот файлик использовал W3SH хак, хотя по факту все адреса оттуда я и так детекчу, потому думаю стоит это убрать.
Такс, а разве запись и чтение карты не открывается как раз в инициализации? Если нет, то можешь подсказать, через что нужно разблокировать запись? Просто я думаю если это сделать, то лучше просто "восстанавливать" локально читеру память и деактивировать чит, нежели кикать.
32
Только потом нужно после изменения восстановить протект.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.