• Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Зарегистрироваться
    • Войти
    1. Главная
    2. MasterGH
    3. Темы
    Не в сети
    • Профиль
    • Подписки 1
    • Подписчики 1
    • Темы 110
    • Сообщения 225
    • Группы 4

    Темы

    • MasterGHM

      Сверточные сети от МФТИ (лекция)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео cnn
      1
      0 Голоса
      1 Сообщения
      94 Просмотры
      MasterGHM
      Лекция. Сверточные нейронные сети Для тех, кто давно пытается понять, что такое сверточная сеть и как она работает (для меня например) Ну еще и сюда
    • MasterGHM

      Обзор игры STELLARIS

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Не решенные Статьи и видео todo обзор игра
      7
      0 Голоса
      7 Сообщения
      330 Просмотры
      MasterGHM
      Ты можешь через CE ставить брейкпоинт. Читать регистр. Писать в него. Отпускать отладку. Память не будет меняться/палится. Но можно,скорее в его,запалить точеи останова. Перезаписывать память кода и данных через драйвер ce разово или по таймеру. В этом случае память может палиться. Тогда пробовать через CE сделать хуки на чтение памяти и возвращать оригинальные байты. погуглить про скрытие процессов, секций памяти, модулей, хуки на функции (чтение памяти, получение списка процессов...). Хук позволит функцию перенаправить на свою, изменить результат и вернуть его. посмотреть про обработку исключений в исхолниках на примере stealthmode плагина в ce
    • MasterGHM

      CE вывод списка записей и вывод свойств компонентов

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена CE Plugins ce lua ce plugin ce components userdata
      2
      2
      0 Голоса
      2 Сообщения
      179 Просмотры
      MasterGHM
      Ищем свойства userData. UserData в Lua это пользовательский тип. Точно не знаю, но я думаю в документации в CE Lua (celua.txt или здесь на офф. сайте) тип userData у всех классов или большинства классов. Например, проверим, что главная форма CE это userData тип local mainFormCE = getMainForm() print(type(mainFormCE)) > userdata (вывод из консоли) Выводим список свойств следующим образом через getmetatable функцию. Метатаблица — это особая таблица свойств Lua-переменной local mainForm = getMainForm() local listUserData = createStringlist() for k,_ in pairs(getmetatable(mainForm)) do listUserData.add(k) end local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listUserData, allowCustomInput) print ('Index: '..id..", Name: "..name) listUserData.destroy() Результат в виде списка свойство переменной mainForm Чтобы наглядно было. Свойства эти похожи на свойства из Дельфи. Можно загуглить, они поддробно описываются. Берем например свойство цвет. Прочитаем оригинальное и запишем свое любое local mainFormCE = getMainForm() print(mainFormCE.getColor()) > 536870912 -- в hex-е это 0x20000000. Можно перевести в калькуляторе или через print(string.format("%08X", 536870912)) Случайное свое впишем ради наглядного примера mainFormCE.setColor(546484)
    • MasterGHM

      Рубрика "Lua код сегодня" №5 (активирующий скрипт)

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

      CE Вывод иерархии компонентов

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена CE Plugins ce plugin ce lua ce components
      1
      1
      0 Голоса
      1 Сообщения
      140 Просмотры
      MasterGHM
      Скрипт позволит вывести иерархию компонентов CE в виде текста. Иерархия компонентов CE нужна для написания плагинов. Например, для ColorPicker и для смены шрифта (подобротнее об этом было где-то было в блоге). print("Controls list for CE "..getCEVersion()..'\n') function PrintComponents(obj, tabCount) local tabLine = string.rep(' ', tabCount) local componentCount = obj.ComponentCount if obj.Caption == nil then print(tabLine..obj.Name..'('..obj.ClassName..')') else print(tabLine..obj.Name..'('..obj.ClassName..') -> "'..obj.Caption..'"') end for i = 0, componentCount - 1 do local subObject = obj.Component[i] PrintComponents(subObject, tabCount + 1) end end PrintComponents(MainForm, 1) Результат Controls list for CE 7.4 MainForm(TMainForm) -> "Cheat Engine 7.4" Splitter1(TSplitter) Panel1(TPanel) -> "" Panel4(TPanel) -> "" advancedbutton(TSpeedButton) -> "Advanced Options" CommentButton(TSpeedButton) -> "Table Extras" lblSigned(TLabel) -> "This table has been signed by Someone" Panel5(TPanel) -> "" ProcessLabel(TLabel) -> "No Process Selected" foundcountlabel(TLabel) -> "0" ScanText(TLabel) -> "Value:" lblScanType(TLabel) -> "Scan Type" lblValueType(TLabel) -> "Value Type" LoadButton(TSpeedButton) -> "" SaveButton(TSpeedButton) -> "" Label6(TLabel) -> "Found:" SpeedButton2(TSpeedButton) -> "" SpeedButton3(TSpeedButton) -> "" btnNewScan(TButton) -> "First Scan" gbScanOptions(TGroupBox) -> "Memory Scan Options" ScanOptionsModuleList(TComboBox) Panel2(TPanel) -> "" cbCopyOnWrite(TCheckBox) -> "CopyOnWrite" cbWritable(TCheckBox) -> "Writable" cbExecutable(TCheckBox) -> "Executable" Panel3(TPanel) -> "" Label2(TLabel) -> "Stop" Label1(TLabel) -> "Start" ToAddress(TEdit) FromAddress(TEdit) Panel6(TPanel) -> "" cbFastScan(TCheckBox) -> "Fast Scan" edtAlignment(TEdit) cbPauseWhileScanning(TCheckBox) -> "Pause the game while scanning" Panel8(TPanel) -> "" rbfsmLastDigts(TRadioButton) -> "Last Digits" rbFsmAligned(TRadioButton) -> "Alignment" btnNextScan(TButton) -> "Next Scan" ScanType(TComboBox) VarType(TComboBox) ProgressBar(TProgressBar) UndoScan(TButton) -> "Undo Scan" scanvalue(TEdit) Panel7(TPanel) -> "" sbOpenProcess(TSpeedButton) -> "" btnFirst(TButton) -> "First Scan2" btnNext(TButton) -> "Next scan 2" LogoPanel(TPanel) -> "" Logo(TImage) SettingsButton(TSpeedButton) -> "Settings" pnlScanValueOptions(TPanel) -> "" rbBit(TRadioButton) -> "Bits" rbDec(TRadioButton) -> "Decimal" cbHexadecimal(TCheckBox) -> "Hex" Panel9(TPanel) -> "" pnlScanOptions(TPanel) -> "" pnlFloat(TPanel) -> "" rt3(TRadioButton) -> "Truncated" rt1(TRadioButton) -> "Rounded (default)" rt2(TRadioButton) -> "Rounded (extreme)" cbUnicode(TCheckBox) -> "UTF-16" cbCaseSensitive(TCheckBox) -> "Case sensitive" cbFloatSimple(TCheckBox) -> "Simple values only" cbpercentage(TCheckBox) -> "Percent" cbNot(TCheckBox) -> "Not" cbCodePage(TCheckBox) -> "Codepage" cbRepeatUntilStopped(TCheckBox) -> "Repeat" cbLuaFormula(TCheckBox) -> "Lua formula" cbNewLuaState(TCheckBox) -> "Separate Lua state" Panel10(TPanel) -> "" cbUnrandomizer(TCheckBox) -> "Unrandomizer" cbSpeedhack(TCheckBox) -> "Enable Speedhack" Panel14(TPanel) -> "" Label54(TLabel) -> "Speed" lblSH0(TLabel) -> "0" lblSH20(TLabel) -> "500" btnSetSpeedhack2(TButton) -> "Apply" editSH2(TEdit) tbSpeed(TTrackBar) scanvalue2(TEdit) ScanText2(TLabel) -> "Scan Value" andlabel(TLabel) -> "and" Foundlist3(TListView) (TCustomListViewEditor) btnAddAddressManually(TButton) -> "Add Address Manually" btnMemoryView(TButton) -> "Memory View" cbCompareToSavedScan(TCheckBox) -> "Compare to first/saved scan" lblcompareToSavedScan(TLabel) -> "<xxxx>" UpdateTimer(TTimer) FreezeTimer(TTimer) PopupMenu2(TPopupMenu) (TMenuItem) -> "" (TMenuItem) -> "Add to new group" miAutoAssembleErrorMessage(TMenuItem) -> "<Error message here>" Deletethisrecord1(TMenuItem) -> "Delete this record" Change1(TMenuItem) -> "Change record" Description1(TMenuItem) -> "Description" Address1(TMenuItem) -> "Address" Type1(TMenuItem) -> "Type" Value1(TMenuItem) -> "Value" miUndoValue(TMenuItem) -> "Undo last edit" Smarteditaddresses1(TMenuItem) -> "Smart edit address(es)" Browsethismemoryregion1(TMenuItem) -> "Browse this memory region" miDisassemble(TMenuItem) -> "Disassemble this memory region" miShowAsSigned(TMenuItem) -> "Show as signed" Showashexadecimal1(TMenuItem) -> "Show as hexadecimal" miZeroTerminate(TMenuItem) -> "Zero-Terminate string" miShowAsBinary(TMenuItem) -> "Show as binary" miChangeColor(TMenuItem) -> "Change Color" SetHotkey1(TMenuItem) -> "Assign Hotkey" miSetDropdownOptions(TMenuItem) -> "Set/Change dropdown selection options" Freezealladdresses2(TMenuItem) -> "Toggle Selected Records" miFreezePositive(TMenuItem) -> "Freeze Positive" miFreezeNegative(TMenuItem) -> "Freeze Negative" Changescript1(TMenuItem) -> "Change script" miAsyncScript(TMenuItem) -> "Execute asynchronous" N5(TMenuItem) -> "-" miGeneratePointermap(TMenuItem) -> "Generate pointermap" Pointerscanforthisaddress1(TMenuItem) -> "Pointer scan for this address" Findoutwhataccessesthisaddress1(TMenuItem) -> "Find out what accesses this address" Setbreakpoint1(TMenuItem) -> "Find out what writes to this address" sep2(TMenuItem) -> "-" miDBVMFindWhatWritesOrAccesses(TMenuItem) -> "DBVM Find out what writes or accesses this address" sep1(TMenuItem) -> "-" Calculatenewvaluepart21(TMenuItem) -> "Recalculate new addresses" Forcerechecksymbols1(TMenuItem) -> "Force recheck symbols" N4(TMenuItem) -> "-" Cut1(TMenuItem) -> "Cut" Copy1(TMenuItem) -> "Copy" Paste1(TMenuItem) -> "Paste" MenuItem1(TMenuItem) -> "Select All" N1(TMenuItem) -> "-" CreateGroup(TMenuItem) -> "Create Header" miGroupconfig(TMenuItem) -> "Group config" miHideChildren(TMenuItem) -> "Hide children when deactivated" miBindActivation(TMenuItem) -> "Activating this entry activates it's children" miBindDeactivation(TMenuItem) -> "Deactivating this entry deactivates it's children" miRecursiveSetValue(TMenuItem) -> "Setting a value to this entry sets same value to children" miAllowCollapse(TMenuItem) -> "Allow left and right arrow keys to collapse and expand" miManualExpandCollapse(TMenuItem) -> "Manual expand/collapse" miAlwaysHideChildren(TMenuItem) -> "Always hide children" Plugins1(TMenuItem) -> "Plugins" foundlistpopup(TPopupMenu) (TMenuItem) -> "" miAddAddress(TMenuItem) -> "Add selected addresses to the addresslist" miChangeValue(TMenuItem) -> "Change value of selected addresses" miChangeValueBack(TMenuItem) -> "Change value of selected addresses back to previous/saved value" Browsethismemoryarrea1(TMenuItem) -> "Browse this memory region" Browsethismemoryregioninthedisassembler1(TMenuItem) -> "Disassemble this memory region" Removeselectedaddresses1(TMenuItem) -> "Remove selected addresses" Copyselectedaddresses1(TMenuItem) -> "Copy selected addresses" Selectallitems1(TMenuItem) -> "Select all items" MenuItem4(TMenuItem) -> "-" miShowPreviousValue(TMenuItem) -> "Show previous value column(s)" miOnlyShowCurrentCompareToColumn(TMenuItem) -> "Only show current "compare to" column" MenuItem13(TMenuItem) -> "-" miForgotScan(TMenuItem) -> "Reload the previous value list (Forgot value scan)" MenuItem14(TMenuItem) -> "-" miFlFindWhatAccesses(TMenuItem) -> "Find out what accesses this address" miFlFindWhatWrites(TMenuItem) -> "Find out what writes to this address" N2(TMenuItem) -> "-" miFoundListPreferences(TMenuItem) -> "Preferences" MenuItem19(TMenuItem) -> "-" miDisplayHex(TMenuItem) -> "Hexadecimal" miDisplayDefault(TMenuItem) -> "Default" miDisplayByte(TMenuItem) -> "Byte" miDisplay2Byte(TMenuItem) -> "2 Bytes" miDisplay4Byte(TMenuItem) -> "4 Bytes" miDisplay8Byte(TMenuItem) -> "8 Bytes" miDisplayFloat(TMenuItem) -> "Float" miDisplayDouble(TMenuItem) -> "Double" OpenDialog1(TOpenDialog) SaveDialog1(TSaveDialog) TopDisabler(TTimer) emptypopup(TPopupMenu) (TMenuItem) -> "" MenuItem2(TMenuItem) -> "New Item1" ccpmenu(TPopupMenu) (TMenuItem) -> "" Cut2(TMenuItem) -> "Cut" Copy2(TMenuItem) -> "Copy" Paste2(TMenuItem) -> "Paste" ActionList1(TActionList) actSave(TAction) -> "" actOpen(TAction) -> "" actAutoAssemble(TAction) -> "actAutoAssemble" actMemoryView(TAction) -> "actMemoryView" actOpenProcesslist(TAction) -> "" actOpenDissectStructure(TAction) -> "actOpenDissectStructure" actOpenLuaEngine(TAction) -> "actOpenLuaEngine" UpdateFoundlisttimer(TTimer) AutoAttachTimer(TTimer) MainMenu1(TMainMenu) (TMenuItem) -> "" (TMenuItem) -> "English" (TMenuItem) -> "Save scan session" (TMenuItem) -> "Load scan session" (TMenuItem) -> "-" File1(TMenuItem) -> "&File" miAddTab(TMenuItem) -> "Add scan tab" New1(TMenuItem) -> "Clear list" MenuItem8(TMenuItem) -> "Open Process" miOpenFile(TMenuItem) -> "Open File" miSaveFile(TMenuItem) -> "Save File" N7(TMenuItem) -> "-" miSave(TMenuItem) -> "Save" Save1(TMenuItem) -> "Save As..." Load1(TMenuItem) -> "Load" miLoadRecent(TMenuItem) -> "Load Recent" miSignTable(TMenuItem) -> "Sign table" MenuItem3(TMenuItem) -> "-" miSaveScanresults(TMenuItem) -> "Save current scanresults" miDeleteSavedScanResults(TMenuItem) -> "Delete scanresult" MenuItem6(TMenuItem) -> "-" MenuItem9(TMenuItem) -> "Generate generic trainer lua script from table" MenuItem5(TMenuItem) -> "-" MenuItem7(TMenuItem) -> "Quit" Edit3(TMenuItem) -> "&Edit" Settings1(TMenuItem) -> "Settings" Process1(TMenuItem) -> "&Process" OpenProcess1(TMenuItem) -> "Open Process window" CreateProcess1(TMenuItem) -> "Create Process" N6(TMenuItem) -> "-" a1(TMenuItem) -> "a" b1(TMenuItem) -> "b" c1(TMenuItem) -> "c" d1(TMenuItem) -> "d" e1(TMenuItem) -> "e" miTable(TMenuItem) -> "Table" miShowLuaScript(TMenuItem) -> "Show Cheat Table Lua Script" MenuItem10(TMenuItem) -> "-" miCreateLuaForm(TMenuItem) -> "Create form" miResyncFormsWithLua(TMenuItem) -> "Resynchronize forms with Lua" miLuaFormsSeperator(TMenuItem) -> "-" miAddFile(TMenuItem) -> "Add file" mi3d(TMenuItem) -> "D3D" miHookD3D(TMenuItem) -> "Hook Direct3D" MenuItem11(TMenuItem) -> "-" miSetCrosshair(TMenuItem) -> "Set custom crosshair" miWireframe(TMenuItem) -> "Toggle wireframe mode" miZbuffer(TMenuItem) -> "Toggle disabled zbuffer" miLockMouseInGame(TMenuItem) -> "Lock mouse in game window" miSetupSnapshotKeys(TMenuItem) -> "Start and configure snapshot recording" miSnapshothandler(TMenuItem) -> "Snapshot handler" ools1(TMenuItem) -> "&Tools" miDotNET(TMenuItem) -> ".Net" miGetDotNetObjectList(TMenuItem) -> "Get object list" miNetwork(TMenuItem) -> "Network" miCompression(TMenuItem) -> "Compression" miScanDirtyOnly(TMenuItem) -> "Scan changed regions only" miScanPagedOnly(TMenuItem) -> "Scan paged (physical) memory only" Plugins2(TMenuItem) -> "P&lugins" miLanguages(TMenuItem) -> "Languages" miHelp(TMenuItem) -> "&Help" Helpindex1(TMenuItem) -> "Cheat Engine Help" miLuaDocumentation(TMenuItem) -> "Lua documentation" miTutorial(TMenuItem) -> "Cheat Engine Tutorial" MenuItem12(TMenuItem) -> "Cheat Engine Tutorial (64-Bit)" MenuItem15(TMenuItem) -> "Cheat Engine Tutorial Games" miEnableLCLDebug(TMenuItem) -> "Generate errorlogs" N8(TMenuItem) -> "-" miAbout(TMenuItem) -> "About" pmTablist(TPopupMenu) (TMenuItem) -> "" miRenameTab(TMenuItem) -> "Rename" miTablistSeperator(TMenuItem) -> "-" miCloseTab(TMenuItem) -> "Close tab" pmValueType(TPopupMenu) (TMenuItem) -> "" miDefineNewCustomType(TMenuItem) -> "Define new custom type (Auto Assembler)" miDefineNewCustomTypeLua(TMenuItem) -> "Define new custom type (LUA)" miEditCustomType(TMenuItem) -> "Edit selected custom type" miDeleteCustomType(TMenuItem) -> "Delete selected custom type" miShowCustomTypeDebug(TMenuItem) -> "Show custom type debug info" ColorDialog1(TColorDialog) pmResetRange(TPopupMenu) (TMenuItem) -> "" miResetRange(TMenuItem) -> "Reset range" pmScanRegion(TPopupMenu) (TMenuItem) -> "" miPresetAll(TMenuItem) -> "Preset: Scan all memory" miPresetWritable(TMenuItem) -> "Preset: Scan writable memory" MainMenu2(TMainMenu) (TMenuItem) -> "" tLuaGCPassive(TTimer) tLuaGCActive(TTimer) mfImageList(TImageList) frmAutoInject(TfrmAutoInject) -> "Lua script: Cheat Table" Panel1(TPanel) -> "" Panel3(TPanel) -> "" btnExecute(TButton) -> "Execute script" Panel2(TPanel) -> "" MainMenu1(TMainMenu) (TMenuItem) -> "" File1(TMenuItem) -> "File" miNewWindow(TMenuItem) -> "New Window" miNewTab(TMenuItem) -> "New Tab" Load1(TMenuItem) -> "Open" Save1(TMenuItem) -> "Save" SaveAs1(TMenuItem) -> "Save As..." miLuaSyntaxCheck(TMenuItem) -> "Syntax Check" Assigntocurrentcheattable1(TMenuItem) -> "Assign to current cheat table" N2(TMenuItem) -> "-" Exit1(TMenuItem) -> "Exit" View1(TMenuItem) -> "View" Syntaxhighlighting1(TMenuItem) -> "Syntax highlighting" MenuItem3(TMenuItem) -> "Auto assembler syntax highlighting preferences" MenuItem2(TMenuItem) -> "Lua syntax highlighting preferences" MenuItem1(TMenuItem) -> "C highlighting preferences" AAPref1(TMenuItem) -> "Preferences" emplate1(TMenuItem) -> "Template" Codeinjection1(TMenuItem) -> "Code injection" APIHook1(TMenuItem) -> "API Hook" Coderelocation1(TMenuItem) -> "Code relocation" miCallLua(TMenuItem) -> "Call CE lua function" menuAOBInjection(TMenuItem) -> "AOB Injection" menuFullInjection(TMenuItem) -> "Full Injection" CheatTablecompliantcodee1(TMenuItem) -> "Cheat Table framework code" Inject1(TMenuItem) -> "Inject" Injectincurrentprocess1(TMenuItem) -> "Inject into current process" Injectintocurrentprocessandexecute1(TMenuItem) -> "Inject into current process and execute" OpenDialog1(TOpenDialog) SaveDialog1(TSaveDialog) PopupMenu1(TPopupMenu) (TMenuItem) -> "" miCut(TMenuItem) -> "Cu&t" miCopy(TMenuItem) -> "&Copy" miPaste(TMenuItem) -> "&Paste" miUndo(TMenuItem) -> "&Undo" miRedo(TMenuItem) -> "Redo" N6(TMenuItem) -> "-" miFind(TMenuItem) -> "&Find..." mifindNext(TMenuItem) -> "Find Next" mifindPrevious(TMenuItem) -> "Find Previous" miReplace(TMenuItem) -> "Replace" TabMenu(TPopupMenu) (TMenuItem) -> "" miMoveLeft(TMenuItem) -> "Move left" miMoveRight(TMenuItem) -> "Move right" miRenameTab(TMenuItem) -> "Rename" Close1(TMenuItem) -> "Close" FindDialog1(TFindDialog) undotimer(TTimer) ReplaceDialog1(TReplaceDialog) aaImageList(TImageList) (TSynAASyn) (TSynCppSyn) (TSynLuaSyn) Assemblescreen(TSynEditPlus) (TSynBeautifier) SynLeftGutterPartList1(TSynGutterPartList) SynGutterMarks1(TSynGutterMarks) SynGutterLineNumber1(TSynGutterLineNumber) SynGutterChanges1(TSynGutterChanges) SynGutterSeparator1(TSynGutterSeparator) SynGutterCodeFolding1(TSynGutterCodeFolding) SynRightGutterPartList1(TSynRightGutterPartList) (TTimer) (TAddresslist) -> "" List(TTreeviewWithScroll) (TTimer) (TTimer) Header(THeaderControl) (TPopupMenu) (TMenuItem) -> "" (TMenuItem) -> "Sort on click" (TTimer)
    • MasterGHM

      Рубрика "Lua код сегодня" №4

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео ce ccode ce aa ce memrec обучалка
      4
      0 Голоса
      4 Сообщения
      238 Просмотры
      MasterGHM
      Это C - язык программирования.
    • MasterGHM

      Рубрика "Lua код сегодня" №3

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

      Асинхронное выполнение сценариев

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео ce .ct ce aa ce async фишки
      1
      5
      0 Голоса
      1 Сообщения
      123 Просмотры
      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
    • MasterGHM

      Рубрика "Lua код сегодня" №2

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео ce lua обучалка
      1
      2
      0 Голоса
      1 Сообщения
      95 Просмотры
      MasterGHM
      local address = 0x0170A490 local x, y, z = 0, 100, 100 writeDouble(address, x) writeDouble(address + 8, y) writeDouble(address + 16, z) Данный код позволяет записать значение координат и переместить персонажа. Обычно, адреса координат идут последовательно x,y,z и имеют тип float или double. Чтобы переместить персонажа нужно узнать его адрес координат и выполнить код в Lua консоли И убедиться, что данные записались в память процесса Далее мы с вами будем очень много программировать короткими примерами в консоли управляя данными процесса и в том числе связывать это с базами данных. Например, такой-то пользователь, для такого-то персонажа создал таблицу телепортации с локациями и координатами. Этой таблицей можно будет очень удобно пользоваться. Также вы изучите принцип программирования, который используется при работе с СУБД.
    • MasterGHM

      Делаем EFLAGS таблицу

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео шаблоны фишки ce lua
      3
      2
      0 Голоса
      3 Сообщения
      154 Просмотры
      MasterGHM
      Ответил
    • MasterGHM

      Выход из рутины до ближайшего цикла

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео шаблоны ce lua фишки
      1
      1
      0 Голоса
      1 Сообщения
      97 Просмотры
      MasterGHM
      собенности переход на следующий адрес по инструкциям ветвления вычисляется Lua кодом по ret, jmp, jmp condition до исполнения кода определение опкодов ветвления по readmem без дизассемблериования по тестам последний брейкпоинт снимается на ближайшем цикле Пример лога до близжайшего цикла, когда поднимается из рутины вверх > RET :00454684 - C3 - ret > -->> :0045468C - 5B - pop ebx > RET :0045468F - C3 - ret > -->> :00454695 - C3 - ret > RET :00454695 - C3 - ret > -->> :00437F36 - 5B - pop ebx > RET :00437F37 - C3 - ret > -->> :004272EB - 5B - pop ebx > RET :004272EC - C3 - ret > -->> :004273E9 - 5E - pop esi > RET :004273EA - C3 - ret > -->> :00437A2E - 5F - pop edi > RET :00437A34 - C3 - ret > -->> :0043B749 - 5B - pop ebx > RET :0043B74D - C3 - ret > -->> :00427195 - 5F - pop edi > RET :00427198 - C3 - ret > -->> :004376BB - 8B 45 FC - mov eax,[ebp-04] > RET :004376C2 - C2 0400 - ret 0004 > -->> :0043B880 - 89 46 0C - mov [esi+0C],eax > RET :0043B88A - C3 - ret > -->> :0043BFF4 - 84 C0 - test al,al > isCJMP :0043BFF6 - 75 09 - jne 0043C001 > RET :0043C003 - C3 - ret > -->> :0044DFAD - 5E - pop esi > RET :0044DFAF - C3 - ret > -->> :00437A2E - 5F - pop edi \--[[ Версия: 0.01.b1 Выход из рутины до близжайшего цикла ]]-- mainAddress = 0x0045B5A4 -- адрес некоторого параметра в игре nextAddress = nil is64bits = targetIs64Bit() tableInstruction ={} tableBreakpointsAddress ={} function ContaintsBeakPoint(address) for i = 1, #tableBreakpointsAddress do if tableBreakpointsAddress[i] == address then return true end end return false end \-- Возвращает адрес по ret function GetNextAddressFromRET(address) if is64bits then nextAddress = readPointer(RSP) else nextAddress = readPointer(ESP) end return nextAddress end \-- Возвращает адрес по Jmp function GetNextAddressFromJMP(address) local disassembledstring = nil if is64bits then local disassembledstring = disassemble(RIP) else local disassembledstring = disassemble(EIP) end local _, opcode, _, _ = splitDisassembledString(disassembledstring) return GetAddressFromOpcode(opcode) end function ToBits(num, bits) local t = {} for b = bits, 1, -1 do rest = math.fmod(num,2) t[b] = math.floor(rest) num = (num-rest)/2 end if num == 0 then return t else return {'Not enough bits to represent this number'} end end function GetEFLAGS() local bitsTable = ToBits(EFLAGS, 16) local tableEFLAGS = { OF = bitsTable[17-12], DF = bitsTable[17-11], SF = bitsTable[17-8], ZF = bitsTable[17-7], AF = bitsTable[17-5], PF = bitsTable[17-3], CF = bitsTable[17-1] } --for k,v in pairs(tableEFLAGS) do -- print (k..' = '..v) --end -- --print(EFLAGS) --local s = '' --for i=1,#bitsTable do -- s = s..bitsTable[i] --end --print(s) return tableEFLAGS end \-- Возвращает адрес из опкода jmp dword ptr [edi*4+07895D88] или jmp 07895D88 \--print(string.format('%08X', newAddress)) function GetAddressFromOpcode (opcode) local rightLine = string.match(opcode, '%S*%s*(%S*)') local isPointer = string.match(opcode, '%[') if isPointer then rightLine = string.match(opcode, '%[(.*)%]') --00454664 - 8B 83 60030000 - mov eax,[ebx+00000360] if string.match(opcode, 'eax') then rightLine = string.gsub(rightLine, 'eax', EAX) end if string.match(opcode, 'ebx') then rightLine = string.gsub(rightLine, 'ebx', EBX) end if string.match(opcode, 'ecx') then rightLine = string.gsub(rightLine, 'ecx', ECX) end if string.match(opcode, 'edx') then rightLine = string.gsub(rightLine, 'edx', EDX) end if string.match(opcode, 'esi') then rightLine = string.gsub(rightLine, 'esi', ESI) end if string.match(opcode, 'edi') then rightLine = string.gsub(rightLine, 'edi', EDI) end if string.match(opcode, 'esp') then rightLine = string.gsub(rightLine, 'esp', ESP) end if string.match(opcode, 'ebp') then rightLine = string.gsub(rightLine, 'ebp', EBP) end if is64bits then if string.match(opcode, 'rax') then rightLine = string.gsub(rightLine, 'rax', RAX) end if string.match(opcode, 'rbx') then rightLine = string.gsub(rightLine, 'rbx', RBX) end if string.match(opcode, 'rcx') then rightLine = string.gsub(rightLine, 'rcx', RCX) end if string.match(opcode, 'rdx') then rightLine = string.gsub(rightLine, 'rdx', RDX) end if string.match(opcode, 'rsi') then rightLine = string.gsub(rightLine, 'rsi', RSI) end if string.match(opcode, 'rdi') then rightLine = string.gsub(rightLine, 'rdi', RDI) end if string.match(opcode, 'rsp') then rightLine = string.gsub(rightLine, 'rsp', RSP) end if string.match(opcode, 'rbp') then rightLine = string.gsub(rightLine, 'rbp', RBP) end if string.match(opcode, 'r8') then rightLine = string.gsub(rightLine, 'r8', R8) end if string.match(opcode, 'r9') then rightLine = string.gsub(rightLine, 'r9', R9) end if string.match(opcode, 'r10') then rightLine = string.gsub(rightLine, 'r10', R10) end if string.match(opcode, 'r11') then rightLine = string.gsub(rightLine, 'r11', R11) end if string.match(opcode, 'r12') then rightLine = string.gsub(rightLine, 'r12', R12) end if string.match(opcode, 'r13') then rightLine = string.gsub(rightLine, 'r13', R13) end if string.match(opcode, 'r14') then rightLine = string.gsub(rightLine, 'r14', R14) end if string.match(opcode, 'r15') then rightLine = string.gsub(rightLine, 'r15', R15) end end return getAddress('%['..rightLine..'%]') end return getAddress(rightLine) end \-- Возвращает адрес по Jmp condition, когда тот выполняется или не выполняется function GetNextAddressFromConditionJMP(address, size) local _,opcode,_,_ = splitDisassembledString(disassemble(address)) local leftString = string.match(opcode, '%S*') local eflags = GetEFLAGS() if (leftString == 'jnz' or leftString == 'jne') then if eflags.ZF == 0 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'je' or leftString == 'jz') then if eflags.ZF == 1 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jg' or leftString == 'jnle') then if eflags.ZF == 0 and eflags.SF == eflags.OF then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jb' or leftString == 'jc' or leftString == 'jnae') then if eflags.CF == 1 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jae') then if eflags.CF == 0 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'ja') then if eflags.CF == 0 and eflags.ZF == 0 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jbe') then if eflags.CF == 1 and eflags.ZF == 1 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jl' or leftString == 'jnge') then if eflags.SF ~= eflags.OF then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jle' or leftString == 'jng') then if eflags.ZF == 1 or eflags.SF ~= eflags.OF then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jna') then if eflags.CF == 1 or eflags.ZF == 1 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jc') then if eflags.CF == 1 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jp' or leftString == 'jpe') then if eflags.PF == 1 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jnp' or leftString == 'jpo') then if eflags.PF == 0 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jnb' or leftString == 'jnc') then if eflags.CF == 0 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jnbe') then if eflags.CF == 0 and eflags.ZF == 0 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jno') then if eflags.OF == 0 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jns') then if eflags.SF == 0 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jo') then if eflags.OF == 1 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'js') then if eflags.SF == 1 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jge' or leftString == 'jnl') then if eflags.CF == 1 and eflags.OF == 1 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jrcxz') then if RCX == 0 then return GetAddressFromOpcode(opcode) end elseif (leftString == 'jecxz') then if ECX == 0 then return GetAddressFromOpcode(opcode) end end return address + size end function IsRet(address) local value = readBytes(address,1, false) return value == 0xC3 or value == 0xCB or value == 0xC2 or value == 0xCA end function IsCall(address) local value = readBytes(address,1, false) return value == 0xFF or value == 0xE8 -- or value == 0x9A end function IsJMP(address) local value = readBytes (address, 1, false) if value == 0xFF then if readBytes (address + 1, 1, false) == 05 then return false end end return value == 0xEB or value == 0xE9 or value == 0xFF -- or value == 0xEA \--[[ 078921A8 - EB 38 - jmp 078921E2 0789242D - E9 E2000000 - jmp 07892514 07894F4C - FF E2 - jmp edx 07895C67 - FF 24 BD 885D8907 - jmp dword ptr [edi*4+07895D88] ]]-- end function IsConditionJMP(address) local value = readBytes (address, 1, false) return value == 0x77 or value == 0x73 or value == 0x72 or value == 0x76 or value == 0xE3 or value == 0x74 or value == 0x7F or value == 0x7D or value == 0x7C or value == 0x7E or value == 0x75 or value == 0x71 or value == 0x7B or value == 0x79 or value == 0x70 or value == 0x7A or value == 0x78 or value == 0x0F end \-- Возвращает адрес, на который, будет прыжок function GetNextAddress(addressXIP) -- Определить на какой инструкции мы находимся, чтобы узнать на какую следующу инструкцию ставить бряк -- ret - прыжок по смещению ESP/RSP -- jmp - прыжок без условия -- je, jne, jxx - прыжок с улосвием -- Определить размер инструкции, тип инструкции на текущем addressXIP local findIndex = -1 for i = 1, #tableInstruction do if tableInstruction[i].XIP == addressXIP then findIndex = i break end end local size = 0 local isRet = false local isJMP = false local isCJMP = false if findIndex == -1 then -- Если нет данных ---------------- ЗАПОМИНАТЬ РАЗМЕР ИНСТРУКЦИИ (чтобы не дизассемблировать повторно) size = getInstructionSize(addressXIP) isRet = IsRet(addressXIP) isJMP = IsJMP(addressXIP) isCJMP = IsConditionJMP(addressXIP) table.insert(tableInstruction, {XIP = addressXIP, SIZE = size, ISRET = isRet, ISJMP = isJMP, ISCJMP = isCJMP}) else -- Если данные есть size = tableInstruction[findIndex].SIZE isRet = tableInstruction[findIndex].ISRET isJMP = tableInstruction[findIndex].ISJMP isCJMP = tableInstruction[findIndex].ISCJMP end --------------- if isRet then print('> RET :' ..disassemble(nextAddress)) nextAddress = GetNextAddressFromRET(addressXIP) print('> -->> :' ..disassemble(nextAddress)) elseif isJMP then print('> isJMP :' ..disassemble(nextAddress)) nextAddress = GetNextAddressFromJMP(addressXIP) elseif isCJMP then print('> isCJMP :' ..disassemble(nextAddress)) nextAddress = GetNextAddressFromConditionJMP(addressXIP, size) else nextAddress = addressXIP + size end return nextAddress end function debugger_onBreakpoint() local isContaintsBreakPoint = false -- Удалить прошлый брейкпоинт if(nextAddress ~= nil) then isContaintsBreakPoint = ContaintsBeakPoint(nextAddress) if isContaintsBreakPoint then debug_removeBreakpoint(nextAddress) end end -- Поставить брейкпоинт на следующую инструкцию не входя в call-ы local XIP = 0 if is64bits then XIP = EIP else XIP = RIP end nextAddress = GetNextAddress(XIP) if not ContaintsBeakPoint(nextAddress) then debug_setBreakpoint(nextAddress, 1, bptExecute, bpmDebugRegister) table.insert(tableBreakpointsAddress, nextAddress) end return 1 --1 не показывать дизассемблер end if getOpenedProcessID() == 0 then openProcess('test.exe') end \--bptWrite \--bptAccess debug_removeBreakpoint() debug_setBreakpoint(mainAddress, 4, bptWrite, bpmDebugRegister) Справка 77 cb JA rel8 D Valid Valid Jump short if above (CF=0 and ZF=0). 73 cb JAE rel8 D Valid Valid Jump short if above or equal (CF=0). 72 cb JB rel8 D Valid Valid Jump short if below (CF=1). 76 cb JBE rel8 D Valid Valid Jump short if below or equal (CF=1 or ZF=1). 72 cb JC rel8 D Valid Valid Jump short if carry (CF=1). E3 cb JCXZ rel8 D N.E. Valid Jump short if CX register is 0. E3 cb JECXZ rel8 D Valid Valid Jump short if ECX register is 0. E3 cb JRCXZ rel8 D Valid N.E. Jump short if RCX register is 0. 74 cb JE rel8 D Valid Valid Jump short if equal (ZF=1). 7F cb JG rel8 D Valid Valid Jump short if greater (ZF=0 and SF=OF). 7D cb JGE rel8 D Valid Valid Jump short if greater or equal (SF=OF). 7C cb JL rel8 D Valid Valid Jump short if less (SF≠ OF). 7E cb JLE rel8 D Valid Valid Jump short if less or equal (ZF=1 or SF≠ OF). 76 cb JNA rel8 D Valid Valid Jump short if not above (CF=1 or ZF=1). 72 cb JNAE rel8 D Valid Valid Jump short if not above or equal (CF=1). 73 cb JNB rel8 D Valid Valid Jump short if not below (CF=0). 77 cb JNBE rel8 D Valid Valid Jump short if not below or equal (CF=0 andZF=0). 73 cb JNC rel8 D Valid Valid Jump short if not carry (CF=0). 75 cb JNE rel8 D Valid Valid Jump short if not equal (ZF=0). 7E cb JNG rel8 D Valid Valid Jump short if not greater (ZF=1 or SF≠ OF). 7C cb JNGE rel8 D Valid Valid Jump short if not greater or equal (SF≠ OF). 7D cb JNL rel8 D Valid Valid Jump short if not less (SF=OF). 7F cb JNLE rel8 D Valid Valid Jump short if not less or equal (ZF=0 and SF=OF). 71 cb JNO rel8 D Valid Valid Jump short if not overflow (OF=0). 7B cb JNP rel8 D Valid Valid Jump short if not parity (PF=0). 79 cb JNS rel8 D Valid Valid Jump short if not sign (SF=0). 75 cb JNZ rel8 D Valid Valid Jump short if not zero (ZF=0). 70 cb JO rel8 D Valid Valid Jump short if overflow (OF=1). 7A cb JP rel8 D Valid Valid Jump short if parity (PF=1). 7A cb JPE rel8 D Valid Valid Jump short if parity even (PF=1). 7B cb JPO rel8 D Valid Valid Jump short if parity odd (PF=0). 78 cb JS rel8 D Valid Valid Jump short if sign (SF=1). 74 cb JZ rel8 D Valid Valid Jump short if zero (ZF = 1). 0F 87 cw JA rel16 D N.S. Valid Jump near if above (CF=0 and ZF=0). Not supported in 64-bit mode. 0F 87 cd JA rel32 D Valid Valid Jump near if above (CF=0 and ZF=0). 0F 83 cw JAE rel16 D N.S. Valid Jump near if above or equal (CF=0). Not supported in 64-bit mode. 0F 83 cd JAE rel32 D Valid Valid Jump near if above or equal (CF=0). 0F 82 cw JB rel16 D N.S. Valid Jump near if below (CF=1). Not supported in 64-bit mode. 0F 82 cd JB rel32 D Valid Valid Jump near if below (CF=1). 0F 86 cw JBE rel16 D N.S. Valid Jump near if below or equal (CF=1 or ZF=1). Not supported in 64-bit mode. 0F 86 cd JBE rel32 D Valid Valid Jump near if below or equal (CF=1 or ZF=1). 0F 82 cw JC rel16 D N.S. Valid Jump near if carry (CF=1). Not supported in 64-bit mode. 0F 82 cd JC rel32 D Valid Valid Jump near if carry (CF=1). 0F 84 cw JE rel16 D N.S. Valid Jump near if equal (ZF=1). Not supported in 64-bit mode. 0F 84 cd JE rel32 D Valid Valid Jump near if equal (ZF=1). 0F 84 cw JZ rel16 D N.S. Valid Jump near if 0 (ZF=1). Not supported in 64-bit mode. 0F 84 cd JZ rel32 D Valid Valid Jump near if 0 (ZF=1). 0F 8F cw JG rel16 D N.S. Valid Jump near if greater (ZF=0 and SF=OF). Notsupported in 64-bit mode. 0F 8F cd JG rel32 D Valid Valid Jump near if greater (ZF=0 and SF=OF). 0F 8D cw JGE rel16 D N.S. Valid Jump near if greater or equal (SF=OF). Not supported in 64-bit mode. 0F 8D cd JGE rel32 D Valid Valid Jump near if greater or equal (SF=OF). 0F 8C cw JL rel16 D N.S. Valid Jump near if less (SF≠ OF). Not supported in 64-bit mode. 0F 8C cd JL rel32 D Valid Valid Jump near if less (SF≠ OF). 0F 8E cw JLE rel16 D N.S. Valid Jump near if less or equal (ZF=1 or SF≠ OF). Not supported in 64-bit mode. 0F 8E cd JLE rel32 D Valid Valid Jump near if less or equal (ZF=1 or SF≠ OF). 0F 86 cw JNA rel16 D N.S. Valid Jump near if not above (CF=1 or ZF=1). Not supported in 64-bit mode. 0F 86 cd JNA rel32 D Valid Valid Jump near if not above (CF=1 or ZF=1). 0F 82 cw JNAE rel16 D N.S. Valid Jump near if not above or equal (CF=1). Not supported in 64-bit mode. 0F 82 cd JNAE rel32 D Valid Valid Jump near if not above or equal (CF=1). 0F 83 cw JNB rel16 D N.S. Valid Jump near if not below (CF=0). Not supported in 64-bit mode. 0F 83 cd JNB rel32 D Valid Valid Jump near if not below (CF=0). 0F 87 cw JNBE rel16 D N.S. Valid Jump near if not below or equal (CF=0 and ZF=0). Not supported in 64-bit mode. 0F 87 cd JNBE rel32 D Valid Valid Jump near if not below or equal (CF=0 and ZF=0). 0F 83 cw JNC rel16 D N.S. Valid Jump near if not carry (CF=0). Not supported in 64-bit mode. 0F 83 cd JNC rel32 D Valid Valid Jump near if not carry (CF=0). 0F 85 cw JNE rel16 D N.S. Valid Jump near if not equal (ZF=0). Not supported in 64-bit mode. 0F 85 cd JNE rel32 D Valid Valid Jump near if not equal (ZF=0). 0F 8E cw JNG rel16 D N.S. Valid Jump near if not greater (ZF=1 or SF≠ OF). Not supported in 64-bit mode. 0F 8E cd JNG rel32 D Valid Valid Jump near if not greater (ZF=1 or SF≠ OF). 0F 8C cw JNGE rel16 D N.S. Valid Jump near if not greater or equal (SF≠ OF). Not supported in 64-bit mode. 0F 8C cd JNGE rel32 D Valid Valid Jump near if not greater or equal (SF≠ OF). 0F 8D cw JNL rel16 D N.S. Valid Jump near if not less (SF=OF). Not supported in 64-bit mode. 0F 8D cd JNL rel32 D Valid Valid Jump near if not less (SF=OF). 0F 8F cw JNLE rel16 D N.S. Valid Jump near if not less or equal (ZF=0 and SF=OF). Not supported in 64-bit mode. 0F 8F cd JNLE rel32 D Valid Valid Jump near if not less or equal (ZF=0 and SF=OF). 0F 81 cw JNO rel16 D N.S. Valid Jump near if not overflow (OF=0). Not supported in 64-bit mode. 0F 81 cd JNO rel32 D Valid Valid Jump near if not overflow (OF=0). 0F 8B cw JNP rel16 D N.S. Valid Jump near if not parity (PF=0). Not supported in 64-bit mode. 0F 8B cd JNP rel32 D Valid Valid Jump near if not parity (PF=0). 0F 89 cw JNS rel16 D N.S. Valid Jump near if not sign (SF=0). Not supported in 64-bit mode. 0F 89 cd JNS rel32 D Valid Valid Jump near if not sign (SF=0). 0F 85 cw JNZ rel16 D N.S. Valid Jump near if not zero (ZF=0). Not supported in 64-bit mode. 0F 85 cd JNZ rel32 D Valid Valid Jump near if not zero (ZF=0). 0F 80 cw JO rel16 D N.S. Valid Jump near if overflow (OF=1). Not supported in 64-bit mode. 0F 80 cd JO rel32 D Valid Valid Jump near if overflow (OF=1). 0F 8A cw JP rel16 D N.S. Valid Jump near if parity (PF=1). Not supported in 64-bit mode. 0F 8A cd JP rel32 D Valid Valid Jump near if parity (PF=1). 0F 8A cw JPE rel16 D N.S. Valid Jump near if parity even (PF=1). Not supported in 64-bit mode. 0F 8A cd JPE rel32 D Valid Valid Jump near if parity even (PF=1). 0F 8B cw JPO rel16 D N.S. Valid Jump near if parity odd (PF=0). Not supported in 64-bit mode. 0F 8B cd JPO rel32 D Valid Valid Jump near if parity odd (PF=0). 0F 88 cw JS rel16 D N.S. Valid Jump near if sign (SF=1). Not supported in 64-bit mode. 0F 88 cd JS rel32 D Valid Valid Jump near if sign (SF=1). 0F 84 cw JZ rel16 D N.S. Valid Jump near if 0 (ZF=1). Not supported in 64-bit mode. 0F 84 cd JZ rel32 D Valid Valid Jump near if 0 (ZF=1). Если трейсить трейслогом 1000 инструкций поверх call, то видим многократное повторение пути внутри цикла между 00437A34 и 0044DFAF. С помощью скрипта можно выйти на цикл не используя трейслог Можно использоваться функции определения куда прыгнет поток, до его выполнения. Можно оперировать таблицей адресов с брейкпоинтами в пошаговой отладке.
    • MasterGHM

      Регулярки на Lua. Пронумеровать список строк

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео ce lua обучалка regular
      1
      0 Голоса
      1 Сообщения
      79 Просмотры
      MasterGHM
      Пример задачи. Пронумеровать список string string.byte string.char string.dump string.find string.format string.gmatch string.gsub string.len string.lower string.match string.pack string.packsize string.rep string.reverse string.sub string.unpack string.upper local text = [[ string string.byte string.char string.dump string.find string.format string.gmatch string.gsub string.len string.lower string.match string.pack string.packsize string.rep string.reverse string.sub string.unpack string.upper ]] function EnumerateText(text) local count = 0 local rez = text:gsub('%C+', function (s) count = count + 1 return string.format('%s. %s', count, s) end) showMessage(rez) writeToClipboard(rez) end EnumerateText(text) И получил ответ. В следующий раз только вызывать "EnumerateText([[ текст со строками]])" 1. string 2. string.byte 3. string.char 4. string.dump 5. string.find 6. string.format 7. string.gmatch 8. string.gsub 9. string.len 10. string.lower 11. string.match 12. string.pack 13. string.packsize 14. string.rep 15. string.reverse 16. string.sub 17. string.unpack 18. string.upper Тут в буфер текст улетит и выведет в мессагу. После закрытия мессаги через CTRL+V вставит текст, куда хотим Пронумерованные функции — функции работы со строками последней версии Lua 5.3.x из документации На что стоит обратить внимание при регулярках: Работа с пробелами и не пробелами: "%s" и "%S" Работа с символами разделяющие строки и не разделяющими строки: "%с" и "%С" Захват строк "(.+)", "(.-)", "(.)", а также без захвата, т.е. пропуск других символов ".+",".-","." Узнать как и какая функция из выше перечисленных работает, какая используется с регуляторами. Хотим к примеру вывести слово, которое закончится на пробеле (пишу просто "на пробеле" без учета других символов). Это уже "(%w+)", а если хотим второе слово, то это "%W+%w+" (не выводить первое и вывести второе слово) или "%s(%w+)" (после пробела, но чтобы было без пробела, то захватить в круглые скобки), или "^.+%s(%w+)"(начинать с первого символа до пробела и захват до конца слова). Если писать на CE Lua, то регулярки знать не обязательно. Но, их желательно знать, чтобы читать чужой код и писать свой. Да и вообще это интересно. Очень короткие выражения позволяют решить некоторую задачу за быстрое время. Основные задачи: поиск текста и замена текста.
    • MasterGHM

      Сравнение времени выполнения двух функций

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео обучалка ce lua optimization
      2
      0 Голоса
      2 Сообщения
      182 Просмотры
      MasterGHM
      С точностью до тысячной доли секунды можно посчитать задержку выполнения кода, что можно применить как счет производительности. local x = os.clock() local s = 0 for i=1,100000 do s = s + i end print(string.format("elapsed time: %.3f\n", os.clock() - x)) После выполнения, показывает 2 тысячных секунды или 2 мс elapsed time: 0.002 Можно посчитать прошедшее время для другой цели. Например, если цикл в отладке выполняется более 3 секунд, то это вероятно корневой цикл, а если менее, то это вложенный цикл. На корневом цикле можно остановить трейслог. Об этом может быть потом напишу.
    • MasterGHM

      Оптимизация splitDisassembledString()

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео ce lua optimization фишки
      1
      0 Голоса
      1 Сообщения
      699 Просмотры
      MasterGHM
      Напишем функцию, которая в 3.2 раз быстрее splitDisassembledString(disassemble(address)) \-- Линия: 0045464A - FF 05 A4B54500 - inc [0045B5A4] { [000003EA] } function GetDebugString(address) return splitDisassembledString(disassemble(address)) end \-- address, bytes, opcode function GetDebugString2(address) local clearString = string.gsub(disassemble(address), '%s','') return string.match(clearString, '^(.-)%-(.-)%-(.-)$') end function NoOptimizeCode() GetDebugString(0x0045464A) end function OptimizeCode() GetDebugString2(0x0045464A) end local countRepeat = 100000 -- add more cycle local x1 = 0 local x2 = 0 x1 = getTickCount() for i = 1, countRepeat do NoOptimizeCode() end x2 = getTickCount() for i = 1, countRepeat do OptimizeCode() end print(string.format("%.2f", (x2 - x1)/(getTickCount() - x2)) ) Сравнивая скорости получаем оптимизацию в ~3.20 раза быстрее. Пример использования function GetDebugString2(address) local clearString = string.gsub(disassemble(address), '%s','') return string.match(clearString, '^(.-)%-(.-)%-(.-)$') end local address, bytes, opcode = GetDebugString2(0x0045464A) print(address) print(bytes) print(opcode) gsub очищает пробелы, а выражение '^(.-)%-(.-)%-(.-)$' позволит захватить данные между тире в строке. Может пригодится, когда трейсим своим Lua кодом. Если заинтересовали регулярки: ссылка
    • MasterGHM

      Пошаговая отладка Lua скриптов

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео debug ce lua фишки
      2
      1
      0 Голоса
      2 Сообщения
      260 Просмотры
      MasterGHM
      Открываем Lua консоль из дизассемблера Пишем Lua скрипт Дальше по шагам как на картинке Если мы пишем какую-то функцию и она дает сбой, то её можно отладить как на скриншоте. Это может быть и не функция. Например, код прочитал какой-то файл с текстом сохраненных параметров и подсмотрели в пошаговой Lua отладке что происходит дальше. *Действуют горячие клавиши. Например, F7— шаг, F9 — запуск без остановки.
    • MasterGHM

      Заполненение таблицы данными по базовому адресу

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео фишки ce lua ce memrec ce aa
      1
      2
      0 Голоса
      1 Сообщения
      140 Просмотры
      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 Если проще руками забить и поставить опцию раскрытия, то можно и без скрипта.
    • MasterGHM

      Сделать большой брейкпоинт на структуру через dbk_useKernelmodeOpenProcess

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео фишки breakpoint ce lua dbk
      3
      4
      0 Голоса
      3 Сообщения
      265 Просмотры
      MasterGHM
      Пользователь @Pitronic написал в Сделать большой брейкпоинт на структуру через dbk_useKernelmodeOpenProcess: Мы знаем что адрес таймера на выстрел во первых лежит в одной структуре с патронами, во вторых адрес в начале меняется в момент выстрела одновременно с уменьшением патронов и в пределах от одной до 100 миллисекунд возвращается в прежнее значение. может lua скрипт специальный можно сделать? Я бы сделал без скриптов. делаешь dessect structure Далее как обычно. Создаешь структуру. Затем вот это (следить за изменениями) ну а дальше воспроизводишь свой выстрел потом создаешь структуру из изменившихся данных (потому что их будешь очень много наверняка) затем делаешь lock на структуру, чтобы значения зафиксирвать затем рядом создаешь второй ряд по ctrl +a и смотрим изменения в реальном времени (игра должна быть в оконном режим, чтобы мы видели как цифры скачут) чтобы увидеть изменения менее 100мс нужно поставить интервал меньше По идее это должно сработать
    • MasterGHM

      Телепорт на 10 слотов и на 3 типа данных (float, double, integer)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Не решенные Статьи и видео ce lua телепорт озвучка шаблоны
      8
      0 Голоса
      8 Сообщения
      446 Просмотры
      PitronicP
      У меня не горит, более того пока не делаю телепорт, просто чтоб знать как, спросил. Будет время расскажешь. Только бы не забыл.
    • MasterGHM

      Поиск по формуле

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео фишки идея scan memory ce lua
      1
      7
      0 Голоса
      1 Сообщения
      122 Просмотры
      MasterGHM
      В таблице поиска есть колонки ссылающиеся на название Lua перменных: "value" и "previousvalue" Сравнивать текущее и предыдущие значения вместе или по отдельности, в том числе на разных вкладках CE Примеры: value == 65 value == 0x65 (или поставить галку hex) value ~= 65 (или поставить галку not) Можно и такое сравнение сделать после поиска неизвестного используя математические функции: math.abs(value - previousvalue) < 10 Можно делать различные комбинации: and (логическое И). or (логическое ИЛИ). not (логическое НЕ). \+ (сложение); \- (вычитание); * (умножение); / (деление); ^ (возведение в степень); % (остаток от деления). == (равно); ~= (не равно); < (меньше); > (больше); <= (меньше или равно); >= (больше или равно). Можно написать функцию xor function BitXOR(a,b)--Bitwise xor local p,c=1,0 while a>0 and b>0 do local ra,rb=a%2,b%2 if ra~=rb then c=c+p end a,b,p=(a-ra)/2,(b-rb)/2,p*2 end if a<b then a=b end while a>0 do local ra=a%2 if ra>0 then c=c+p end a,p=(a-ra)/2,p*2 end return c end А потом применяем даже отдельные функции как в этом примере "value > 0 and BitXOR(value, 100) " А может быть я хочу только 100 первых результатов function BitXOR(a,b)--Bitwise xor local p,c=1,0 while a>0 and b>0 do local ra,rb=a%2,b%2 if ra~=rb then c=c+p end a,b,p=(a-ra)/2,(b-rb)/2,p*2 end if a<b then a=b end while a>0 do local ra=a%2 if ra>0 then c=c+p end a,p=(a-ra)/2,p*2 end return c end valueCount = 0 function CheckCount100() valueCount = valueCount + 1 return valueCount <= 100 end CheckCount100() and value > 0 and BitXOR(value, 50) Также хочу добавить те адреса, которые предположительно являются указателями getAddressSafe('['..value..']')~=nil Или наоборот не являются указателями getAddressSafe('['..value..']')==nil Еще можно попробовать добавить 50 красных и 50 синих указателей в таблицу CE, но это уже задание кому интересно. Можно в теории сравнивать адреса со значениями известных адресов и даже с известными указателями, с метками. Но поиск может затянуться, если адресов очень много. Можно попробовать указать условие, что значение адреса должно находиться в X структуре или в её вероятных указателях. Или попробовать оставить только одинаковые значения адресов, т.е. повторяющихся более 1 раза. Или попробовать искать только те адреса, к которым применимы сразу несколько условий чтобы не кликать их постоянно: (изменилось) И (больше 0) И (меньше 10000) (не изменилось) И (больше 0) И (меньше 10000)
    • MasterGHM

      Медленный брейкпоинт

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео breakpoint фишки идея
      1
      0 Голоса
      1 Сообщения
      699 Просмотры
      MasterGHM
      Если условный брейкпоинт очень часто выполняется и это приводит к очень сильным тормозам, то есть пара приемов Сделать АА скрипт, который проверяет условие cmp eax, [АДРЕС] jne x1 nop // здесь поставить на код брейкпоинт без условия x1: // здесь оригинальный код На инструкции проходит очень много адресов и окно с определяемыми адресами виснет. Теоретическое решение. Сделать АА скрипт, который через alloc() создаст блок памяти (буфер) для будущих адресов и их счетчиков. Через второй АА код сделать инъекцию, которая во время игры в буфер будет записывать не повторяющиеся адреса и повторяющиеся счетчики. Чтобы просмотреть результат можно зайти в MemoryView — просмотр памяти в CE. Области памяти также можно сравнивать в "Dessect Data" окне
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 5 / 6