,

Хак на память Warcraft3

» опубликован
» Способ реализации: vJass
» Тип: Наработка
» Версия Warcraft: 1.26 и ниже
Собственно тот знаменитый хак на память который нам радостно предоставил DracoL1ch, который позволяет нам больше не морочится с системами отлова урона, или вовсе узнать координаты курсора без стороннего по.
Для сохранения требуется: экспериментальная версия pjass.exe
Причём не все подходят, меньше всего проблем было с этой версией
В хаке присутствует только 1 пример на изменение белой атаки у героя, остальные готовые функции можно найти на:
Хайве
Гитхабе
Просто копируем саму функцию, все остальное для её работы есть в наработке и сохраняем.
Так же на хайве есть инструкция по созданию собственных функций для чтения\изменения данных в памяти игры.


Просмотров: 48 355



» Лучшие комментарии


Bergi_Bear #501 - 3 недели назад 0
quq_CCCP, А зачем по факту он нужен? я сделал систему мисов и критов основываясь на детекте урона и нормально всё, вообще буквально пара строчек
respect_gg #502 - 3 недели назад 0
Bergi_Bear, ну ты наверное в случае миса/блока и т.д. хилишь юнита, но урон то все равно проходит
Bergi_Bear #503 - 3 недели назад 0
нет, я даже не дамажу, когда проходит триггерный мисс, чтобы не прокнул хил и прочие баффы которые прилетают
quq_CCCP #504 - 3 недели назад 0
Bergi_Bear, для реализации вещей которые ждут именно завершения атаки, у лича так сделаны промахи, после успешного завершения атаки он ставит урон в 0 и все, промах готов. Так же можно в этот момент до нанесения урон отрегулировать его, реализация аналога безумия.
Так же это событие глобально для всех виджетов на карте, помнится много кто бился с детектом урона по предметам, а тут все как на ладони. Над попросить весь код системы у лича, посмотреть как сделано, мб там рили сложные вещи с помощью мемхака сделаны очень просто.
WAGARAX #505 - 3 недели назад 0
Где-то читал, что cJass не дает работать мемхаку, а в jngp он входит. Может быть поэтому у меня карты с мемхаком не работают, pjass я уже заменил.
Вдобавок джассхелпер не дает запуститься ни одной карте из-за ошибок, которые выдает в картах с мемхаком.
ScopteRectuS #506 - 3 недели назад 0
Ребята, помогите! У меня мемхак почему-то перестал работать после переустановки винды. Не работает именно моя карта, которую я сохраняю в жнгп, мемхак из детекта физического урона прекрасно работает, если его открыть сразу через игру (не пересохраняя в жнгп). Сравнивал код .j-файла моей карты и карты с детекта физ. урона; и там, и там код одинаковый.
Методом выключения части кода, обнаружил, что карта не запускается из-за функций C2I, B2I и т.д. При запуске карты открывается главное меню варика, но сама карта нормально сохраняется.
quq_CCCP #507 - 3 недели назад 0
ScopteRectuS, чето нетак делает пасер, pjass exe меняй или переустанавливай JNGP
ScopteRectuS #508 - 3 недели назад 0
quq_CCCP, я сравнивал .j-файл. Он везде одинаковый.
quq_CCCP #509 - 3 недели назад 0
ScopteRectuS, там дело в кодировке или чем то еще связянным с отсупами и именами,
Bergi_Bear #510 - 3 недели назад 0
ScopteRectuS, я по этой же причине не мог запустить мемхак первые 3 месяца когда о нём узнал, долго долбил всех, помогло когда я jngp вместе pjass в другую папку перенёс, тогда перестало выкидывать в главное меню
ScopteRectuS #511 - 3 недели назад 0
quq_CCCP, не помогло.
Bergi_Bear, тоже не помогло.
pro100master #512 - 3 недели назад 0
скрини редактор с Jass меню и папки где ты кидал pjass в папку и так далее. мб ты в ней пропустил.
ScopteRectuS #513 - 3 недели назад 0
pro100master,
C:\User Files\newgen5d
pro100master #514 - 3 недели назад 0
ты положил на прямую pjass в редактор?
ведь заменять должен а не добавлять.
к примеру C:\Program Files\Jass New Gen Pack Rebuild\jasshelper сюда pjass и заменяем...
ScopteRectuS #515 - 3 недели назад 0
pro100master, заменил кончено. Я не настолько глуп.
PT153 #516 - 3 недели назад 0
Запуск от администратора пробовал?
Я бы убрал бы JNGP с диска С.
8gabriel8 #517 - 3 недели назад 0
У меня на C:\ прекрасно работает, смысл убирать?
pro100master #518 - 3 недели назад 0
системный диск нет место всяких программ +) создай диск D в него пихай что хотите =)
8gabriel8 #519 - 3 недели назад 0
А серьёзные обоснования есть?
PT153 #520 - 3 недели назад 0
А серьёзные обоснования есть?
Могут быть проблемы с правами.
NazarPunk #521 - 3 недели назад (отредактировано ) 0
Могут быть проблемы с правами.
У меня Win10 например не даёт MdlVis текстурки с диска С подтягивать и JNGP случайным образом выдаёт отшибки, если на C лежит.
ScopteRectuS #522 - 3 недели назад 0
PT153, запуск от имени администратора не помог. С диска "С" всё норм должно работать, потому что у меня жнгп находится не в Program Files, a в другой папке для доступа к которой не нужны права администратора.
pro100master, диск "Д" у меня предназначен для других задач.
PT153 #523 - 3 недели назад 0
Дело может быть в кодировке, как и говорил quq_CCCP. Зайди в региональные настройки.
ScopteRectuS #524 - 3 недели назад 0
Сюда? А что нужно изменить?
прикреплены файлы
PT153 #525 - 3 недели назад (отредактировано ) 0
Сюда? А что нужно изменить?
В панели управления.
В "Копировать параметры" скопируй куда только можно.
Ну а вообще скачай последний pjass.exe, потому что в одном была проблема с кодировкой. Они все поддерживают игнорирование семантических и синтаксических ошибок.
прикреплены файлы
ScopteRectuS #526 - 2 недели назад (отредактировано ) 0
quq_CCCP #527 - 2 недели назад 0
Нужно будет прикрепить вначале темы, мб у кого еще проблемы?
PT153 #528 - 2 недели назад 0
Пишет 403 Forbidden. Походу, сайт думает, что я пытаюсь какой-то инжект сделать.
Всё заработало. Заменил следующие три файла:
Это файлы vJass, надо было просто его отключить. Вполне возможно, что всё дело было в файле конфигурации.
ScopteRectuS #529 - 2 недели назад 0
PT153, но без vJassa карту вообще не получится сохранить из-за библиотек, глоб. переменых и т.д.
WAGARAX #530 - 2 недели назад 0
Есть ли какой-то список с значениями типа "0x134", "0xE0" и к чему они ведут? Просто сам смог найти только вот это -https://www.hiveworkshop.com/threads/memhack-units-structure.289691/
Лазить по статьям и в комментариях для каждого как-то не очень, да и для некоторых так и не нашел описание.
Bergi_Bear #531 - 2 недели назад 2
WAGARAX, вот тут лич всё расписал www.hiveworkshop.com/threads/memory-hack-api-description.289823
остальное спрашивай что не понятно что делает
quq_CCCP #532 - 2 недели назад 0
WAGARAX, Адресса и оффсеты, а так же инструкции. Все сугубо индивидуально. Потому что можно просто менять значения в структуре - тогда нужны оффсеты, а можно сделать "хук" - своего рода событие на выполнение кода в движке, которое запустит другой код, это уже инструкции.
quq_CCCP #533 - 1 неделю назад 0
Ну вот готовый хук для детекта успешного завершения атаки.
Это не событие на 1 юнита, это событие сразу на весь клас widget, как только какой либо юнит совершит атаку по любому виджету, это событие сработает. В этом событии и вешаются модификаторы атаки (в движке). Можно сделать пассивки на атку для мили юнитов. Функции изменения атаки у юнита и прочее спрашивать у DracoL1ch.
» код
library EventUnitAttackSuccess requires Memory, Utils

