Перейти к содержанию

MasterGH

Ветераны
  • Постов

    2 999
  • Зарегистрирован

  • Победитель дней

    129

Весь контент MasterGH

  1. Это возможно, это совершенно точно. Но решения у меня нет, т.к. я этим читом не занимался. Могу дать только подсказки. Решение твой задачи может быть очень даже непростым делом. По поводу идеи, даже если ты найдёшь адрес некоторого ID (кстати непонятно какого так как их, скорее всего, может быть несколько у машины), то скорее это не прокатит, т.к. ты не разберёшься с рутиной дизассемблерного кода. 1. Способ. Насколько я помню, у игры есть читы чтобы получить ту или иную машину. Поэтому есть вариант проследить в отладке как это происходит. Здесь уже должен быть некоторый участок кода, который обрабатывает ввод от пользователя. Можно определить этот ввод в отладчике (как делать объяснять не буду, это долго) и выйти на нужный код, который создаёт машину. Главное добраться до этого кода, а там уже можно что-нибудь придумать. 2. Способ. Могу предположить с большой вероятностью, что создание того или иного объекта в этой игре зависит от данных - сценариев (некоторого формата в оперативной памяти подгружаемых при начале уровня) и кода обрабатывающий эти сценарии (некоторые сценарии должны постоянно обрабатываться на истинность тех или иных условий)... Если в некотором сценарии для уровня будет директива "создать такую-то тачку по таким-то координатам после того как произойдёт что-то", то код "создаст такую-то тачку". Понять весь этот процесс возможно будет довольно тяжело. У тебя должно быть как минимум два сложных пути создания спавна. Изменить сценарий в памяти или изменить машинный код обработки сценариев. Что будет сложнее это уже зависит от игры. Изменив сценарий это ещё не значит, что его часть поступит на обработку, поэтому сценарий надо менять определённым образом (я без понятия каким). Оба способа должны вывести на функцию принимающую аргументы создания того или иного объекта в игре по тем или иным параметрам. Эту функцию предположительно надо чётко выполнить и тачка должна появиться. Конечно, я не знаю как в этой игре всё на самом деле, но в своих предположениях я опирался на логику разработки игры. Если в игре что-то должно происходить, то это гораздо легче описывается сценариями и эти сценарии должны обрабатываться с вызовом функций.
  2. MasterGH

    Анти рaндoм

    Эту функцию можно использовать относительно игры для замены предполагаемых случайных величин постоянными. Не факт, что предполагаемые величины будут рандомными и не факт что будет работать функция Антирандома. Но можно попробовать включить эту функцию и если повезёт, то случайные значения будут постоянными.
  3. Ничего присоединять не надо )) Запустил CE. Открыл LUA-консоль вставил код выше и выполнил его. Запустил игру в моём случае "UT3.exe" Начал играть. Нажимаю F2 - увеличить скорость,F3 - уменьшить, F4 - сбросить до нормальной. Скрипт этот только пример. В настройках CE можно зайти и поставить свои хот-кеи на увеличение и уменьшение скорости, или на установку определённой скорости. Я совсем забыл про эти установки... Мне не надо было Lua скрипт писать оказывается... Ну пускай останется в качестве образовательных целей - написания кода на Lua.
  4. MasterGH

    Хак скорости игры

    Если Вам кажется что в игре какие-то действия происходят слишком медленно или слишком быстро, то почему бы не увеличить или не уменьшить скорость. Герой будет быстрее передвигаться, быстрее стрелять... или же этот процесс можно замедлить. А вдруг в игре Вы что-то долго ждёте: медленные разворачивающиеся события... В таких случаях можно использовать следующий скрипт на Lua. speed = 1.0 function IncSpeed(hotkey) speed = speed + 1 speedhack_setSpeed(speed) end function DecSpeed(hotkey) speed = speed - 1 speedhack_setSpeed(speed) end function ResetSpeed(hotkey) speed = 1.0 speedhack_setSpeed(1.0) end function SetHotKey(func, hotkey) local objectHotKey = createHotkey(func, hotkey) generichotkey_setKeys(objectHotKey, hotkey) generichotkey_onHotkey(objectHotKey, func) end function onOpenProcess(processid) SetHotKey(IncSpeed, VK_F2) SetHotKey(DecSpeed, VK_F3) SetHotKey(ResetSpeed, VK_F4) end local aalist = getAutoAttachList() stringlist_add(aalist, "UT3.exe") Измените горячие клавиши и имя процесса на свои данные. Константы горячих клавиш найдёте здесь. Если вам нужно задать комбинацию горячих клавиш таких как "CTRL+1", то посмотрите справку по createHotkey и generichotkey_setKeys. Горячие клавиши записываются через запятую в этих функциях...
  5. Я продолжаю писать код на LUA для генерации трейнеров. Мне понадобилось сохранение пользовательских параметров и восстановление их при следующем запуске Lua файлов CE. Естественно, я не хотел писать то, что возможно уже написано (ссылка) Для начала мини тутор: ini_table = {} ini_table["n"] = {} ini_table["n"]["n"] = {} ini_table["n"]["n"]["n"] = 10 for k,v in pairs(ini_table) do for k1,v1 in pairs(v) do for k2,v2 in pairs(v1) do print(k2,v2) end end end -- Вывод: -- n 10 Если не поняли, то обращаемся к докоментации LUA. Данный приём позволит вывести ключи и значения. Именно этот приём позволит прочитать значения ini - файла. Давайте попробуем создать файл some.ini по пути логического диска D. У вас может быть другой путь. [Section1] s1_KEY=Value [sect2] s1_KEY=Value s1_KEY=Value2 В консоли LUA Engine попытаемся вывести значения из файла.
  6. Цель видео показать как работать с программой по нахождению функций отвечающих за то или иное действие. В другой игре может и не быть адреса от значения которого что-то зависит. Это значение может быть в регистре возвращаемой функции... Может быть какое-то мимолётное время в стеке и поймать значение в стеке сканером памяти будет невозможно. Потом для обмана игры все средства должны быть "на вооружении". С помощью Function Hacker можно случайно сделать читы о которых даже и не подумаешь. "Function Hacker" может помочь отсеивать функции которые нужно исследовать. И если повезёт, то ты быстро найдёшь ключевые моменты в дизассемблере от которых зависит тот или иной вызов функции. Ты сможешь определить то или иное условие...
  7. SetTimer - установить таймер. Находится в User32.dll KillTimer - уничтожить таймер. Находится в User32.dll TimerProc - объявление вызываемой функции в таймере Подробнее:
  8. Нопить надо что-то другое, а не что-то в скрипте. Самый простой способ тормознуть таймер это писать постоянно значение в адрес секунд. Вижу множество способов. Один из них следующий. 1) В коде игры найти инструкцию которая работает со всеми патронами для всего оружия. 2) Создаёшь первый АА скрипт (активирующий). Сделать инъекцию в инструкцию на сохранение текущего адреса патронов. А также дописываешь код записи по этому адресу для потока. 3) Создаёшь второй АА скрипт после активации первого (иначе будет ошибка) в котором под [ENABLE] записывается выполнение потока. 4) Потом устанавливаешь хоткеии. Один хот-кей на активирующий скрипт. Его нужно активировать один раз в начале игры. Другой хот-кей на второй АА скрипт. Активирующий: [ENABLE] alloc(newmem,2048) label(returnhere) label(originalcode) label(exit) label(pAmmo) label(threadmem) registersymbol(threadmem) newmem: push eax lea eax,[esi+79] mov [pAmmo],eax pop eax originalcode: mov al,[esi+79] test al,al exit: jmp returnhere threadmem: mov eax, [pAmmo] mov [eax],#99 ret pAmmo: dd 0 005A5A04: jmp newmem returnhere: [DISABLE] 005A5A04: mov al,[esi+79] test al,al //Alt: db 8A 46 79 84 C0 dealloc(newmem) Второй скрипт: [ENABLE] createthread(threadmem) [DIASBLE] Может быть я где-то ошибся, так что надо проверять.
  9. Разработки будущего В этом конкретном примере рассмотрю формирование трейнера для игры Dark Sector. 45 строк против 175 строк, а самое главное более понятнее. АА скрипты для Dark Sector я плохо написал. А вот на LUA гораздо лучше на мой взгляд. Если читов будет гораздо больше, то эффект будет ещё сильнее.
  10. Новая версия модуля TrainerGen.lua: TrainerGen.rar Позволяет формировать трейнер вида: По примеру разметки формата .CETRAINER: <?xml version="1.0"?> <CheatTable CheatEngineTableVersion="11"> <CheatEntries/> <UserdefinedSymbols/> <LuaScript> require("TrainerGen") function Initialize() bufScript = BeginGenerateAA("allocMem", "2048") bufScript = GenerateAAWithSignature(bufScript, "InfHealth1", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true) bufScript = GenerateAAWithSignature(bufScript, "InfHealth2", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true) bufScript = GenerateAAWithSignature(bufScript, "InfHealth3", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true) bufScript = GenerateAAWithSignature(bufScript, "InfHealth4", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true) bufScript = GenerateAAWithSignature(bufScript, "InfHealth5", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true) bufScript = GenerateAAWithSignature(bufScript, "InfHealth6", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true) bufScript = GenerateAAWithSignature(bufScript, "InfHealth7", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true) bufScript = GenerateAAWithSignature(bufScript, "InfHealth8", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true) bufScript = GenerateAAWithSignature(bufScript, "InfHealth9", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true) EndGenerateAA(bufScript) end TrainerShow("F.E.A.R.XP Ttainer +9, v1.0, {MasterGH}", "FEARXP.exe", 290, 180, Initialize)</LuaScript> </CheatTable> Основные пользовательские функции: 1) TrainerShow(nameTrainer, processName, frmWidth, frmHeigth, initFunction) 2) BeginGenerateAA(newMemDescription, sizeMem) -----GenerateAA(aggregateMem, cheatName, address, newCode, stateOriginalCode) -----GenerateAAWithSignature(aggregateMem, cheatName, signature, typeMem, signatureOffset, newCode, stateOriginalCode ) -----AddRegistersymbols(aggregateMem, tableNewSymbols) EndGenerateAA(aggregateMem) 3) FillnopsInstruction_AndAddInCETable(cheatName, address) FillnopsInstructionWithSignature_AndAddInCETable(cheatName, signature, typeMem, signatreOffset) 4) GroupAA(nameGRcheat, tableCheats) 5) Функция для быстрых тестов из консоли LUA: GenerateAAscriptPageMem_AndAddInCETable( cheatName, address, injectInstruction, originalcode ) ----- Как пользоваться этими функциями пока описывать не буду,т.к. могут быть новые изменения и придётся описания переделывать...
  11. M4K, надо хакать ромы. Ромы надо хакать Ты тратишь своё время. Сделал внутри рома читы и это на век, и больше не паришься насчёт новых эмуляторов.
  12. Все языки программирования, которые работают с API Windows могут помочь создать такой же трейнер и даже лучше. А каким образом и что "обозначить" ты узнаешь, если долго и упорно прочитаешь материалы по языку программирования под Windows. Надеюсь я ответил на твой вопрос.
  13. Вот пример Исполняемый файл игры должен быть назван как FEARXP.exe игра (F.E.A.R. Extra Point). Если он так не назван, то назвать. AAgen.lua поместить в директорию с Cheat Engine 6.1 Сначала запустить и начать игру. Затем свернуть игру и дважды кликнуть по F.E.A.R. trainer.CETRAINER Код трейнера: require("AAgen") function Initialize() bufScript = BeginGenerateAAscriptAggregateMem("allocMem", "2048") bufScript = GenerateAAscriptAggregateMemWithSignature(bufScript, "InfHealth", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X+C-W", 0, "mov [ebx+00000758],(float)100",true) bufScript = EndGenerateAAscriptAggregateMem(bufScript) autoAssemble(bufScript) end AAgenINIT("F.E.A.R.XP Ttainer +1, v1.0, {MasterGH}", " FEARXP.exe ", Initialize) У Xipho в статье в игре структура героя другая. У него надо mov [ebx+000006E0],(float)100. Сигнатура у меня и у него одинаковая. Когда модуль AAgen.lua будет усовершенствован - новые функции генерации АА-скрипта по дизассемблерному коду, то даже этот трейнер будет работать. Надо будет только аттач к процессу игры делать не по имени исполняемого файла, а по сигнатурам или иным характеристикам. AAgen.rar F.E.A.R. trainer.rar
  14. Вообще я без понятия. Судя по коду он нашёл фильтр "cmp byte ptr [ecx],a0" просматривая структуры памяти в Cheat Engine. Если не знаешь как это делается, то вот пример из другого случая.
  15. Примеры скриптов с возможными ошибками пользователей. 1. Случай. Создание прыжка и разрушение памяти написаны не там где надо, что может привести к вылету из игры с ошибкой при активации по хот-кеям. И не совсем оптимизированный скрипт. Скорее всего, правильнее написать так (без учёта сохранения/восстановления регистра флагов): alloc(newmem,256) label(code) newmem: cmp byte [ecx],a0 jne code fld dword [ecx+1a] ret code: fld dword [ecx+16] ret 019FAB50: jmp newmem [DISABLE] 019FAB50: fld dword ptr [ecx+16] ret int 3 dealloc(newmem)[ENABLE] С восстановлением флагов было бы так: alloc(newmem,256) label(code) newmem: pushfd cmp byte [ecx],a0 jne code fld dword [ecx+1a] popfd ret code: fld dword [ecx+16] popfd ret 019FAB50: jmp newmem [DISABLE] 019FAB50: fld dword ptr [ecx+16] ret int 3 dealloc(newmem)[ENABLE] Напоминаю, что сохранять и восстанавливать флаги нужно в тех случаях, когда после вашей инъекцией кода и идёт код использующий регистр флагов. Чаще всего это инструкции инструкции cmp и test. Если будут таки команды, то возможно будет вылет из игры.
  16. Скорее всего, правильнее написать так (без учёта сохранения/восстановления регистра флагов): [ENABLE] alloc(newmem,256) label(code) newmem: cmp byte [ecx],a0 jne code fld dword [ecx+1a] ret code: fld dword [ecx+16] ret 019FAB50: jmp newmem [DISABLE] 019FAB50: fld dword ptr [ecx+16] ret int 3 dealloc(newmem)
  17. Библиотека ещё не доведена до ума, но кое-что она умеет делать. Для того чтобы создалось это окно и читы работали по горячим клавишам со звуковым сообщением надо написать код LUA в главной таблице CE (это всего лишь пример): require("TrainerGen") function Initialize() AddCheatInCETableFillnopsInstructionWithSignature("NoRecoilHand", "e8xxxxxxxx8bxxxxxx83xxxx33xx80xxxxxx75xx8bxxxxxxf7", 0) bufScript = BeginGenerateAAscriptAggregateMem("allocMem", "2048") bufScript = GenerateAAscriptAggregateMemWithSignature(bufScript, "NoRecoilWalk", "d9xxd9xxxxd9xxxxd9xxxxxxxxxxdexxdfxxf6xxxx75xxd9xxxxxxxxxxd9", 8, "fstp st\n fldz", true ) bufScript = GenerateAAscriptAggregateMemWithSignature(bufScript, "NoRecoilShot", "d9xxxxxxxxxx75xxd9xxxxxxxxxxd8xxxxxxd8xxdfxxf6xxxx7axxd9", 0, "fstp st\n fldz", true ) bufScript = GenerateAAscriptAggregateMemWithSignature(bufScript, "NoReload", "83xxxxxxxxxxxxxx74xxf6xxxxxx74xx83xxxx89xxxxxxxxxx39xxxx7dxxf7", 0, "mov [ebp+eax*4+00000334],#100", true ) bufScript = EndGenerateAAscriptAggregateMem(bufScript) autoAssemble(bufScript) GroupAA("Complex better weapons", {"NoRecoilHand", "NoRecoilWalk", "NoRecoilShot", "NoReload"} ) end AAgenINIT("CoD4 Ttainer +1, v1.0, {MasterGH}", "iw3sp.exe", Initialize) Далее сохранить этот код примера как .CETRAINER. Запустить двойным кликом. Форма CE показываться не будет. Запустить игру и дождаться когда трейнер будет готов к работе. Активировать чит нажатием горячих клавиш для группы "Complex better weapons" Код TrainerGen.lua (который надо поместить в папку с трейнерами типа .CETRAINER или файлами типа .CT; в коде есть мусор в комментариях, если мешает, то убрать самостоятельно)
  18. Не совсем правильное суждение. Когда ты просто идёшь изменяя Z, то работает один или несколько участков кода. Когда ты прыгаешь работает другой один или несколько участков кода. Конечно, участки кода прыжка и перемещения по координатным плоскостям где-то друг с другом сцепляются и могут работать "в общей логике" перемещения. Но все равно есть участки кода работающие отдельно в той или иной ситуации с теми или иными адресами данных о перемещении. Поэтому очевидно, что для создания супер прыжка именно для твоего героя, надо искать массу твоего героя. Если у всех героев масса одна, то делать фильтр... Если хочешь чтобы все прыгали, то нужно исправить массу всех или же исправить силу гравитации...
  19. Сначала поищи и прочитай информацию на форуме и таких вопросов возникать не будет.
  20. Количество прерываний на инструкции работающей с адресом (на этот адрес изначально поставили брейкпоинт)
  21. У AOBScan могут быть параметры сканирования (ищите описание). Пример функции возвращающей первый найденный адрес сигнатуры в типе областей памяти с защитой "выполнение кода". function ByteScan(signature) -- return address local results = AOBScan(signature, "+X-C-W") if (results == nil) then messageDialog("Ошибка. Не найден адрес внедрения.\n\rТрейнер будет закрыт!",1, 2) closeCE() return end local address = stringlist_getString(results, 0) return address end Важно отметить, что можно работать с несколькими возвращаемыми адресами, а не только с первым как это было в автоассемблере.
  22. В справке CE 6.0 в разделе Script engine есть такая функция: Её задача перехватить выполнение кода, сделать всё необходимое, например, сделать чит-код; сохранить параметры в файлы и т.п. ... и в конце-концов вернуть выполнения кода в прежнее русло. Данный метод работает эффективнее отладки. Т.к. отладка затрачивает больше ресурсов работы процессора чем способ generateAPIHookScript. Этой функцией можно воспользоваться следующим образом (пример Дакрк Байта):
  23. Результат, которого мы должны добиться в LUA консоли Cheat Engine следующий: 1) 0x003f00b8: 08 00 00 00 2) 0x003f00bc: 00 00 00 00 3) 0x003f00c0: 00 00 00 00 4) 0x003f00c4: 00 00 00 00 ... (вырезано) 247) 0x003f0490: 00 00 00 00 248) 0x003f0494: 00 00 00 00 249) 0x003f0498: 00 00 00 00 250) 0x003f049c: 00 00 00 00 Сделать это можно так (leftaddr замените на свой адрес): function onclickBtn(sender) leftaddr = 0x3f00b8 rigthaddr = leftaddr+1000 count =1 repeat x1,x2,x3,x4 = readBytes(leftaddr,4) s = string.format("%3d) 0x%08x: %02x %02x %02x %02x",count,leftaddr,x1,x2,x3,x4 ) print(s) leftaddr= leftaddr + 4 count = count +1 until(leftaddr >=rigthaddr) end frm = createForm() control_setCaption(frm, "Вывод дампа памяти") form_centerScreen(frm) control_setSize(frm, 270,70) btn=createButton(frm) control_setCaption(btn, "Вывести дамп") control_setPosition(btn,20,10) control_setSize(btn, 230,50) control_onclick(btn, onclickbtn) В этом примере создали форму с кнопкой. При нажатии кнопки в консоли выводится информация.
  24. Требования и информация: 1) Текущая версия Lua-поддержки для Cheat Engine 6.1 и выше, поэтому если у вас нет версии 6.1, то установите с официального сайта Cheat Engine 2) Для просмотра и редактирования Luaкода установите: Notepad++ (найдёте в поисковике) 3) Все поддерживаемые Lua функции, а так же их краткая документация в комментариях находятся в файле "main.lua". Этот файл находится в каталоге с программой Cheat Engine. В справке CE те же описания функций Lua для CE. 4) "main.lua" загружается и выполняется автоматически при запуске CE. Вы можете редактировать этот файл для загрузки ваших собственных модулей Lua. 5) "defines.lua" содержит описания определений тех или иных констант 6) Новые комментарии к Lua функциям вы можете при случае увидеть здесь в SDK а здесь описания 7) Если так случится, что вы не знаете как работает Lua функция, то ответ можно найти в SDK начав свой путь поиска проблемы с этой страницы. Справочное руководство как писать программы на Lua пока ищите в Интернете. Напоминаю, что если очень нужно, то последнюю версию CE вы можете скомпилировать из SDK с официального сайта. На нашем форуме есть руководство как это сделать. Ниже будет располагается информация из того же main.lua, который у вас уже есть только в лучшем виде для понимания. (пока заниматься этим некогда, тема В РАЗРАБОТКЕ)
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.