• Запустить активирющий скрипт CE 7.5

    Перенесена Статьи и видео ce aa active rec ce lua важно
    5
    1 Голоса
    5 Сообщения
    369 Просмотры
    MasterGHM
    Кнопка "^"
  • FPU инструкция FINCSTP. Очистка ST(0)

    Справочники ce aa fincstp
    1
    1
    0 Голоса
    1 Сообщения
    87 Просмотры
    MasterGHM
    Команда FINCSTP добавляет единицу (без переноса) к трехбитному полю TOP слова состояния FPU. Эффект действия команды FINCSTP заключается во вращении стека. Она не изменяет регистров тэгов и не перемещает данные. Она не эквивалентна операции выталкивания из стека, потому что, она не устанавливает тэг старой вершины стека в значение пустой. Флаги C0, C2, C3 регистра SW после выполнения команды не определены, флаг C1 устанавливается равным 0. Похожа на FSTP, также вращает стек регистров FPU (я кстати не знал, увидел при тестах в CE), но только не перемещает значение по адресу. FSTP [здесь указывается адрес или регистр] FINCSTP Если нужно вытолкнуть значение из ST(0), а адрес куда его выталкивать не нужен, то можно сделать так FINCSTP Или аналог FSTP ST(0) При использовании стоит обратить внимание на флаги, возможно их состояние будет влиять на исполнение кода. *Вообще не помню почему я пишу "выталкивать значение" через fstp, когда оно появляется снизу в ST(8). Т.е. не выталкивается по сути.
  • Функция autoAssemble

    Перенесена Статьи и видео ce aa ce lua autoassemble
    2
    1 Голоса
    2 Сообщения
    2k Просмотры
    PitronicP
    Пользователь @MasterGH написал в Функция autoAssemble: // Скрипт похожий на таблицу АА Маленькое замечание. Два слеша используются для коментариев в асм. На луа используются пунктир не менее двух чёрточек. Если пользователь не разбирается, он не поймёт почему луа выдаёт ошибку. Тему поправил.
  • Обработка исключения в Cheat Engine AA

    Перенесена Статьи и видео фишки ce aa exception
    1
    0 Голоса
    1 Сообщения
    66 Просмотры
    MasterGHM
    Новые директивы try/except в AA доступны Cheat Engine 6.8 Beta2 и выше Задача try/except в AA обработать исключение, не допустить crash. Чтобы игра продолжалась, а чит в лучшем случае не закрыл бы процесс. В теории возможно определить, что был crash и что-то сделать. Например, отправить логи в свой или иной удаленный сервис аналитики, что такой-то чит не сработал... Пример от DarkByte для try/exceptс счетчиком crashes [ENABLE] alloc(newmem,2048) alloc(crashcount,4) registersymbol(crashcount) label(returnhere) label(originalcode) label(exit) newmem: push eax {$try} mov eax,[esi+95c] cmp [eax+10],0 jmp ok {$except} pop eax add [crashcount],1 jmp originalcode ok: pop eax je aftersub //it is 0 originalcode: subss xmm0,xmm3 aftersub: movss [esi+00000164],xmm0 exit: jmp returnhere "HomeworldRM.exe"+22AEEA: jmp newmem nop nop nop nop nop nop nop returnhere: [DISABLE] dealloc(newmem) "HomeworldRM.exe"+22AEEA: subss xmm0,xmm3 movss [esi+00000164],xmm0 //Alt: db F3 0F 5C C3 F3 0F 11 86 64 01 00 00
  • Считаем размер инъекции в байтах

    Перенесена Статьи и видео ce lua фишки ce aa
    1
    2
    0 Голоса
    1 Сообщения
    69 Просмотры
    MasterGHM
    Можно подхватить разные моменты активации и деактивации записи в таблице CE и рассчитать размер кода между метками По шаблону вставляем АА код для туториала Cheat Engine Регистрируем метки-маркеры в АА коде Этими метками в Lua считаем и выводим ""endCode - startCode" размер байтов Пример, который подсчитал 15 байтов Пример скрипта {$lua} memrec.OnActivate = function (memoryrecord, before, currentstate) if currentstate and not before then print("Bytes: " .. getAddress("endCode - startCode")) end return before end {$ASM} [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat aobscanmodule(INJECT,Tutorial-i386.exe,81 BB 80 04 00 00 E8 03 00 00) // should be unique alloc(newmem,$1000) label(code) label(endCode) label(startCode) registerSymbol(startCode) registerSymbol(endCode) newmem: code: startCode: cmp [ebx+00000480],000003E8 jmp return endCode: INJECT: jmp newmem nop nop nop nop nop return: registersymbol(INJECT) [DISABLE] //code from here till the end of the code will be used to disable the cheat INJECT: db 81 BB 80 04 00 00 E8 03 00 00 unregistersymbol(startCode) unregistersymbol(endCode) unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+23FE3 "Tutorial-i386.exe"+23FD1: C9 - leave "Tutorial-i386.exe"+23FD2: C3 - ret "Tutorial-i386.exe"+23FD3: 00 00 - add [eax],al "Tutorial-i386.exe"+23FD5: 00 00 - add [eax],al "Tutorial-i386.exe"+23FD7: 00 00 - add [eax],al "Tutorial-i386.exe"+23FD9: 00 00 - add [eax],al "Tutorial-i386.exe"+23FDB: 00 00 - add [eax],al "Tutorial-i386.exe"+23FDD: 00 00 - add [eax],al "Tutorial-i386.exe"+23FDF: 00 53 89 - add [ebx-77],dl "Tutorial-i386.exe"+23FE2: C3 - ret // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+23FE3: 81 BB 80 04 00 00 E8 03 00 00 - cmp [ebx+00000480],000003E8 // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+23FED: 75 2C - jne Tutorial-i386.exe+2401B "Tutorial-i386.exe"+23FEF: 8B 83 68 04 00 00 - mov eax,[ebx+00000468] "Tutorial-i386.exe"+23FF5: B2 01 - mov dl,01 "Tutorial-i386.exe"+23FF7: 8B 8B 68 04 00 00 - mov ecx,[ebx+00000468] "Tutorial-i386.exe"+23FFD: 8B 09 - mov ecx,[ecx] "Tutorial-i386.exe"+23FFF: FF 91 20 02 00 00 - call dword ptr [ecx+00000220] Документация кому интересно MemoryRecord Class: The memoryrecord objects are the entries you see in the addresslist properties ID: Integer - Unique ID Index: Integer - The index ID for this record. 0 is top. (ReadOnly) Description: string- The description of the memory record Address: string - Get/set the interpretable address string. Useful for simple address settings. AddressString: string - Get the address string shown in CE (ReadOnly) OffsetCount: integer - The number of offsets. Set to 0 for a normal address Offset[] : integer - Array to access each offset OffsetText[] : string - Array to access each offset using the interpretable text style CurrentAddress: integer - The address the memoryrecord points to VarType: ValueType (string) - The variable type of this record. See vtByte to vtCustom Type: ValueType (number) - The variable type of this record. See vtByte to vtCustom If the type is vtString then the following properties are available: String.Size: Number of characters in the string String.Unicode: boolean String.Codepage: boolean If the type is vtBinary then the following properties are available Binary.Startbit: First bit to start reading from Binary.Size : Number of bits If the type is vtByteArray then the following properties are available Aob.Size : Number of bytes CustomTypeName: String - If the type is vtCustom this will contain the name of the CustomType Script: String - If the type is vtAutoAssembler this will contain the auto assembler script Value: string - The value in stringform. Selected: boolean - Set to true if selected (ReadOnly) Active: boolean - Set to true to activate/freeze, false to deactivate/unfreeze Color: integer ShowAsHex: boolean - Self explanatory ShowAsSigned: boolean - Self explanatory AllowIncrease: boolean - Allow value increasing, unfreeze will reset it to false AllowDecrease: boolean - Allow value decreasing, unfreeze will reset it to false Collapsed: boolean - Set to true to collapse this record or false to expand it. Use expand/collapse methods for recursive operations. IsGroupHeader: boolean - Set to true if the record was created as a Group Header with no address or value info. (ReadOnly) IsReadable: boolean - Set to false if record contains an unreadable address. NOTE: This property will not be set until the value property is accessed at least once. (ReadOnly) Options: String set - a string enclosed by square brackets filled with the options seperated by a comma. Valid options are: moHideChildren, moActivateChildrenAsWell, moDeactivateChildrenAsWell, moRecursiveSetValue, moAllowManualCollapseAndExpand, moManualExpandCollapse DropDownLinked: boolean - if dropdown list refers to list of another memory record eg. (memrec name) DropDownLinkedMemrec: string - Description of linked memrec or emptystring if not linked DropDownList : StringList - list of "value:description" lines, lists are still separate objects when linked, read-write DropDownReadOnly: boolean - true if 'Disallow manual user input' is set DropDownDescriptionOnly: boolean - self explanatory DisplayAsDropDownListItem: boolean - self explanatory DropDownCount: integer - equivalent to .DropDownList.Count DropDownValue[index] : Array to access values in DropDownList (ReadOnly) DropDownDescription[index] : Array to access Descriptions in DropDownList (ReadOnly) Count: Number of children Child[index] : Array to access the child records [index] = Child[index] Parent: MemoryRecord - self explanatory HotkeyCount: integer - Number of hotkeys attached to this memory record Hotkey[] : Array to index the hotkeys Async: Boolean - Set to true if activating this entry will be asynchronious. (only for AA/Lua scripts) AsyncProcessing: Boolean - True when async is true and it's being processed AsyncProcessingTime: qword - The time that it has been processing in milliseconds OnActivate: function(memoryrecord,before,currentstate):boolean - The function to call when the memoryrecord will change (or changed) Active to true. If before is true, not returning true will cause the activation to stop. OnDeactivate: function(memoryrecord,before,currentstate):boolean - The function to call when the memoryrecord will change (or changed) Active to false. If before is true, not returning true will cause the deactivation to stop. OnDestroy: function() - Called when the memoryrecord is destroyed. OnGetDisplayValue: function(memoryrecord,valuestring):boolean,string - This function gets called when rendering the value of a memory record. Return true and a new string to override the value shown DontSave: boolean - Don't save this memoryrecord and it's children methods getDescription() setDescription() getAddress() : Returns the interpretable addressstring of this record. If it is a pointer, it returns a second result as a table filled with the offsets setAddress(string) : Sets the interpretable address string, and if offsets are provided make it a pointer getOffsetCount(): Returns the number of offsets for this memoryrecord setOffsetCount(integer): Lets you set the number of offsets getOffset(index) : Gets the offset at the given index setOffset(index, value) : Sets the offset at the given index getCurrentAddress(): Returns the current address as an integer (the final result of the interpretable address and pointer offsets) appendToEntry(memrec): Appends the current memory record to the given memory record getHotkey(index): Returns the hotkey from the hotkey array getHotkeyByID(integer): Returns the hotkey with the given id reinterpret() createHotkey({keys}, action, value OPTIONAL): Returns a hotkey object disableWithoutExecute(): Sets the entry to disabled without executing the disable section global events function onMemRecPreExecute(memoryrecord, newstate BOOLEAN): If above function is defined it will be called before action* has been performed. Active property is about to change to newState. function onMemRecPostExecute(memoryrecord, newState BOOLEAN, succeeded BOOLEAN): If above function is defined it will be called after action*. Active property was supposed to change to newState. If 'succeeded' is true it means that Active state has changed and is newState. newState and succeeded are read only. *action can be: running auto assembler script (ENABLE or DISABLE section), freezing and unfreezing.
  • Рубрика "Lua код сегодня" №5 (активирующий скрипт)

    Прикреплена Перенесена Статьи и видео ce lua ce aa active rec ce memrec важно обучалка
    3
    3
    0 Голоса
    3 Сообщения
    176 Просмотры
    MasterGHM
    Update: Если скрипт не запускается, то вызывать reinitializeSymbolhandler(true) Пример здесь
  • Рубрика "Lua код сегодня" №4

    Перенесена Статьи и видео ce ccode ce aa ce memrec обучалка
    4
    0 Голоса
    4 Сообщения
    181 Просмотры
    MasterGHM
    Это C - язык программирования.
  • Рубрика "Lua код сегодня" №3

    Перенесена Статьи и видео ce memrec ce aa ce lua ce .ct обучалка
    1
    2
    0 Голоса
    1 Сообщения
    88 Просмотры
    MasterGHM
    Создать пустую запись чтобы пробовать вывод названия записи через lua {$lua} print(memrec.Description) [ENABLE] print('is on') [DISABLE] print('is off') Поля memrec многочисленны и описываются в документации. См. MemoryRecord Class: в ...\Cheat Engine 6.8.3\celua.txt
  • Асинхронное выполнение сценариев

    Перенесена Статьи и видео ce .ct ce aa ce async фишки
    1
    5
    0 Голоса
    1 Сообщения
    82 Просмотры
    MasterGHM
    Записи в таблице CE представим как сценарии, которые должны выполнятся асинхронно. Т.е. они что-от делают некоторое время одновременно, например, сканируют память. При этом ничего зависает. Для этого будем актировать такую опцию Если эту опцию поставить на записи, то появляются вот такие часики АА-шные скрипты могут искать в этот момент сигнатуру. Lua скрипты потестить было интересно, узнать действительно ли асинхронно выполняется. Например, один скрипт выполняет счет, второй выполняет счет. По выполнении выводится результат. [ENABLE] {$lua} local _, counter, _, async = memrec.Description:match('(Cunt.=.)(%d*).*(Async.=.)(%w*)') memrec.Async = async == 'true' for i = 1, counter do end local currentTime = os.date("%c"):gsub('/','.') print('Finish record:' .. memrec.Description..', at time ' .. currentTime) memrec.Active = false function onMemRecPostExecute(memoryrecord, newState, succeeded) if (memoryrecord == memrec and newState == true) then memrec.Active = false end end {$asm} [DISABLE] После выполнения Если продублировать 4 скрипта, то видим, что нельзя запустить асинхронно более двух скриптов Вот такой вариант еще [ENABLE] {$Lua} function threadFunction(th) th.freeOnTerminate(false) th.Name = 'myThread' for b = 1, 200000000 do --checkSynchronize() end --while not th.Terminated do -- myvar=myvar+1 -- synchronize(function() MainForm.Caption = 'myvar '..myvar end) -- sleep(2000) --end synchronize(function() print("1") end) end --myvar=0 local myThread = createNativeThreadSuspended(threadFunction) myThread.resume() {$Asm} [DISABLE] {$Lua} if myThread then myThread.terminate() myThread.waitfor() myThread.destroy() myThread=nil end {$Asm} таблица Asynchronous testing.CT
  • Заполненение таблицы данными по базовому адресу

    Перенесена Статьи и видео фишки ce lua ce memrec ce aa
    1
    2
    0 Голоса
    1 Сообщения
    101 Просмотры
    MasterGHM
    Нажали checkbox — заполнились данные по базовому адресу Отжали checkbox — удалились данные [ENABLE] {$lua} baseAddress = 0x40000000 function FillValues(baseAddress, userValue) stringData = [[ Голод 20 Болезнь -10 Депрессия -40 Усталость 8 Ранения -28 Скрытность 6c Изготовление 84 Исследования 54 Собирательство 3c Охота b4 Рыбалка e4 Сбор cc Готовка 9c Сила 114 Ловкость fc Телосложение 144 Борьба 12c Интелект 1a4 Речь 174 Медицина 18c Знания 15c ]] -- Захват данных включая знак for name, value in stringData:gmatch('(%S+).-(%S?%x+)') do local stringPointer = '' local indexMinus = value:find('-') if indexMinus then stringPointer = string.format('[%08X - %s]', baseAddress, value:sub(indexMinus + 1)) else stringPointer = string.format('[%08X + %s]', baseAddress, value) end -- Добавить дочерний memrec -- memrec это ссылка на memrec, в котором написан этот скрипт local newMemRect = getAddressList().createMemoryRecord() newMemRect.Description = name newMemRect.Address = stringPointer newMemRect.Type = vtDword newMemRect.appendToEntry(memrec) end end \-- Запись userValue по baseAddress FillValues(baseAddress, userValue) [DISABLE] {$lua} for i = 0, memrec.Count-1 do memrec[0].destroy() end Если проще руками забить и поставить опцию раскрытия, то можно и без скрипта.
  • Управление состояниями memory record

    Перенесена Статьи и видео ce aa ce memrec фишки
    1
    0 Голоса
    1 Сообщения
    97 Просмотры
    MasterGHM
    Перехватываем состояния у checkbox memory recrod (у записи в таблицы CE) и меняем состояние активации и деактивации по другим условиям {$lua} \-- прсто инфо memrec.OnActivate = function(record, before, currentstate) print("OnActivate"..(before and "Before " or "After ")..(currentstate and "true" or "false")) return true end \-- прсто инфо memrec.OnDeactivate = function(record, before, currentstate) print("OnDeactivate"..(before and "Before " or "After ")..(currentstate and "true" or "false")) return true end \-- подмена состояния function onMemRecPostExecute(memoryrecord, newState, succeeded) if memoryrecord == memrec and newState then print('Меня активировали, но я деактивируюсь сам') memrec.Active = false end end {$asm} [ENABLE] {$lua} print('Состояния сейчас '..(memrec.Active and "true" or "false")) print('Пишу в адрес [адрес..] ... (float)10000.0') {$asm} // написать свой адрес //[адрес..]: // dd (float)10000.0 // написать свой адрес //[адрес..]: // dd (float)10000.0 // написать свой адрес //[адрес..]: // dd (float)10000.0 [DISABLE]