globals
  integer pGlobalUnitArrayForDataPassing=0
  trigger OnAttack = null
  integer SimulatedAttackCounter = 0
  integer pReservedMemoryForMeleeAttackHook = 0
  integer pMeleeAttackCatcher = 0
  integer DataArray1Address
  integer DataArrayA
  integer array l__DataArrayA
  unit GlobalUnitArrayForDataPassing
  unit array l__GlobalUnitArrayForDataPassing
endglobals
 
 function PresetSomeArray takes nothing returns nothing
    set l__GlobalUnitArrayForDataPassing[1]=null
    set l__GlobalUnitArrayForDataPassing[1099]=null
    set l__DataArrayA[1]=0
    set l__DataArrayA[8191] = 0
    return
endfunction
 
function GetDataFromDataArray1 takes integer i returns integer
    return l__DataArrayA[i]
endfunction

function GetDataFromUnitArray takes integer i returns unit
    return l__GlobalUnitArrayForDataPassing[i]
    return null
endfunction
 
private function TypecastDataArrayA takes nothing returns nothing
local integer DataArrayA
endfunction

//# +nosemanticerror
function GetDataArrayAAddress takes nothing returns integer
return l__DataArrayA
endfunction 

private function TypecastUnitArray takes nothing returns nothing
    local integer GlobalUnitArrayForDataPassing
