Разработка и ромхакинг > Ромхакинг и программирование
[ALL] CHEATS & MODS
<< < (175/197) > >>
krocki:
Здесь будут выкладываться чит-коды, моды и прочее что сними связано...
dedok179:
 Все трейнеры для PS1 и в будущем не только, теперь базируются здесь. Там же прямые ссылки на образы игр.
Manvel738:
Сделайте пожалуйста Haunting starring Polterguy с бессмертием ! :neznayu: :neznayu:

вот читы

 Master Code by Tony Hedstrom
Game Genie
RH2B-86T2
 Always have all spells, and infinite use of them by Tony Hedstrom
Game Genie
9V9A-DCC6
579A-CAC8
B39A-C9MA
 Have all spells (Only tested on Gens) by Tony Hedstrom
Raw
FFAF0E:DF
 Have infinite use of all spells, even if they're greyed out by Tony Hedstrom
Game Genie
RG2T-A61W
 Infinite Ecto by Tony Hedstrom
Game Genie
SD3A-AND6
EM3A-A9NA
 Infinite Energy by VisitntX
Game Genie
AM2A-AA9W
 Infinite Energy Bar/Time by Rune
Raw
FFAF24:0045
 Infinite Plasma by VisitntX
Game Genie
9V9A-DCL6
KK9A-CAC8
EV9A-C9MA
 Infinite Plasma by VisitntX
Raw
FFAF24:004A
 Infinite Plasma In One Code by Fanat
Game Genie
 AM1A-AA4J
 Spells (letters) stay longer before they disappear (5 seconds instead of 2 seconds) by Tony Hedstrom
Game Genie
BECA-7732
 Start a new game with all 5 spells by Tony Hedstrom
Game Genie
MF6A-AABT
tolik5_90:
 Привет!На NES Castlevania III - Dracula's Curse при наборе пороля в OPENING набираешь AKAMA открывается второй круг,а вот в Akumajo Densetsu японской версии пороль не работает.Подскажите какой там пороль,или сделайте если сможете чтобы со старта начинать с второго круга.
Rafael78:
Взломайте пожалуйста Darkman.nes на неуязвимость
Sharpnull:
Rafael78, чем не устраивают эти читы https://gamehacking.org/game/29321?
Annatar:
А кто-нибудь ломал Castlevania Lecarde Chronicles?
Я попытался в ней артманями хит пойнты поискать и заблокировать, и что-то вообще никак не получилось.
Sharpnull:
Annatar, Castlevania: The Lecarde Chronicles (скачать) на движке от Clickteam, судя по DLL и дате выхода игры (2013 год) это версия Multimedia Fusion 2 (MMF2). После запуска игры, основные файлы движка будут распакованы в %temp% (stdrt.exe, mmf2d3d9.dll и т. п.), ресурсы будут грузиться из ctlc data d.exe. Патчить файлы движка, полагаю, будет непросто. С помощью Cheat Engine я нахожу здоровье, которое равно 80 (0x50), там всегда 4 адреса с этим значением, 3 из которых зависимы, но адреса после смены уровня или смерти меняются, так что придётся каждый раз искать.
Есть способ автоматизации для одичалых: после запуска игры значения после адреса жизни не меняются. После запуска игры находим адрес здоровья, подставляясь под врага, из 4 найденных адресов меняем каждый, пока не найдём тот, от которого зависят другие. В Memory View после нашего адреса жизни копируем 79 байт. В Memory View открываем Tools > Lua Engine. Вводим скрипт, который сделал на основе первого попавшегося результата:

--- Код: ---aobresult = AOBScan("СЮДА 79 БАЙТОВ")
if (aobresult ~= nil) then
  print("Results found: "..aobresult.Count)
  local addressList = getAddressList()
  if aobresult.Count>0 then
    print("First result="..aobresult[0])
    local hp1 = addressList.getMemoryRecordByDescription('HP1')
    if hp1 == nil then
      hp1 = addressList.createMemoryRecord()
      hp1.setDescription("HP1")
    end
    hp1.setAddress(string.format("%x", tonumber(aobresult[0], 16) - 1))
    hp1.Active = true
    hp1.Value = "80"
  end

  if aobresult.Count>1 then
    print("Second result="..aobresult[1])
    local hp2 = addressList.getMemoryRecordByDescription('HP2')
    if hp2 == nil then
      hp2 = addressList.createMemoryRecord()
      hp2.setDescription("HP2")
    end
    hp2.setAddress(string.format("%x", tonumber(aobresult[1], 16) - 1))
    hp2.Active = true
    hp2.Value = "80"
  end

  if aobresult.Count>2 then
    print("Third result="..aobresult[2])
    local hp3 = addressList.getMemoryRecordByDescription('HP3')
    if hp3 == nil then
      hp3 = addressList.createMemoryRecord()
      hp3.setDescription("HP3")
    end
    hp3.setAddress(string.format("%x", tonumber(aobresult[2], 16) - 1))
    hp3.Active = true
    hp3.Value = "80"
  end

  aobresult.destroy()
  aobresult = nil
