-
Постов
2 999 -
Зарегистрирован
-
Победитель дней
129
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные MasterGH
-
-
6 часов назад, Alex2411 сказал:
у меня с этой проверкой скрипт вообше не реаботает . даже не включаеться
try/except на последней версии CE 6.8.3 должно работать
{$try} mov eax,[ecx+10] jmp short noerror {$except} xor eax,eax noerror:
Может быть, ты свой скрипт покажешь, если хочешь конечно
Под except нужно восстановить оригинальное значение.
Хотя я думаю, не поможет этот try/catch. Будет вылетать на других инструкциях
-
-
Алгоритм:
1. Левая часть1 строки из пробелов создается на N-1 символ за проход цикла
2. Правая часть2 из "X" увеличивается на +1 символ за проход цикла
3. Левая и правая части соединяются в строку и выводятся
Реализация на CE Lua (знаю, что не на C++, поэтому оффтоп)
local N = 30 for i=0,N do print(string.rep('_',N-i)..string.rep('X',i)) end
-
В 04.04.2019 в 20:58, partoftheworlD сказал:
Почему бы не погуглить? Обработчик исключений был бы идеальным решением, проверки адресов. https://wiki.cheatengine.org/index.php?title=Auto_Assembler:TRY_EXCEPT
Там даже пример есть. Ох уж любители костылей.
Этот пример стоит попробовать, я и забыл про этот синтаксис, но только исключение может быть в другом участке кода, например, из-за записи значения вместо указателя и другой участок кода вызовет исключение.
Так что решили проблему? По Lua я не помогу, т.к. пока очень мало времени. По Lua я бы сделал иначе. Там нужно вызывать Lua функцию через AA. Если будет время, покажу пример.
-
Теоретически. Как пример для любой игры сингловой или мультиплеерной:
1. Ищем адрес координат игрока
2. Ставим брейкпоинт на адрес координат игрока
3. Ищем инструкцию, которая работает со всеми координатами
4. Собираем постоянно в массив самые дальние координаты и узнаем примерную область карты.
Вообще зависит от движка игры. Если это Unity, то можно перебрать все коллизии с самым большим размером и дальними положениями, или если есть что-то похожее на Terrain, то найти этот компонент и получить свойства ширины и длинны.
-
34 минуты назад, Alex2411 сказал:
оказываеться не работает когда в опциях дебагера стоит int3 instructions
int3 работает только на инструкциях, а аппаратные как на инструкциях так и на данных.
-
-
5 часов назад, Alex2411 сказал:
еще хотел спросить . может так быть что в памяти игры в середине есть пустые места с знаками
Конечно, может. Посмотри карту памяти
СпойлерКороче пробуй сравнивать структуры, пробуй трассервку, пробуй составлять поинтеры через отладку.
В CE 6.8.3 можно сравнить ветви трассировки. Берешь правильную ветвь, берешь любую не правильную. Сравниваешь до верхнрего call-а и с него начинаешь многоуровневый указатель выстраивать или же на это м call-е смотришь параметры и стек, и там правишь код.
Спойлер -
Я бы пробовал
Спойлерlabel(Handler) label(NoException) label(ExceptionHandled) 00270000: // you need create thread on 00270000 pushad mov esi, Handler push esi push fs:[0] mov fs:[0], esp push eax mov eax,ebx mov eax,[eax+10] mov eax,[eax+20] cmp eax, ... pop eax Jmp NoException Handler: mov esp,[esp+0x08] pop fs:[0] add esp, 4 popad // This point if we have exception runnig Jmp ExceptionHandled Jmp NoException NoException: pop fs:[0] // restore the old EXEPTION add esp, 0x24 //32+4 ret ExceptionHandled: ret
или пункт 6, который я написал.
-
13 часов назад, Alex2411 сказал:
cmp [eax], ... // проверка есть ли память по адресу
Вариантов решений несколько
1. Могут быть адреса, которые явно читать не стоит. такие как
cmp eax, 0 cmp eax, 0xffffffff
Тогда просто сравнить их и все
2. Использовать API Windows для определения прав доступа к адресу на чтение и запись перед обращением
3. Использовать обработку исключений типа этого
Спойлерlabel(Handler) label(NoException) label(ExceptionHandled) label(lpCaption) label(lpText) 00270000: // you need create thread on 00270000 pushad mov esi, Handler push esi push fs:[0] mov fs:[0], esp mov ecx, [0] // EXEPTION! Jmp NoException Handler: mov esp,[esp+0x08] pop fs:[0] add esp, 4 popad // This point if we have exception runnig Jmp ExceptionHandled Jmp NoException NoException: pop fs:[0] // restore the old EXEPTION add esp, 0x24 //32+4 ret ExceptionHandled: // the exception was eaten push 0 //uType (0=mb_ok) push lpCaption push lpText push 0 //hWnd call MessageBoxA ret lpCaption: db 'Exception!' 0 lpText: db 'You have exception' 0
4. Использовать CE Lua для определения доступа к адресу
function CheckAddress(address) return readInteger(address) ~= nil end
Это функцию можно использовать двумя способами.
Либо через вызов Lua функции из CE AA (в прочем там же можно и сразу писать значение)
Либо кешировать адреса в метки и по Lua таймеру записывать значение по адресам.
5. Вариант искать другое место кода для инъекции
6. Вариант искать условия, когда адрес всегда валидный (например, когда в той же структуре адреса имеют определенные значения)
В большинстве случаев подходит вариант5. Нужно найти другое место кода, откуда например читается значения во время игры только для игрока. Например, когда код читает значение и передает его на экран.
- 2
-
Матрицу можешь по таймеру получить через CE Lua вызовы mono функций и отображать её в самой CE. По значениям сможешь поискать адреса
https://wiki.cheatengine.org/index.php?title=Tutorial:Mono:Basic
В 20.03.2019 в 11:11, partoftheworlD сказал:Все верно. Получение видовой матрицы
-
2 часа назад, Antonshka сказал:
Недостаток такого метода, опять же занимающий некоторое время брутфорс.
Если бы я делал, то я бы сделал две функции и скрипт CE
1) функция. которая собирает словарь в текстовый файл с константами и оригинальной расшифровкой (на CE Lua в режиме отладки)
2) функция в инжектируемой dll, которая грузит словарь из файла в память и принимает аргументы константу и оригинальное расшифровываемое значение, а возвращает модифицированное.
3) CE скрипт с инжектом dll-ки и вызовом функции из пункта2 (с подменой по словарю оригинальных значений)
И все... и никакого брутфорса. Пункты 1 - полу-универсальный , 2-универсальный, а 3 - меняется. Подойдет< скорее всего, или может подойти для любых типов шифрований в играх, где есть расшифровка в процессе игры.
- 1
-
Когда данные уже расшифровываются и получается так, что они известны, то в любом случае можно ничего не подбирать. Можно пробовать подменять оригинальные значения любыми способами там, где с ними происходит чтение.
Если оринтируемся на константы и знаем, какие с чем связаны, то можно составить список(или словарь с ключами констант) с данными констант и подменяемых значений. А если нужно, то еще и возвращаемых оригинальных, чтобы отменить изменения. По этому списку подменять результат расшифровки.
-
Прицеливание делать в Update, исправив управление мышкой.
Поведение выстрела переписать. Прицеливание либо по формуле угла и силы или через подбор вариантов.
Поиск целей отдельной функций написать.
Я бы просто уменьшил вес у стрелы, чтобы она по прямой летела без аима. Смотри компонент на стреле Rigidbody.
Ссылки слетели...
-
WriteLog работает так
1. Находим адрес
2. Запускаем скрипт логирования
writeLog = getWriteLog writeLog.status = true
3. Пишем в адрес пару раз
4. Снимаем логи
Спойлерfunction TableToString(argtable) local s = '' for i=1, #argtable do s = s..' '..string.format("0x%02X",(argtable[i])) end return s end writeLog = getWriteLog() writeLog.status = true -- уже это сделали, можно не делать local tableLog = writeLog.getLog() for i = 0, 1 do print(string.format("0x%X",tableLog[i].address)) print(TableToString(tableLog[i].original)) print(TableToString(tableLog[i].new)) end
Далее сравнение stacktrace
1. Делаем один stacktrace и сохраняем в файл 1
2. Делаем второй stacktrace и сохраняем в файл 2
3. Выбираем опцию сравнения в меню "open trace for comparision"
4. Выбираем опцию Realign compare из контекстного меню и выбирая адрес слева или справа сравниваем трейс
Трейслог можно снимать как с hex view байтов из окна памяти, так и с кода в дизассемблере. Например, одна ветвь кода будет связана с главным игроком на чтение или запись значения, а другая ветвь будет не с игроком... Можно попробовать сравнить и выйти вверх на начало функции где будут попадать одинаковые или разные аргументы перед call и исследовать их связь с изменением значения или его чтением.
- 1
- 2
-
Релиз Cheat Engine 6.8.3 февраля 7-го 2019
Fixes:
- debugging/stepping with hotkeys
- several high DPI visual glitches
- VEH debugger reattach works again
- Pointerscan resume works again
- Stackview can now show by reference , previously it did nothing
- disassembling imul
- speedhack while key down option
- assembling values with x*2/4/8
- the "resume thread" in the threadlist now resumes threads instead of freezing them fixed an error popping up when editing registers with no debugger attached
- getNameFromAddress will not show userdefined symbols when symbols are disabled
Additions and Changes:
- Waiting till all symbols have been loaded has been removed
- Launching structure compare from dissect data now only needs 1 address, though it's recommended to have at least 2 each
- Code completion in lua engine is now more smoother
- You can now compare traces generated by the tracer
- Threadlist window now has a copy to clipboard
- Structure compare now digs deeper into pointers
- Pointerscan import/export now works with newer types as well
- Better Lua comment support
- Added rudimentary sort to the structure compare window (based on levelwidth only)
- Referenced strings now also shows if it's unicode
- Formdesigner now has a context menu to add undocumented controls
Lua:
- added enumMemoryRegions
- added getWriteLog (Let's you get the writelog and activate it)
- HexadecimalView: added the OnCharacterRender and OnValueRender events
Post release patches:
02/11/2019: Don't search addresslist entries in PDB when still loading and give an option to quit slow load
02/17/2019: Fixed speedhack giving an error first time activating and removed a message when using ctrl and scanningИзменения в Lua файле документации
Добавились поля
СпойлерЦитатаHexadecimal class: (Inheritance: Panel->CustomControl->WinControl->Control->Component->Object)
The visual hexadecimal object used on the memory view window
properties
Address: integer - The top address
HasSelection: boolean - True if something is selected
SelectionStart: integer
SelectionStop: integer
DisplayType: displaytype - The type being shown: dtByte, dtByteDec, dtWord, dtWordDec, dtDword, dtDwordDec, dtQword, dtQwordDec, dtSingle, dtDouble
OnAddressChange(hexadecimalview, function): function(hexadecimalview, address)
OnByteSelect(hexadecimalview, function): function(hexadecimalview, address, address2)
OnCharacterRender: function(sender, address, text) return text end - Called when a character is being rendered. Use this to change it or change the canvas fonts (Warning: slow)
OnValueRender: function(sender, address, text) return text end - Called when a value (depending on the displaytype) is being rendered. Use this to change it or change the canvas fonts (Warning: slow)methods
-WriteLog(Inheritence: -)
properties
status: boolean
logsize: integermethods
getLog(): table - Returns an indexed table with the write logs. each entry has a table with the fields: address, original and newКомментарии
С CE Lua появилась возможность работать с HexView: выбор значений адресов, изменение типов, перехват рендерера для изменения шрифта или текста. Как я понял, если что-то поменялось в памяти, т.е. в окне HexView и стало красным, то это можно перехватить.
Возможность работы с WriteLog записи в памяти. Т.е. этот же окно WriteLog ниже только есть доступ к нему через Lua. Хотя, как я не пытался вызывать getLog() метод не понятно из объекта какого-класса - CE не видит класс WriteLog... Короче ладно, может потом решится
- 1
- 3
-
10 часов назад, DenAks сказал:
как написать скрипт который ищет все адреса со значением(сигнатурой) 7B 14 AE 47 E1 7A 84 3F 00 00 00 00 00 00 00 40 и заменяет на другую - 66 66 66 66 66 66 D6 3F 00 00 00 00 00 00 00 40
Программировать
Спойлер{$lua} [ENABLE] function WriteSignatures(targetSignature, overrideSignature, codePage) local byteLine = overrideSignature:gsub("%w+", "0x%0,"):sub(1,-2) local results = AOBScan(targetSignature, codePage) if (results == nil) then return end for i = 0, results.Count-1 do local address = getAddress(results.getString(i)) local lineCode = 'writeBytes('..address..','.. byteLine..')' loadstring(lineCode)() end results.destroy() end local targetSignature = '7B 14 AE 47 E1 7A 84 3F 00 00 00 00 00 00 00 40' local overrideSignature = '66 66 66 66 66 66 D6 3F 00 00 00 00 00 00 00 40' local codePage = '-X*C*W' -- для кода: '+X-C-W',а для данных:'-X*C*W' WriteSignatures(targetSignature, overrideSignature, codePage) [DISABLE]
- 1
-
20 минут назад, Sanic сказал:
всегда ли он делает это верно?
Не всегда
21 минуту назад, Sanic сказал:Как CE находит пределы функции
Все есть в исходниках CE в открытом доступе.
-
Что-то у меня тоже не получилось найти. Сделал иначе с декомпиляцией, правкой и собрал в exe.
Нужно пройти миссию, чтобы голды стало много. Придется только игру заново проходить чтобы с читами играть.
Если такой чит подходит, то от спонсорства не откажемся. На форуме можно сделать пожертвование.
- 1
-
А ты точно подключаешься к нужному процессу игры? Проверь все процессы через Process Explorer
Можешь попробовать мой плагин логов. Возможно будет понятнее, что делаешь не так
Спойлер- 1
-
А в этом году форуму будет 10 лет, но будет это еще примерно через месяцев десять.
Судя по регистрации первых пользователей дата 11-ое декабря 2009 года. Скорее всего, 11 декабря 2019
- 1
-
C помощью Lua можно убрать ненужные указатели. В документации по Lua все написано
-
В 09.01.2019 в 22:22, Alex2411 сказал:
отдельно скрипты работают , а когда соединю вместе , то игра зависает иногда крашится
Просто покажи как ты объединяешь скрипты. Может быть там ошибка от простой до той, с которой надо сидеть и разбираться в отладке. CE иногда может с багами скрипты компилировать
-
Автозавершение
Спойлер2. Окно поиска исполняемого и не исполняемого кода из трейслога, из бинарника и из файла адресов. Не тестил особо. Вылет получил после третьего отсева на туториале
3. Новые опции поведения отладки. Не тестил
Внимание привлекло опции слежения за областью памяти (структуры), т.к. какой код к каким адресам структуры обращается. Всякие watched regions
Спойлер- 1
- 1
Как исключить адреса не являющиеся указателями при написании фильтра
in Статьи для новичков
Опубликовано
Все работает
[ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat alloc(newmem,2048) label(returnhere) label(originalcode) label(exit) newmem: //this is allocated memory, you have read,write,execute access //place your code here originalcode: {$try} mov eax,[0] //mov eax,[ebx+00000480] jmp short noerror {$except} noerror: mov eax,[ebx+00000480] exit: jmp returnhere "Tutorial-i386.exe"+23EA8: jmp newmem nop returnhere: [DISABLE] //code from here till the end of the code will be used to disable the cheat dealloc(newmem) "Tutorial-i386.exe"+23EA8: mov eax,[ebx+00000480] //Alt: db 8B 83 80 04 00 00
Если делать без try/except, то естественный crash