endfunction

//# +nosemanticerror
function GetUnitArrayAddress takes nothing returns integer
    return l__GlobalUnitArrayForDataPassing
endfunction
 
function TimerExpires takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit attacker = LoadUnitHandle(ChargesIndicatorData, id, 0 )
    local real damage = LoadReal(ChargesIndicatorData, id, 1)
    
    call SetUnitGreenBonusDamage(attacker, R2I(damage) )
    
    call FlushChildHashtable(ChargesIndicatorData, id)
    call DestroyTimer(t)
    
    
    set attacker = null
    set t = null
endfunction
 
function OnAttackDamageCalculationHook takes nothing returns nothing
    local integer isource=GetDataFromDataArray1(65)
    local integer itarget=GetDataFromDataArray1(66)
    local integer result=GetDataFromDataArray1(68)
    local unit attacker 
    local unit attacked
    local timer t 
    local integer id


    if result ==  1 then
        set attacker = GetDataFromUnitArray(3)
        set attacked = GetDataFromUnitArray(4)
        call BJDebugMsg("Ура в жопе дыра!")
    endif
    
    set attacker = null
    set attacked  = null
endfunction
 
function InitAttackDamageCalculationHook takes integer pTriggerHandle returns nothing
    local integer old1=RMem(pMeleeAttackCatcher)
    local integer old2=RMem(pMeleeAttackCatcher+4)
    local integer oldprotection = ChangeOffsetProtection(pMeleeAttackCatcher,8,0x40)
