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

MasterGH

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

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

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

    129

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

  1. Пошаговая отладка в Cheat Engine подскажет что не так. Заранее вручную создаем newMem-память, метку и вручную запускаем поток и там делаем пошаговую отладку. Разбираемся в причинах. Правим. Проверяем и так пока не будет работать.

  2. Видео-то не плохое, хорошее. Все подробно изложено и работает.

     

    Что можно улучшить до идеала. Попробовать кому-нибудь аналитику прикрутить с проверкой нашлась сигнатура или нет. Результат попробовать отправлять в сервис аналитики. Возможно Firebase или что-то похожее

    • Спасибо 1
  3. Принцип: SOLID, KISS, DRY

    1) через OOP в Lua

    2) через вложенные функции в Lua

    3) через "код пишет код"

    Спойлер
    
    function calculateString (str)
        return  assert(loadstring( "return "  .. str))()
    end 
  4. В 02.08.2018 в 23:05, Alex2411 сказал:

    окно structure disect  остаеться пустое

     

    Сканер запускаем в таком виде.

    Спойлер

    image.png

     

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

    Потом ищем структуру

    Спойлер

    image.png

     

    Общая картина для Tutorial-i86. Так что работает

    Спойлер

    image.png

     

     

    В 02.08.2018 в 23:05, Alex2411 сказал:

    в окне lua engine в окошке output  появляеться большой столбик адресов . что делать с ними  дальше ?

     

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

    Спойлер

    image.png

    Структуру смотреть. Там параметры, которые читались. Если стоит WRITE, то записывались

    Спойлер

    image.png

     

     

     

    • Понравилось 1
  5. Dissect Data Scaner должен идти на 6.8.1. Развивать были планы. Как я понял в DBVM, в  CE 6.8.X появилась возможность ставить брейкпоинт на всю структуру сразу, а не довольствоваться аппаратными брейкпоинтами из которых плагин использует только 1-аппартный брейкпоинт на настраиваемую пользователем X—задержку, на +1 байт по всей структуре. 

     

  6. 20 часов назад, Alex2411 сказал:

    спайдер  сохраняет  только адреса  и офсеты указателей

    Да, нельзя, я посмотрел. Прошу прощения, что ввел в заблуждение. Сам не проверил.

    Тогда остается писать Lua плагин в том же TinyDumper-е по сохранению и восстановлению многоуровневых структур. К сожалению, пока некогда им заняться и не понятно когда будет время.

    Там  по циклу получается определять структуры через autoguess и делать рекурсию по X вложенности при этом сохраняя значения. Потом придумать формат сохранения бинарный, т.к. строками — будет много. Потом придумать как это обратно восстановить через alloc() -и в памяти. Поменяются поинтеры и Spider может их показывать как результат сканирования, это может мешать... Довольно это трудоемко, пока не планирую этим заниматься, но могу подсказать как это написать на Lua в TinyDmper-е, на какие функции внимание обратить и как реализовать.

  7. Через АА примерно так делать можно, где в originalbytes будет адрес

    Спойлер

    image.png

    Спойлер
    
    { Game   : Tutorial-i386.exe
      Version: 
      Date   : 2018-07-31
      Author : Andrew
    
      This script does blah blah blah
    }
    
    [ENABLE]
    //code from here to '[DISABLE]' will be used to enable the cheat
    
     
     
    aobscanmodule(INJECT,Tutorial-i386.exe,64 FF FF 89 F1 B8 88 4A 5A 00) // should be unique
    alloc(newmem,$1000)
    alloc(originalbytes, 7)
    registersymbol(originalbytes)
    
    label(code)
    label(return)
    
    originalbytes:
    readmem(INJECT+05+01,5)  //store the original bytes
    
    newmem:
      //readmem(INJECT+05,5)
    code:
      reassemble(INJECT+05)
      jmp return
    
    INJECT+05:
      jmp newmem
    return:
    registersymbol(INJECT)
    
    [DISABLE]
    //code from here till the end of the code will be used to disable the cheat
    INJECT+05:
      db B8 88 4A 5A 00
    
    unregistersymbol(INJECT)
    dealloc(newmem)
    
    {
    // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+2402B
    
    "Tutorial-i386.exe"+2400D: 8B 8B 78 04 00 00              -  mov ecx,[ebx+00000478]
    "Tutorial-i386.exe"+24013: 8B 09                          -  mov ecx,[ecx]
    "Tutorial-i386.exe"+24015: FF 91 D8 00 00 00              -  call dword ptr [ecx+000000D8]
    "Tutorial-i386.exe"+2401B: 5B                             -  pop ebx
    "Tutorial-i386.exe"+2401C: C3                             -  ret 
    "Tutorial-i386.exe"+2401D: 00 00                          -  add [eax],al
    "Tutorial-i386.exe"+2401F: 00 53 56                       -  add [ebx+56],dl
    "Tutorial-i386.exe"+24022: 89 C6                          -  mov esi,eax
    "Tutorial-i386.exe"+24024: E8 87 64 FF FF                 -  call Tutorial-i386.exe+1A4B0
    "Tutorial-i386.exe"+24029: 89 F1                          -  mov ecx,esi
    // ---------- INJECTING HERE ----------
    "Tutorial-i386.exe"+2402B: B8 88 4A 5A 00                 -  mov eax,Tutorial-i386.exe+1A4A88
    // ---------- DONE INJECTING  ----------
    "Tutorial-i386.exe"+24030: BA 01 00 00 00                 -  mov edx,00000001
    "Tutorial-i386.exe"+24035: BB 88 4A 5A 00                 -  mov ebx,Tutorial-i386.exe+1A4A88
    "Tutorial-i386.exe"+2403A: FF 93 C4 00 00 00              -  call dword ptr [ebx+000000C4]
    "Tutorial-i386.exe"+24040: A3 E0 15 60 00                 -  mov [Tutorial-i386.exe+2015E0],eax
    "Tutorial-i386.exe"+24045: 8B 96 3C 02 00 00              -  mov edx,[esi+0000023C]
    "Tutorial-i386.exe"+2404B: A1 E0 15 60 00                 -  mov eax,[Tutorial-i386.exe+2015E0]
    "Tutorial-i386.exe"+24050: E8 CB EE 06 00                 -  call Tutorial-i386.exe+92F20
    "Tutorial-i386.exe"+24055: 8B 96 E8 00 00 00              -  mov edx,[esi+000000E8]
    "Tutorial-i386.exe"+2405B: A1 E0 15 60 00                 -  mov eax,[Tutorial-i386.exe+2015E0]
    "Tutorial-i386.exe"+24060: E8 4B F1 06 00                 -  call Tutorial-i386.exe+931B0
    }

     

     

    Через Lua:

    Спойлер
    
    local signature = '64 FF FF 89 F1 B8 88 4A 5A 00'
    local results = AOBScan(signature, "+X-C*W")
    if results ~= nil then
      local address = getNameFromAddress(results[0]..'+5')
      --local targetAddress = disassemble(address):match("%[(.+)%]")  если адрес в скобках
      -- для извлечения адреса -- 0042402B - B8 884A5A00           - mov eax,005A4A88 { [00000488] }  если адрес после зяпятой не в скобках
      local targetAddress = disassemble(address):match(",(.+)")
            --> 0x005A4A88
      print(targetAddress)
    end

     

    Спойлер

    image.png

     

  8. 1 час назад, Desmos сказал:

    Что делать?

     

    Делать инъекцию ниже где идет xmm0

    438F5884: 66 0F D6 45 A8           -  movq [ebp-58],xmm0

    так проще. Ну а чтобы до того адреса добраться, то на АА разные варианты подбирать либо быстрее на Lua через поиск сигнатуры и + смещение. Либо через поиск сигнатуры и дизассемблирование

  9. 1 час назад, Alex2411 сказал:

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

    Для +1 уровня в Spider-е не должно быть очень долго для структуры размером с 0x1000. Долго начинается +3 и выше.

     

    Я все-таки предлагаю помучиться со сканированием в Spider-е.

     

    1. Ищем первый раз + 1lvl Pointer, пишем в файл дамп

    2. Меняем значение в игре. Если оно редко меняется, то делаем так чтобы менялось чаще. Например, загрузка игры с разными сохранениями.

    3. Делаем отсев "изменилось" по адресу структуры (он поменяется, его заново найти) в новый файл. На этом шаге уже будет результат отсева, а не весь дамп в отдельном файле как дамп из пункта1. Отсев дальше быстрее пойдет

    Ну и так далее... :)

  10. 11 часов назад, Alex2411 сказал:

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

    Говоришь полный мануал и чтобы все функции были написаны. Тогда качай исходники Cheat Engine

     

    11 часов назад, Alex2411 сказал:

    еще объясни пожалуйста . когда lock создал теневую копию , то копия сохраняеться без уровня указателей .  если нужно искать что изменилось в структуре в указателе 2 или 3 или больше уровня   как это сделать ?  еще мне очень нравиться  твой  плагин tinydumper  часто им  поьзуюсь , но  он  то же  не запоминает в  глубину указателей .

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

    11 часов назад, Alex2411 сказал:

    еще мне очень нравиться  твой  плагин tinydumper  часто им  поьзуюсь , но  он  то же  не запоминает в  глубину указателей .

    К сожалению, не запоминает. Не обещаю, что сделаю эту функцию В каких случаях это могло бы пригодится? Можно же сравнить не Lock структуру с не Lock структурой и никаких проблем. А вот со стеком, возможно бы пригодилось как эксперимент. Вообще лучше Dark Byte напиши предложение об этом, чтобы над lock recursive подумал стоит делать или нет для стека как минимум.

     

    12 часов назад, Alex2411 сказал:

    structure compare  удобная фича , но  мне пришлось из за багов сносить 6.8  и обратно  поставить  6.7

    Уже есть 6.8.1 и там были фиксы

  11. Ну и накатал же я пост. Давно счеты со Spider-ом.  Толком им не пользовался. Я не уверен, что знаю все о Spider-е. Поскольку возник такой вопрос, то решил снова им заняться, но уже более детально. Пришлось кучу скринов наделать.

     

    Со "structure spider" более менее разобраться можно на практике и 9-тым туториалом.

     

    has shadow — адрес структуры—копии. Можно сделать поставив галку Lock в окне Dessect Data на адресе. Делает копию структуры (например стека или данных игрока до перезагрузки уровня)

    Спойлер

    image.png

     

    Сравнивать можно как в Desssect Data так и в Spider-е. Смотря что и как ищешь. Определяется экспериментально.

    Спойлер

    image.png

    *Если поставить Lock и вызывать Spider, то данные о Shadow адресе сами заполнятся. Можешь попробовать, самому их можно не заполнять.

     

    Но Dissect Data — для ручного визуального сравнения.

     

    Запускаем 9-тый туториал и пытаемся понять. Слева окно с Lock адресами. А в окне справа поставлены их shadow copy (их можно посмотреть как на примере, на скрине выше строка "Lock (Shadowcopy at 00350000)")

    Спойлер

    image.png

    Там, где мелкие стрелки и если там удалять адреса, то обновляется значения shadow и не shadow (синий цвет текста и данные будут появятся в таблице результатов). Т.е. можно сравнивать как копии, так и не копии очищая и возвращая значения в полях ввода. Shadow рекомендуется для сравнения дампов стеков

    Спойлер

    image.png

     

    Но есть более лучшее средство чем Spider. Я писал о нем у себя в блоге Scan for commonalites на окне определения проскакивающих адресов

    Спойлер

    image.png

    Спойлер

    image.png

    Разница в значениях по EBX с типом float

    Спойлер

    image.png

    Разница в группах (для потенциального фильтра) с типом 4 byte (опция Only find matching groups)

    Спойлер

    image.png

     

    Все три инструмента: DissectData, Spider и Structure Compare могут помочь что-то сравнить и найти. Structure Compare появился в версии CE 6.8

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

    А почему некоторые цифры и буквы заменяются на звёздочки?Как определить,что заменять,а,что нет?

     

    Первые hex-коды  опкодов остаются, остальные заменяются звездами, чтобы была совместимость с бОльшим количеством сборок игр. Не факт что это прокатит, совсем не факт. Оригинальные опкоды, которые затираются звездами лучше не затирать, т.к. инъекция кода может не работать с тем, что под звездами оригинальных окодов. Объяснил как смог.

     

    Короче, лучше на всякий случай без звезд делать инъекцию так как делает обычный шаблон Cheat Engine.

    Потенциал от ААMaker все же есть —  это генерировать АА по своему шаблону, но с сигнатурой косяк вышел (см. выше).

    У AAMaker есть альтернативы на сайте Cheat Engine.  AAMaker не планировал обновлять, но все возможно

  13. Есть класс "Edit Class" в справочнике. Я бы обрабатывал через OnKeyDown 

    function CEEdit1KeyDown(sender, key)
      -- тут читаем key и возвращаем его, можем править, если key не подходит
      return key
    end

    Поменять VK_3 на тот, что ввел пользователь.  Может быть не один KEY

    createHotkey(function, {keys, ...})

    Потом еще нужно ключи сохранить в файл, чтобы не вводить их вновь и читать из файла. 

  14. Можно. Открываем celua.txt и смотрим на: 

    "GenericHotkey Class" для привязки по горячим клавишам

    getAddressSafe("[[здесь указатель+]+]+..") для чтения указателя

    writeFloat(address,value) для записи значения по адресу

    "Timer Class" для того чтобы значение морозилось в функции таймера

     

    Я думаю, с этими функциями и классами можно написать на Lua.

  15. 22 часа назад, maks17990 сказал:

    мне дали готовую инструкцию где и какие значения на какие поменять. Но половина значений я не могу найти. Я декомпилировал файл сохранил код открыл через visual studio.  И на этом все. Гуглил ни чего полезного не нашел. Подскажите ?

    Тут ничего не подскажешь. Нужно название игры, версия и название чита

  16. Lua скрипт добавить в таблицу. CE будет будет подключаться к процессам по имени и искать уникальную сигнатуру. После того как сигнатура будет найдена подключение к процессам остановится.

    Спойлер
    
    function onTimerFindProcess()
    	timerfindProcess.Enabled = false
    	local processName = "Protolife.exe"
    	local processTables = getProcesslist()
    	for key, value in pairs(processTables) do
    		if value == processName then
    			openProcess(key)
    			--print('Try open process pid: '..key)
    			local signature = '3B FB 74 55 83 C1 03 23 4D E8 8D 54 49 05 8B 7C 90 07 3B FE'
    			local results = AOBScan(signature, "+X-C*W")
    			if results ~= nil then
    			  local address = results[0]
    			  --print(address)
    			  timerfindProcess.Enabled = false
    			  return
    			end
    		end
    	end
    	timerfindProcess.Enabled = true
    end
    
    timerfindProcess = createTimer(nil)
    timerfindProcess.Interval = 1000
    timerfindProcess.OnTimer = onTimerFindProcess

     

     

  17. Спасибо за логи. Это информация поможет в улучшении плагина. 

     

    Что можно сделать судя по логам

    Вариант 1

    1) Можно искать не известный тип: 4 байта, float, 1 байт, 2 байтаDouble. Либо попробовать сначала сразу все типы: Value type "All" (если это не очень долгий поиск)

    2) Затем отсеивание "Увеличилось", "Уменьшилось" пока не найдется адрес

    Поиск может быть от минуты и более. 

    Вариант 2  с типами данных (4 байта, float, 1 байт, 2 байтаDouble) , что и выше, только наоборот, когда значение уменьшается в игре, то искать увеличилось, когда увеличилось в игре — уменьшилось при отсеве.

    Вариант 3 с типами данных(4 байта, float, 1 байт, 2 байтаDouble), что и выше искать изменилось, не изменилось.

    Вариант 4 искать адрес текста. Ставить брейкопинт на запись и исследовать код.

     

    Если не получится найти, как будет время посмотрю игру

  18. 6 часов назад, JasonMuller сказал:

    А вот с углами вообще не понятно.

    Вариант. Углы убираются в графическом редакторе у картинки трейнера. Загрузить её в TCEImage. Растянуть TCEImage на всю форму. По ссылке выше есть пример такой подложки, её можно сделать другой.

    В таблице CE ниже можно заменить картинку на другую с закругленными углами

    Спойлер

    image.png

    Пример *.CT: transparent.CT

    • Плюс 1
  19. 3 часа назад, Vito5559 сказал:

    Никак не выходит взломать, все значения которые удаётся обнаружить - динамические

    Предлагаю поискать заново с моим плагином логов и эти логи выложить

    Установка: скопировать GHL_log.lua в директорию Cheat Engine "/autorun"

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

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

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