else
  print("No results found")
end
--- Конец кода ---
Вместо СЮДА 79 БАЙТОВ вставляем байты как видим в хекс-редакторе (00 AB FF ...), если нажали Ctrl+C в Memory View, то всё будет правильно. Теперь после каждой смены уровня, нажимаем Execute в окне Lua Engine, будут находиться от 1 до 3 адресов и добавляться в окно адресов HP1, HP2, HP3. Проблема в том, что после смены уровня CE будет перезаписывать какие-то байты, поэтому нужно улучшить скрипт, чтобы он перед изменением значения, когда оно уменьшается, проверял байты для поиска и искал заново, тогда можно будет находить жизнь только после первого запуска игры. Но я не разбираюсь в CE, так что может кто вам подскажет, как это сделать лучше.
--------
Оказалось хуже, через 16 байт от жизни идёт лимит жизни, а ещё через 16 байт текущая мана (зелёная шкала), и после через 16 байт лимит маны. Ману не использовал, поэтому она не изменялась. Поэтому нужно искать без учёта маны, а если лимиты жизни/маны меняются, то и это учитывать.
--------
Сразу не догадался, вы можете просто повысить лимит. Находите жизнь, как описывал выше, через 16 байт будет 0x50, меняете на байты FF FF FF (это 16777215 HP), жизнь тоже до FF FF FF. Позже после смерти будет снова FF FF FF.
krocki:

--- Цитата: Annatar от 16 Январь 2021, 00:44:09 ---А кто-нибудь ломал Castlevania Lecarde Chronicles?
Я попытался в ней артманями хит пойнты поискать и заблокировать, и что-то вообще никак не получилось.

--- Конец цитаты ---

--- Код: (Скрипт для CheatEngine) ---[ENABLE]
alloc(newmem,32)
label(returnhere)

newmem:
cmp byte ptr [eax+18],50
je returnhere
mov ecx,[esp+18]
mov [eax+08],ecx
jmp returnhere

stdrt.exe+11AD2:
jmp newmem
nop 2
returnhere:

[DISABLE]
dealloc(newmem)
stdrt.exe+11AD2:
mov ecx,[esp+18]
mov [eax+08],ecx
--- Конец кода ---
Annatar:

--- Цитата: Sharpnull от 16 Январь 2021, 05:09:11 ---Annatar, Castlevania: The Lecarde Chronicles (скачать) на движке от Clickteam, судя по DLL и дате выхода игры (2013 год) это версия Multimedia Fusion 2 (MMF2). После запуска игры, основные файлы движка будут распакованы в %temp% (stdrt.exe, mmf2d3d9.dll и т. п.), ресурсы будут грузиться из ctlc data d.exe. Патчить файлы движка, полагаю, будет непросто. С помощью Cheat Engine я нахожу здоровье, которое равно 80 (0x50), там всегда 4 адреса с этим значением, 3 из которых зависимы, но адреса после смены уровня или смерти меняются, так что придётся каждый раз искать.
Есть способ автоматизации для одичалых: после запуска игры значения после адреса жизни не меняются. После запуска игры находим адрес здоровья, подставляясь под врага, из 4 найденных адресов меняем каждый, пока не найдём тот, от которого зависят другие. В Memory View после нашего адреса жизни копируем 79 байт. В Memory View открываем Tools > Lua Engine. Вводим скрипт, который сделал на основе первого попавшегося результата:

--- Код: ---aobresult = AOBScan("СЮДА 79 БАЙТОВ")
if (aobresult ~= nil) then
  print("Results found: "..aobresult.Count)
  local addressList = getAddressList()
  if aobresult.Count>0 then
    print("First result="..aobresult[0])
    local hp1 = addressList.getMemoryRecordByDescription('HP1')
    if hp1 == nil then
      hp1 = addressList.createMemoryRecord()
      hp1.setDescription("HP1")
    end
    hp1.setAddress(string.format("%x", tonumber(aobresult[0], 16) - 1))
    hp1.Active = true
    hp1.Value = "80"
  end

  if aobresult.Count>1 then
    print("Second result="..aobresult[1])
    local hp2 = addressList.getMemoryRecordByDescription('HP2')
    if hp2 == nil then
      hp2 = addressList.createMemoryRecord()
      hp2.setDescription("HP2")
    end
    hp2.setAddress(string.format("%x", tonumber(aobresult[1], 16) - 1))
    hp2.Active = true
    hp2.Value = "80"
  end

  if aobresult.Count>2 then
    print("Third result="..aobresult[2])
    local hp3 = addressList.getMemoryRecordByDescription('HP3')
    if hp3 == nil then
      hp3 = addressList.createMemoryRecord()
      hp3.setDescription("HP3")
    end
    hp3.setAddress(string.format("%x", tonumber(aobresult[2], 16) - 1))
    hp3.Active = true
    hp3.Value = "80"
  end

  aobresult.destroy()
  aobresult = nil
else
  print("No results found")
end
--- Конец кода ---
Вместо СЮДА 79 БАЙТОВ вставляем байты как видим в хекс-редакторе (00 AB FF ...), если нажали Ctrl+C в Memory View, то всё будет правильно. Теперь после каждой смены уровня, нажимаем Execute в окне Lua Engine, будут находиться от 1 до 3 адресов и добавляться в окно адресов HP1, HP2, HP3. Проблема в том, что после смены уровня CE будет перезаписывать какие-то байты, поэтому нужно улучшить скрипт, чтобы он перед изменением значения, когда оно уменьшается, проверял байты для поиска и искал заново, тогда можно будет находить жизнь только после первого запуска игры. Но я не разбираюсь в CE, так что может кто вам подскажет, как это сделать лучше.
--------
Оказалось хуже, через 16 байт от жизни идёт лимит жизни, а ещё через 16 байт текущая мана (зелёная шкала), и после через 16 байт лимит маны. Ману не использовал, поэтому она не изменялась. Поэтому нужно искать без учёта маны, а если лимиты жизни/маны меняются, то и это учитывать.
--------
Сразу не догадался, вы можете просто повысить лимит. Находите жизнь, как описывал выше, через 16 байт будет 0x50, меняете на байты FF FF FF (это 16777215 HP), жизнь тоже до FF FF FF. Позже после смерти будет снова FF FF FF.

--- Конец цитаты ---

В принципе, работает, больше спасибо, уже намного легче.  Ману и очки оружия можно ведь добавить из тех же 79 байтов, или для них нужно делать отдельный скрипт со своим поиском?  И хорошо бы ещё жизни тоже найти, что бы после двух падений в пропасть не начинать весь уровень с начала, а уж с чекпойта.


Добавлено позже:

--- Цитата: krocki от 16 Январь 2021, 20:20:43 ---
--- Код: (Скрипт для CheatEngine) ---[ENABLE]
alloc(newmem,32)
label(returnhere)

newmem:
cmp byte ptr [eax+18],50
je returnhere
mov ecx,[esp+18]
mov [eax+08],ecx
jmp returnhere

stdrt.exe+11AD2:
jmp newmem
nop 2
returnhere:

[DISABLE]
dealloc(newmem)
stdrt.exe+11AD2:
mov ecx,[esp+18]
mov [eax+08],ecx
--- Конец кода ---

--- Конец цитаты ---

А вот это, увы не работает.  пишет Script Error:[string "[ENABLE]..."]:1: unexpected symbol near '['
Sharpnull:

--- Цитата: Annatar от 18 Январь 2021, 06:33:33 ---Ману и очки оружия можно ведь добавить из тех же 79 байтов, или для них нужно делать отдельный скрипт со своим поиском?
--- Конец цитаты ---
Вы не поняли, в последнем абзацем вы должны были догадаться, что можно выставить 16 млн HP и после сохранения они останутся, вы не сможете столько потратить за игру скорее всего. Мой Lua-скрипт не нужен.
krocki, в cmp byte ptr [eax+18],50 проверяется байт с лимитом HP, который через 0x10 байт от жизни? Если я увеличиваю лимит HP, а он будет увеличен, если взять улучшение, судя по прохождению, то скрипт не работает.
krocki:

--- Цитата: Sharpnull от 18 Январь 2021, 18:00:20 ---krocki, в cmp byte ptr [eax+18],50 проверяется байт с лимитом HP, который через 0x10 байт от жизни? Если я увеличиваю лимит HP, а он будет увеличен, если взять улучшение, судя по прохождению, то скрипт не работает.
--- Конец цитаты ---
это тестовый скрипт на быструю руку, просто другой фильтр использовать нужно где значение всегда статичное...
главное что бы он понял как это делается... <_<
Annatar:

--- Цитата: krocki от 18 Январь 2021, 13:46:45 ---Annatar, Это обычный АА скрипт, не для LUA...интересно куда ты его питался вставить. :D

--- Конец цитаты ---
В LUA и пытался)


--- Цитата: Sharpnull от 18 Январь 2021, 18:00:20 ---Вы не поняли, в последнем абзацем вы должны были догадаться, что можно выставить 16 млн HP и после сохранения они останутся, вы не сможете столько потратить за игру скорее всего. Мой Lua-скрипт не нужен.

--- Конец цитаты ---
Я понял, но мне не нужно 16 млн хп, мне нужна именно заморозка нормальных значений, что бы спокойно дойти до боссов и подраться с ними уже без читов.


Добавлено позже:

--- Цитата: krocki от 18 Январь 2021, 18:04:54 ---это тестовый скрипт на быструю руку, просто другой фильтр использовать нужно где значение всегда статичное...
главное что бы он понял как это делается... <_<

--- Конец цитаты ---
Увы, не понимаю(
Annatar:
krocki, Опробовал скрипт - он идеален в смысле того, что после пропуска удара замораживается и период неуязвимости, что позволяет больше не волноваться о чёртовых медузах и летучих мышах, к которым у автора какая-то нездоровая любовь.
Всё-таки, что нужно сделать, что бы он продолжал работать после увеличения лимита хп и маны?? 
Sharpnull:

--- Цитата: Annatar от 20 Январь 2021, 02:28:42 ---Увы, не понимаю(
--- Конец цитаты ---
Код, который отнимает жизнь, используется не только для HP, поэтому скрипт от krocki блокирует изменение только значений в RAM, у которых через 16 байт вперёд от адреса установлено значение 0x50. Если не повезёт и у другого значения (не HP) через 16 байт тоже будет 0x50, то логика игры нарушится. Поэтому нужно найти статичный относительно HP байт или байты, которые будут на протяжении всей игры не меняться. Это сложно, потому что нужно точно знать за что эти байты отвечают и что не будет конфликта, иначе изменение в конце игры или какой-то настройки испортит работу.

--- Цитата: Annatar от 22 Январь 2021, 23:53:50 ---Всё-таки, что нужно сделать, что бы он продолжал работать после увеличения лимита хп и маны?? 
--- Конец цитаты ---
Из простых решений, написать несколько версий скрипта krocki для каждого лимита HP: изменить 50 на нужное 16-ричное значение в cmp byte ptr [eax+18],50. Причём для HP и MP придётся использовать разные версии одновременно (придётся видимо изменить и другой код), если полоски не совпадают, хотя я не проверял работу на MP, предполагаю, что вы проверили. Только опять же, может не повезти с ложным срабатыванием.
--------
UPD: Не знаю всех возможностей CE, но можно было бы написать скрипт на Lua по аналогии со скриптом от krocki (на ASM это сложнее), в котором будут проверяться все возможные варианты лимита HP и лимита MP, а также HP и MP в пределах лимита, что сведёт вероятность ложного срабатывания к минимуму и не придётся вручную переключать разные значения (просто вкл. и выкл.).
Annatar:
Кажется получилось,
когда лимит был 80 - значение было 50
Когда лимит стал 100 - значение 64.
И так далее, просто меняю число при получении апгрейда хп.
krocki:
Чё ещё не сделали, ладно вот тестируй... ;)

--- Код: (Castlevania: Lecarde Chronicles - Script for Cheat Engine...) ---[ENABLE]
alloc(script,256)
label(backjump)

script:
cmp byte ptr [ecx+98],01
jne @f
mov byte ptr [ecx+68],09 //Вечные жизни (REST=9)...
mov ecx,[ecx+08]
pop esi
mov [edx+08],ecx
jmp backjump

@@:
cmp byte ptr [ecx+88],01
jne @f
push ebx
mov ebx,[ecx+18]
mov [ecx+08],ebx  //Вечное здоровье...
pop ebx
mov ecx,[ecx+08]
pop esi
mov [edx+08],ecx
jmp backjump

@@:
cmp byte ptr [ecx+68],01
jne @f
push ebx
mov ebx,[ecx+18]
mov [ecx+08],ebx //Вечная мана...
pop ebx
mov ecx,[ecx+08]
pop esi
mov [edx+08],ecx
jmp backjump

@@:
mov ecx,[ecx+08]
pop esi
mov [edx+08],ecx
jmp backjump

stdrt.exe+1280F:
jmp script
nop 2
backjump:

[DISABLE]
dealloc(script)
stdrt.exe+1280F:
mov ecx,[ecx+08]
pop esi
mov [edx+08],ecx
--- Конец кода ---
Sharpnull:

--- Цитата: krocki от 23 Январь 2021, 05:17:12 ---Чё ещё не сделали, ладно вот тестируй...
--- Конец цитаты ---
:) Я сделал на LUA попроще, с проверкой на лимиты HP/MP.
Annatar, проверьте этот Lua скрипт тоже:

