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

MasterGH

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

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

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

    129

Сообщения, опубликованные MasterGH

  1. Например, автоматизировать по кнопке на форме.

     

    Не могу точно утверждать, что этот скрипт работает.

    Спойлер
    
    function findValueAndReplace(findValue, replaceWith)
      memscan = createMemScan()
      foundlist = createFoundList(memscan)
      protectionflags = "+W*X-C"
    
      -- firstScan(scanoption, vartype, roundingtype, input1, input2,
      --           startAddress, stopAddress, protectionflags,
      --           alignmenttype, "alignmentparam",
      --           isHexadecimalInput, isNotABinaryString, isunicodescan, iscasesensitive)
    
      --    scanOption: soUnknownValue, soExactValue, soValueBetween, soBiggerThan, soSmallerThan
      --    vartype: vtByte, vtWord, vtDword, vtQword, vtSingle, vtDouble, vtString,
      --             vtByteArray, vtGrouped, vtBinary, vtAll
      --    roundingtype: rtRounded, rtTruncated, rtExtremerounded
      --    alignmenttype: fsmNotAligned, fsmAligned, fsmLastDigits
      --    protectionflags: X W C   (+ to indicate that flag MUST be set, - MUST NOT, * whatever)
    
      memscan.firstScan(soExactValue, vtGrouped, rtTruncated, findValue, nil,
                   "0","7fffffff",protectionflags,
                   fsmAligned,"4",
                   false, false, false, false)
      memscan.waitTillDone()
      foundlist.initialize()
    
      for i=0,foundlist.Count-1 do
       fullAccess(  getAddress(foundlist.Address[i])  , 4)
       writeFloat(  foundlist.Address[i], replaceWith)
      end
    
      sleep(50)
      foundlist.destroy()
      sleep(50)
      memscan.destroy()
    
    end
    
    function doit()
      findValueAndReplace('BA:8 BS:128 OOO:U f:250000 f:1000000 f:36000000', 0)
    end
    
    myForm = createForm()
    myForm.OnClose = function () return caFree end
    myForm.height = 100
    myForm.width = 240
    myForm.caption = "Grouped scan"
    myForm.centerScreen()
    
    myButton = createButton(myForm)
    myButton.caption = "do it"
    myButton.height = 20
    myButton.width = 60
    myButton.top = 31
    myButton.left = 100
    myButton.onClick = doit

     

     

    Скрипт модифицировал с форума. Автор mgr.inz.Player

    • Понравилось 1
  2. 3 часа назад, GameHacker сказал:

    Я искал на float и нашел адрес который принадлежит на прыгучесть персонажа, я не мог с ним ничего делать, создал Aob скрипт сделал как видео От MasterGH и тоже ничего не получилось

     

    С данных документации по UI4 движку, на котором написана игра, скорее всего, нужно три адреса с целым числом или один адрес, а два других будут рядом

     

    Спойлер

    Public variable

    uint32 : 1

    bImpartBaseVelocityX

    If true, impart the base actor's X velocity when falling off it (which includes jumping)

    Public variable

    uint32 : 1

    bImpartBaseVelocityY

    If true, impart the base actor's Y velocity when falling off it (which includes jumping)

    Public variable

    uint32 : 1

    bImpartBaseVelocityZ

    If true, impart the base actor's Z velocity when falling off it (which includes jumping)

     

  3. 2 часа назад, budabum сказал:

    Хочу построить зависимость кто в какой последовательности вызывается и с какой частотой.

    Насколько я помню Ultimap это и показывает.

    Порядок инструкций показывает список при обновлении.

    Частоту вызовов? Ну примерно, конечно. Если кнопу обновить нажать несколько раз, и примерно увидеть. У кого счетчик как быстро меняется на глаз.

    Ultimap 2 не смотрел, он вроде побыстрее работает по описанию.

  4. 13 минут назад, ReWanet сказал:

    Или же есть какая-то разница в заполнение?

    Я могу тебе предложить узнать это. Я не знаю )

    Проверять надо, в том числе на синтаксис, на скорость выполнения и на мусор в памяти. Тогда можно найти лучший вариант или выбрать любой

    • Плюс 1
  5. 1 час назад, ReWanet сказал:

    Не очень понял эту конструкцию :(

     

    Сначала предварительно создается и заполняется таблица edit-ами. А потом с ними уже работаем :)

    Спойлер
    
    function CreateTable(form)
      tableEdits = {}
      for i=1,5 do
         tableEdits[i] = {}
         local edit = createEdit(UDF1)
         tableEdits[i].edit = edit
         tableEdits[i].lastText = edit.Text
         edit.Top = 20 + i * edit.Height + 2
         edit.Left = 10
      end
      return tableEdits
    end
    
    local cashTable = CreateTable(UDF1)
    cashTable[1].edit.Text = 'ReWanet'

     

    Спойлер

    image.png

     

     Забыл, еще форму создать либо кодом, либо через инспектор

    • Плюс 1
  6. Необходимо корректно выполнить вставку внешнего Lua кода. Это нужно для другой задачи с тестированием Lua кода из полей ввода. Потом я опубликую эту утилиту на форум

     

    Написал небольшой пример

    Спойлер
    
    text = [[
    local s = " 0045464A - FF 05 A4B54500        - inc [0045B5A4] { [000003EA] }"
    $code2
    ]]
    
    code2 =  [[local clearString = string.gsub(s, '%s','')
    return string.match(clearString, '^(.-)%-(.-)%-(.-)$')]]
    
    text = text:gsub('$code2', code2)
    
    print(text)
    --loadstring(text)()
    ----------------------------------

     

    Ошибка

    Error:[string "text = [[
    ..."]:9: invalid use of '%' in replacement string
    Script Error
    

     

    Что я знаю про эту ошибку. Что есть магические символы и перед ними нужно ставить другие символы. Я даже не буду приводить абракадабру, которую я написал. Скорее всего, я напишу просто свой "подставлятор" :) Ну вдруг кто знает ответ. Может быть он простой

  7. Тема CE Lua скриптов очень интересная. Жаль у меня мало свободного времени на эксперименты с таблицами на формах на  CE Lua.

     

    22 часа назад, Razi сказал:

    В визуальном плане в конструкторе форм получается все довольно неплохо. Выглядит нормально. Думал будет намного хуже.

     

    Есть еще вариант написать модуль dll на Лазаре с таблицей. Работать с модулем через Cheat Engine

    На Лазаре можно делать вот такие красивые таблички. Форму в модуль сохранить и работать с функциями модуля.

    Но проблема с оптимизацией таким способом может не решаться.

     

    22 часа назад, Razi сказал:

    Но есть одна проблема. Через час после включения трейнер жрет 700 мб памяти и загружает процессор до 50%. (И с каждой секундой поглощение памяти увеличивается на 3 мб). Может можно что-то сделать, как-то оптимизировать код? Код написан в версии CE 6.5, может в версии 6.7 такого уже нет? В общем посоветуйте, что можно сделать? Если конечно можно.

     

    1. Чистить кеш памяти. Я писал об этом в блоге.

    2. Избегать постоянной записи в edit, если этого не требуется. Например кешировать значение в edit-е в переменной Lua, если это значение отличается, то только тогда обращаться к edit.

    Т.е. не так

        local addr = addr + 0x84*6
        UDF1["CEEdit"..x].Text = readBytes(addr+(x-15*6))

    А например так

        local value = readBytes(addr+(x-15*6))
        if table_Cash[i].cash == value then
          table_Cash[i].cash = value
          table_Cash[i].edit.Text = value
        end

    И тут не используем конструкцию вида UDF1["CEEdit"..x], т.к. скорее всего это как раз увеличивает объемы мусора и нагрузку на его чистку. Т.е. сделать table_Cash = {} и запись разовую сделать по циклу для всех Edit-ов.

     

    Как оптимизировать Lua код? Сравнивать его выполнение по скорости и объему мусора. Сравнение по скорости я писал в блоге, а сравнить кеш мусора до и после можно добавить.

    print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024))

    Вообще, это конечно CE Lua — это такие заморочки.  Даже мне неловко предлагать эти решения. Проще на том же Лазаре таблицу сделать, да чтение памяти и запись. И exe скорее всего будет меньше по размеру и таблички красивее

    • Понравилось 1
    • Плюс 2
  8. 15 часов назад, Werston сказал:

    Ребят, объясните, как вы разбирается в этом ассемблере? Вот читаю книжку и пытаюсь потом эти задания перенести в реал.ситацию и вижу существенную разницу с тем, что написано в книге, и с тем что дает тебе отладчик. 

     

    Этап 1. Наблюдать за выполнением готового ассемблреного кода

    Вариант1. Берем игру. Ищем инструкцию на брейкпоинте и в пошаговой отладке смотрим инструкции. Лезем в описание инструкций

    Вариант2. Берем VS C++ на 30 дней беслатно. Пишем на C++ простые программки и смотрим отладочный код. Лезем в описание инструкций в пошаговой отладке..

     

    Этап 2. Делать ассемблерные вставки в OllyDbg или в Cheat Engine в игре или в своей программе.

    Этап 3. Открывать интеловские доки. Искать в них и по поисковику конкретные ответы на вопросы.

    Этап 4. Читать книжки. В большинстве случаев они составлены не как справочник, а как занимательная история программирования на ассеблере. Когда есть время, можно почитать или полистать.

     

    • Понравилось 1
    • Плюс 1
  9. 13 минут назад, Razi сказал:

    Имеется в виду, что таблица делается в Дельфи7 (или Lazarus) , а после ее можно перенести в конструктор Cheat Engine и работать с этой таблицей? Или делать все на Дельфи7 или Lazarus?

     

    Не знаю, не пробовал переносить из Лазаря в CE. Вообще я имел ввиду, что много уроков есть по рисованию на Дальфи и  Лазаре. Тогда на CE Lua можно понять какие функции вызывать :)

  10. 17 часов назад, Razi сказал:

    Может знаете как менять цвет элемента PageControl?

     

    Пожалуй, это сделать не просто. Скорее всего, через ассемблерные инструкции в процессе самого CE и создание потока, чтобы выполнить их. Можно дизассемблировать этот пример с Дельфи7 и посмотреть как API вызывается в отладочном коде и попытаться сделать тоже самое ассемблерными вставками. Можно поискать примеры на Лазаре, на нем написан последний CE. Можно поискать пример просто по WinAPI.

     

    Если очень нужен визуальный стиль, то всегда есть последний вариант, о котором я писал — рисовать свою таблицу через "Canvas Class", Brush, Pen, Font, line, lineTo, rect, fillRect, textOut... Все как в стандартном рисовании на Дельфи, или Лазаре. Можно будет сделать практически любую таблицу. У меня есть пример рисования в репозитории (искать строки с "Canvas")

  11. @SergBrNord, рекомендации

     

    1) что ожидается от скрипта? адрес рабочий (замораживается в памяти и работает)? Вообще никакой реакции, не вылетов? ;

    2) попробуй выложить полный скрипт. С адресом, нопами, если они есть;

    3) попробуй убедиться что инъекция проходит по нужном адресу;

    4) попробуй проверить выполнение кода в пошаговой отладке перед активацией Cheat Engine;

  12. Скрытый текст

    image.png

     

    Скорее всего, по трем адресам записать одно и то же значение.

    Для этого нужно сохранить оригинальный код как есть с прыжком в новую память .

     

    И прописать

    Скрытый текст
    
    "RomeTW-BI.exe"+1817CB: 8B 45 8C              -  mov eax,[ebp-74]
    "RomeTW-BI.exe"+1817CE: D9 80 C4 00 00 00     -  fld dword ptr [eax+000000C4]
    "RomeTW-BI.exe"+1817D4: D9 5D EC              -  fstp dword ptr [ebp-14]
    "RomeTW-BI.exe"+1817D7: 8B 45 F0              -  mov eax,[ebp-10]
    // ---------- INJECTING HERE ----------       -  jmp newmem
    newmem:
    //"RomeTW-BI.exe"+1817DD: D9 98 7C 02 00 00     -  fstp dword ptr [eax+0000027C]
    
    fstp dword ptr [eax+0000027C]
    
    mov [eax+c4], (float)80.0
    mov [ebp-14], (float)80.0
    mov [eax+27c], (float)80.0
    
    jmp returnhere
    // ---------- DONE INJECTING  ----------
    "RomeTW-BI.exe"+1817E3: 0F B6 45 0C           -  movzx eax,byte ptr [ebp+0C] //returnhere
    "RomeTW-BI.exe"+1817E7: 85 C0                 -  test eax,eax
    "RomeTW-BI.exe"+1817E9: 0F 84 DC 01 00 00     -  je RomeTW-BI.exe+1819CB

     

     

  13. 2 часа назад, Xipho сказал:

    Во валит! ))) Шучу ) Из всего вышеперечисленного понял только про матрицы и шейдеры ) 

    Забавно)

    Эйлеровы углы  x,y,z, а кватернион x,y,,z,w.

    В ассетах Unity есть проект  с готовыми персонажами и скриптами. Если NPC двигается вперед со скоростью X к примеру, просто надо развернуть к цели.

    Разворот к цели через эйлеровы углы = дальняя точка - точка npc.

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

     

    В Unity движке очевидно проще движения отработать. Можно тут же запустить и проверить.

     

    В примере выше уважаемых форумчан расчеты как при взгляде сверху  в ортографической проекции. Я только поддерживаю. Просто я так ковырялся для 2д игр с аркатнгенсами, часа два наверно и опух. А когда в Unity работаешь с её функциями, чувство интуиции включается на все движения и углы. Это не объяснить. Уже функции готовые даны, их можно развернуть в декомпиляторе. Только вот, блин, незадача. В новой Unity тело функции стали прятать в InteralCall.

    Скрытый текст

    image.png

    Так что тут мой вариант не подходит для новой версиии Unity 2017.xx. Это кому интересно нужно будет более раннюю версию скачивать.

     

     

     

  14. На форуму перекинуть с edit-a не получилось через SetFocus() .

    Если пустая форма и Edit на ней, то у меня вышло убрать фокус так.

    Скрыть и показать Edit, что практически не заметно глазу.

    Убрать выделение текста

     

    Скрытый текст
    
    -- Событие на едит
    function CEEdit1Exit(sender)
      print("Вышел")
    end
    // Событие на внешнюю область
    function FormClick(sender)
      UDF1.CEEdit1.Visible = false
      UDF1.CEEdit1.Visible = true
      UDF1.CEEdit1.SelLength = 0
    end

     

     

    16 минут назад, ReWanet сказал:

    Конечно можно просто перекидывать фокус на другой компонент но что-то не очень :(

    Можно искать пути решения и выбрать подходящий. В самом крайнем случае это ассемблерные правки в самом CE, когда Lua код не работает как надо.  В этот момент у многих может быть желание отказаться от Cheat Engine.

     

  15. 19 часов назад, pachela сказал:

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

    Люди добрые помогите кто чем может :-[

     

    Намутить автобегалку/леталку  можно на игровом движке Unity. Посмотреть как сделать движение и повороты. Можно сделать очень много экспериментов по движениям, эйлеровым углам, кватернионам, матрицам, шейдерам и прочее. По навигации можно наделать алгоритмов на C# сколько угодно. Есть также стандартный агент навигации, который поможет сравнить свой и его алгоритм.

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

  16. 20 часов назад, Razi сказал:

    1) Запись происходит при событии OnChange. Не будет ли происходить запись дополнительно, когда в игре изменится значение в этом адресе, потому что тогда по идее сработает наше событие OnChange в CEEdit1?

    2) Вообще в идеале хотелось бы сделать считку/запись также как в Artmoney. Там запись как-то реализована при выходе из поля ввода и после этого происходит сразу считывание. Смотрел в Artmoney: При входе в поле ввода (по второму клику) - считывание останавливается. При выходе происходит запись в адрес и после записи сразу считывание.  Непонятно как они это реализовали и как сделать также в текстбоксе CEEdit1?

    3) И выходит если таких текстбоксов CEEdit1 нужно 150 штук, тогда для каждого нужно будет писать такой код? Подсказали, нужно делать через цикл считывание? А для записи в адрес, тогда нужно отдельно писать код для каждого Editbox получается.

     

    Если Cheat Engine не важен, можно быстрее сделать такие таблицы в готовой среде разработки.

    Такие штуки можно сначала на Дельфи7 (или бесплатном Lazarus) сделать, потом на CE Lua переходить.

    А если на Дельфи понравится, то на нем можно делать трейнеры. Между прочим там есть готовые компоненты таблицы.

    Скрытый текст

    lazarus_undocked.png

     

    1. В окне Lua можно ставить брейкпоинты. Провести отладку и узнать как и что работает не так.

    Т.е. окно Lua консоли, которое  вызывается из окна отладчика CE. Там CE код можно написать, поставить бряки и выполнить. Также можно через print() логать любые участки кода.

    2. Событие выхода из поля Edit есть. Его можно использовать для записи. Потом в функции тика таймера ждешь, пока значение не запишется (1 секунды к примеру), потом там же в функции таймера читаешь из памяти в визуальный компонент.

    3. Если бы я делал эту задачу я бы попробовал все способы начиная от 150-ти эдитов выставленных программно, или 150 label-ов и 1-го Edita- который подставлять в место label,  до радикального способа —рисования таблицы Lua скриптами.

  17. В 11.02.2018 в 20:47, Razi сказал:

    Подойдет ли для этого такой элемент, как обычная таблица? Но в конструкторе CE обычной таблицы кажется нет.

     

    Визуальными стилями, цветами пожалуй возможно сделать подобие таблицы, если ровненько все поставить.

    Если очень надо, то радикальный способ. Можно таблицу  сделать программно отрисовывая линии, текст и ставя EditBox в нужную позицию. Надо знать обработчики событий и доки по Lua смотреть.

     

    В 11.02.2018 в 22:11, Razi сказал:

    тогда постоянно происходит считывание в CEEdit1 и записать свое значение уже нельзя. Как с этой ситуацией разобраться? Нужно и считывание из адреса в CEEdit1 и записывание в адрес из CEEdit1.

     

    Можно попробовать такой способ как работу с событиями CEEdit.

    Получили фокус — заблокировали чтение из памяти  в EditBox (по таймеру).

    Потеряли фокус — разрешили чтение из памяти в EditBox (по таймеру).

    Что-то вводим — пишем в память из EditBox.

    Скрытый текст

    Events.png

     

    Рекомендую полистать книжки по Дельфи7 для работы с компонентами похожими на те, что есть в Cheat Engine.  Например, про EditBox

     

  18. On 1/30/2018 at 7:56 PM, vadik111 said:

    Cheat Engine был в цикле и искал постоянно процесс который мне нужен ? и подрубал в него нужный мне скрипт из таблицы. Возможно ли мне это сделать ?

     

    Написал готовый код.

    Там есть названия процессов и "нужных" скриптов.

    Объяснять как поправить и как въехать в Lua скрипт у меня времени не будет.

     

    Скрытый текст
    
    function MainProgramm()
    
      local DataBase =
      {
        {"Tutorial-i386.exe", "Auto Assemble script 1"},
        {"Tutorial-x86_64.exe", "Auto Assemble script 2"}
      }
    
      function DeactiveAll()
        for i = 1, #DataBase do
            getAddressList().getMemoryRecordByDescription(DataBase[i][2]).Active = false
        end
      end
    
      function CETimer1Timer(sender)
        for i = 1, #DataBase do
          if getProcessIDFromProcessName(DataBase[i][1]) ~= nil then
            getAddressList().getMemoryRecordByDescription(DataBase[i][2]).Active = true
          else
            getAddressList().getMemoryRecordByDescription(DataBase[i][2]).Active = false
          end
        end
      end
    
      local processTimer = createTimer(nil, true)
      processTimer.Interval = 1000
      processTimer.OnTimer = CETimer1Timer
    end
    
    MainProgramm()

     

     

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

    • Понравилось 2
  19. Старые исходники на Дельфи 7. Новые на Лазаре ( тема)

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

     

    По поводу вопроса

    11 час назад, amhad321 сказал:

    p.s Удалил файл из /bin/cheatengine.exe  потом открыл проект нажимаю на тот же треугольник а теперь ошибка

      bigmemallochandler in 'bigmemallochandler.pas';

    Ничем помочь не могу. Некогда этим заниматься

     

  20. Может работать, не проверял на 6.4

     

    Для скрипта1 добавить под [Enable]

    [ENABLE]
    
    {$lua}
      getAddressList().getMemoryRecordByDescription("Auto Assemble script 2").Active = false
      getAddressList().getMemoryRecordByDescription("Auto Assemble script 3").Active = false
    
    {$asm}
    // тут АА код
    [DISABLE]

    Похоже решение проще чем выше )

    • Понравилось 2
×
×
  • Создать...

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

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