//call echo("jook "+Int2Hex(pReservedMemoryForMeleeAttackHook))
   
    set Memory[pReservedMemoryForMeleeAttackHook/4+0]=0x30498B60
    set Memory[pReservedMemoryForMeleeAttackHook/4+1]=0x000000BB
    set Memory[pReservedMemoryForMeleeAttackHook/4+2]=0xE80B8900
    call WMem(pReservedMemoryForMeleeAttackHook+5,DataArray1Address+260)// source address
    set Memory[pReservedMemoryForMeleeAttackHook/4+3]=(GameDLL+0x2DCC40)-(pReservedMemoryForMeleeAttackHook+​12)-4
    set Memory[pReservedMemoryForMeleeAttackHook/4+4]=0x000000BB
    set Memory[pReservedMemoryForMeleeAttackHook/4+5]=0x61038900
    call WMem(pReservedMemoryForMeleeAttackHook+17,pGlobalUnitArrayForDataPassing+12)// source l__udg_GlobalUnitArrayForDataPassing[3]
    set Memory[pReservedMemoryForMeleeAttackHook/4+6]=0x6C798160
    set Memory[pReservedMemoryForMeleeAttackHook/4+7]=0xFFFFFFFF
    set Memory[pReservedMemoryForMeleeAttackHook/4+8]=0xC1833a74
    set Memory[pReservedMemoryForMeleeAttackHook/4+9]=0x0000E86C
    set Memory[pReservedMemoryForMeleeAttackHook/4+10]=0xC88B0000
    call WMem(pReservedMemoryForMeleeAttackHook+38,(GameDLL+0x4786B0)-(pReservedMemoryForMeleeAttackHook+38)-​4)
    set Memory[pReservedMemoryForMeleeAttackHook/4+11]=0x000000B8
    set Memory[pReservedMemoryForMeleeAttackHook/4+12]=0x8B088900
    call WMem(pReservedMemoryForMeleeAttackHook+45,DataArray1Address+264)//66 target address
    set Memory[pReservedMemoryForMeleeAttackHook/4+13]=0x1C5B8B19
    set Memory[pReservedMemoryForMeleeAttackHook/4+14]=0x00BBD3FF
    set Memory[pReservedMemoryForMeleeAttackHook/4+15]=0x89000000
    call WMem(pReservedMemoryForMeleeAttackHook+59,DataArray1Address+268)//67 target type
    set Memory[pReservedMemoryForMeleeAttackHook/4+16]=0x00E89003
    set Memory[pReservedMemoryForMeleeAttackHook/4+17]=0xBB000000
    call WMem(pReservedMemoryForMeleeAttackHook+67,(GameDLL+0x2DCC40)-(pReservedMemoryForMeleeAttackHook+67)-​4)
    set Memory[pReservedMemoryForMeleeAttackHook/4+18]=pGlobalUnitArrayForDataPassing+16//4 target handle
    set Memory[pReservedMemoryForMeleeAttackHook/4+19]=0x00BB0389
    set Memory[pReservedMemoryForMeleeAttackHook/4+20]=0xC7000000
    call WMem(pReservedMemoryForMeleeAttackHook+79,DataArray1Address+272)//68 result
    set Memory[pReservedMemoryForMeleeAttackHook/4+21]=0x00000103
    set Memory[pReservedMemoryForMeleeAttackHook/4+22]=0x0BEB9000
    set Memory[pReservedMemoryForMeleeAttackHook/4+23]=0x000000BB
    set Memory[pReservedMemoryForMeleeAttackHook/4+24]=0x0003C700
    call WMem(pReservedMemoryForMeleeAttackHook+93,DataArray1Address+272)//68 result
    set Memory[pReservedMemoryForMeleeAttackHook/4+25]=0x61000000
    set Memory[pReservedMemoryForMeleeAttackHook/4+26]=0x90909060
    set Memory[pReservedMemoryForMeleeAttackHook/4+27]=0x00000068
    set Memory[pReservedMemoryForMeleeAttackHook/4+28]=0x0000B800
    call WMem(pReservedMemoryForMeleeAttackHook+27*4+1,pTriggerHandle)
    set Memory[pReservedMemoryForMeleeAttackHook/4+29]=0xD0FF0000
    call WMem(pReservedMemoryForMeleeAttackHook+28*4+2,pTriggerExecute)
    set Memory[pReservedMemoryForMeleeAttackHook/4+30]=0x6104C483
    set Memory[pReservedMemoryForMeleeAttackHook/4+31]=0x8B575651
    set Memory[pReservedMemoryForMeleeAttackHook/4+32]=0xB8BE8BF1
    set Memory[pReservedMemoryForMeleeAttackHook/4+33]=0x8B000002
    set Memory[pReservedMemoryForMeleeAttackHook/4+34]=0x00ACBE84
    set Memory[pReservedMemoryForMeleeAttackHook/4+35]=0x84030000
    set Memory[pReservedMemoryForMeleeAttackHook/4+36]=0x0000A0BE
    set Memory[pReservedMemoryForMeleeAttackHook/4+37]=0x8C860300
    set Memory[pReservedMemoryForMeleeAttackHook/4+38]=0x8B000000
   
    set Memory[pReservedMemoryForMeleeAttackHook/4+39]=0x00008C8E
    set Memory[pReservedMemoryForMeleeAttackHook/4+40]=0x988E8900
    set Memory[pReservedMemoryForMeleeAttackHook/4+41]=0xC7000000
   
    set Memory[pReservedMemoryForMeleeAttackHook/4+42]=0x00008C86
    set Memory[pReservedMemoryForMeleeAttackHook/4+43]=0x00000000
    set Memory[pReservedMemoryForMeleeAttackHook/4+44]=0xBE8C8B00
    set Memory[pReservedMemoryForMeleeAttackHook/4+45]=0x00000094
    set Memory[pReservedMemoryForMeleeAttackHook/4+46]=0x88BE948B
    set Memory[pReservedMemoryForMeleeAttackHook/4+47]=0xE9000000
    set Memory[pReservedMemoryForMeleeAttackHook/4+48]=GameDLL + 0xC697E - (pReservedMemoryForMeleeAttackHook/4+48)*4 - 4
   
    set Memory[pMeleeAttackCatcher/4]=0xE9E9E9E9
    set Memory[pMeleeAttackCatcher/4+1]=0x90909090
   
    call WMem(pMeleeAttackCatcher + 1, pReservedMemoryForMeleeAttackHook - pMeleeAttackCatcher - 5 )
   
    call ChangeOffsetProtection(pMeleeAttackCatcher,8,oldprotection)
   
   
//  pushad
//mov ecx,[ecx+30]
//mov ebx,13455E1C
//mov [ebx],ecx
//call Game.dll+2DCC40
//mov ebx,1824008C
//mov [ebx],eax
//popad
//pushad
//cmp [ecx+6C],FFFFFFFF
//je 177F8918
//add ecx,6C
//call Game.dll+4786B0
//mov ecx,eax
//mov eax,13455E20
//mov [eax],ecx
//mov ebx,[ecx]
//mov ebx,[ebx+1C]
//call ebx
//mov ebx,13455E24
//mov [ebx],eax
//nop
//call Game.dll+2DCC40
//mov ebx,18240090
//mov [ebx],eax
//mov ebx,13455E28
//mov [ebx],00000001
//nop
//jmp 177F8923
//mov ebx,13455E28
//mov [ebx],00000000
//popad
//pushad
//nop
//nop
//nop
//push 00101D61
//mov eax,Game.dll+3C3F40
//call eax
//add esp,04
//popad
//push ecx
//push esi
//push edi
//mov esi,ecx
//mov edi,[esi+000002B8]
//mov eax,[esi+edi*4+000000AC]
//add eax,[esi+edi*4+000000A0]
//add eax,[esi+000000B0]
 
//mov ecx,[esi+b0]
//mov [esi+bc],ecx
//mov [esi+b0],0
//
//mov ecx,[esi+edi*4+00000094]
//mov edx,[esi+edi*4+00000088]
//jmp Game.dll+C697E
 
endfunction
 
//mmehack init
function InitMMEhack takes nothing returns nothing
    call PresetSomeArray()
    set pReservedMemoryForMeleeAttackHook = pCallFastCallWith1Args + 3500//+200
    set pMeleeAttackCatcher=GameDLL+0xC6940
    set pGlobalUnitArrayForDataPassing=RMem( GetUnitArrayAddress()+0xC)
    set DataArray1Address = RMem(GetDataArrayAAddress( )+0xC)

    set OnAttack=CreateTrigger()
    call TriggerAddAction(OnAttack,function OnAttackDamageCalculationHook)
    call InitAttackDamageCalculationHook(GetHandleId(OnAttack))
endfunction


endlibrary