--- Код: ---function debugger_onBreakpoint()
  local hmpValues = {
    [ 80]=true,[100]=true,[120]=true,[140]=true,[160]=true,[180]=true
  }
  local hpAddr      = EAX + 0x08
  local hpLimitAddr = EAX + 0x18
  local mpAddr      = EAX + 0x28
  local mpLimitAddr = EAX + 0x38
  local hpValue      = readInteger(hpAddr)
  local hpLimitValue = readInteger(hpLimitAddr)
  local mpValue      = readInteger(mpAddr)
  local mpLimitValue = readInteger(mpLimitAddr)
  if hmpValues[hpLimitValue] and hmpValues[mpLimitValue]
     and hpValue <= hpLimitValue and mpValue <= mpLimitValue then
    ECX = hpLimitValue
    -- return 0 -- break
    -- return 1 -- continue without breaking
  end
  return 1
end

debug_setBreakpoint(getAddress("stdrt.exe+11AD6"))
--- Конец кода ---
Только на HP, возможные лимиты в hmpValues, предположил, что увеличение на 20 (десятичное число), если перебор/недобор, то можно убрать/добавить (одно значение это [xx]=true через запятую).
--------
Чтобы включить, нужно выполнить скрипт, а чтобы отключить в Memory Viewer перейти на stdrt.exe+11AD6 (Ctrl+G) и нажать Toggle Breakpoint (или отключить breakpoint другим способом). Я не знаю как добавить в таблицу читов.
--------
Судя по прохождению (сравнил шкалы здоровья) макс. HP/MP = 180. Поправил скрипт.
krocki:

--- Цитата: Sharpnull от 23 Январь 2021, 05:56:47 ---Я сделал на LUA попроще
--- Конец цитаты ---
Неее это много!!! :D Вот альтернативный вариант проще некуда... ^_^
Вечные HP+MP+REST...

--- Код: (Castlevania: Lecarde Chronicles - AA Script for Cheat Engine...) ---[ENABLE]
stdrt.exe+1280F:
db E9 F1 E9 03 00 90 90
stdrt.exe+51205:
db 80 B9 98 00 00 00 01 75 10 C6 41 68 09 FF 71 28
db 8F 41 18 FF 71 48 8F 41 38 8B 49 08 5E 89 4A 08 C3
[DISABLE]
stdrt.exe+1280F:
db 8B 49 08 5E 89 4A 08
--- Конец кода ---

P.S - Кстати все модули и exe упаковали через инструмент написанный на C++ 5.0...спрашивается нафига :neznayu:
Снизу добавил готовый трейнер... ;)
Annatar:
Все скрипты и трейнер потестил)
Всё работает, но безлимитную неуязвимость после удара включает только самый первый скрипт  krocki и lua скрипт Sharpnull
Так что буду ими пользоваться.
Огромное спасибо)
Sharpnull:

--- Цитата: Annatar от 23 Январь 2021, 16:17:09 ---Всё работает, но безлимитную неуязвимость после удара включает только самый первый скрипт  krocki и lua скрипт Sharpnull
--- Конец цитаты ---
Нет, у моего скрипта не работает неуязвимость после взятия первого улучшения HP (Hunting ground, почти самое начало где подвал), оно вообще работало по случайности и постоянное мерцание героя мне не нравится. Короткий скрипт krocki не проверял, а до этого у меня после взятия улучшения HP оно сбросилось до 80, трейнер работает нормально, хотя пришлось эмулировать нажатия Numpad.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии