А, ну да. Вижу свои строки. Т.е. тебе надо активирующий скрипт перенести в главную таблицу
MasterGH
Сообщения
-
Защита Трейнера -
Рубрика "Lua код сегодня" №5 (активирующий скрипт)Можно оставить одно из двух
-
Рубрика "Lua код сегодня" №5 (активирующий скрипт)Возможно, очень нужный прием, если пользоваться активирующим скриптом. Полностью можно понять если посмотреть таблицу и запустить тутор cheatengine-i386.exe
cheatengine-i386_active_example.CTЗапуск первой записи в таблице (активирующий скрипт)
getAutoAttachList().add("Tutorial-i386.exe") function onOpenProcess() getAddressList()[0].Active = true end
Сам активирующий скрипт пример
{$lua} function onOpenProcess() memrec.Active = true end [ENABLE] print("Активирующий скрипт. Включен ") // здесь пишем AA-код или иной [DISABLE] print("Активирующий скрипт. Выключен") // здесь пишем AA-код отмены или иной
Когда сработал активирующий скрипт
Опции, которые были выставлены для сворачивания внутрь записей под активирующий
"Активирующий скрипт" — главный скрипт, который вытаскивает адрес начала структуры игрока и помещает его в зарегистрированную метку. После активации разворачивает и показывает внутренние скрытые записи под собой. Это очень удобно показывать именно после подключения к процессу
Также активирующий скрипт содержит однобайтовые регистрируемые метки читов, по которым происходит запись по offsets от начала структуры. По меткам другие скрипты записывают однобайтовые значения 1 или 0.
Характерно для активирующего скрипта большой размер, много регистрируемых однобайтовых меток и активируется он до запуска читов, чтобы метки успели зарегистрироваться и их "увидели" другие скрипты.
-
Защита ТрейнераПосмотрел. Что-то быстро ответить не получается. Лучше завтра, на свежую голову. У тебя уже скрипты идут все сложнее и сложнее. Сегодня понакидаю статеек, а завтра на свежую голову попробую снова глянуть
-
Рубрика "Lua код сегодня" №4Это C - язык программирования.
-
CE Вывод иерархии компонентовСкрипт позволит вывести иерархию компонентов 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) -
Что в разделеИнформация по созданию плагинов для CE или связанная с ними. Плагины CE — это различные инструменты, которые позволяют расширить функционал CE.
-
Рубрика "Lua код сегодня" №4Иногда Lua-код слишком медленный, а на asm писать слишком много, тогда на помощь придет CCODE
C inline вставки позволяют писать C-код вместо ассемблера
Справочник по C-коду можно найти в Интернете.Примерчик будет:
{$CCODE base=EBX} int* myHealth=base+0x4B0; *myHealth = 999; {$asm}
[ENABLE] aobscanmodule(INJECT_test,Tutorial-i386.exe,29 83 B0 04 00 00) alloc(newmem,$1000) label(code) label(return) newmem: {$CCODE base=EBX} int* myHealth=base+0x4B0; *myHealth = 999; {$asm} code: //sub [ebx+000004B0],eax jmp return INJECT_test: jmp newmem nop return: registersymbol(INJECT_test) [DISABLE] INJECT_test: db 29 83 B0 04 00 00 unregistersymbol(INJECT_test) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: Tutorial-i386.exe+25A6F Tutorial-i386.exe+25A49: 8D 55 DC - lea edx,[ebp-24] Tutorial-i386.exe+25A4C: 8D 4D F4 - lea ecx,[ebp-0C] Tutorial-i386.exe+25A4F: E8 8C 7D FE FF - call Tutorial-i386.exe+D7E0 Tutorial-i386.exe+25A54: E8 37 E4 FD FF - call Tutorial-i386.exe+3E90 Tutorial-i386.exe+25A59: 50 - push eax Tutorial-i386.exe+25A5A: 85 C0 - test eax,eax Tutorial-i386.exe+25A5C: 0F 85 CE 00 00 00 - jne Tutorial-i386.exe+25B30 Tutorial-i386.exe+25A62: B8 05 00 00 00 - mov eax,00000005 Tutorial-i386.exe+25A67: E8 C4 93 FE FF - call Tutorial-i386.exe+EE30 Tutorial-i386.exe+25A6C: 83 C0 01 - add eax,01 // ---------- INJECTING HERE ---------- Tutorial-i386.exe+25A6F: 29 83 B0 04 00 00 - sub [ebx+000004B0],eax // ---------- DONE INJECTING ---------- Tutorial-i386.exe+25A75: 8D 45 D4 - lea eax,[ebp-2C] Tutorial-i386.exe+25A78: E8 53 DF FD FF - call Tutorial-i386.exe+39D0 Tutorial-i386.exe+25A7D: 8B 83 B0 04 00 00 - mov eax,[ebx+000004B0] Tutorial-i386.exe+25A83: 68 FF 00 00 00 - push 000000FF Tutorial-i386.exe+25A88: 8D 8D D4 FE FF FF - lea ecx,[ebp-0000012C] Tutorial-i386.exe+25A8E: BA FF FF FF FF - mov edx,FFFFFFFF Tutorial-i386.exe+25A93: E8 68 F2 FD FF - call Tutorial-i386.exe+4D00 Tutorial-i386.exe+25A98: 8D 4D D4 - lea ecx,[ebp-2C] Tutorial-i386.exe+25A9B: 66 31 D2 - xor dx,dx Tutorial-i386.exe+25A9E: 8D 85 D4 FE FF FF - lea eax,[ebp-0000012C] }
-
Защита ТрейнераОк, посмотрю
-
Защита Трейнера@Pitronic посмотрю завтра
-
Защита Трейнера\-- если процесс не открыт, то подкючиться к нему if (getProcessIDFromProcessName("Pet Show Craze.exe")==nil) then OpenProcess("Pet Show Craze.exe") И здесь останови таймер пока end
Тем самым ты подключишь процесс.
Далее жди события подключения процесса. Как его ждать? Ищем в справке
onOpenProcess(processid):
После подключения вызввай активацию записи
function onOpenProcess(processid) SetStateRecord("Activation", true) end
Попробуй сам расписать на бумаги логику.
Сначала проверяем открыт ли процесс.
Если нет, то открыть его. Перед тем как его открыть, то, наверно, надо подождать события его открытия onOpenProcess(processid), а после этого события активировать запись.Или подожди до вечера пятницы. Как дома буду запущу ce 7.5. За 5 минут разберешься.
Я сейчас, пока не могу ответить нормально без cheat engibe с телефона
-
Защита ТрейнераНаверно CE у меня 6.8.3 была на старом ноуте, с которого писал. А сейчас я с телефона, уставший с работы. С 8ми утра кодили до позднего вечера. Позже, наверно, напишу, как отдохну. Можешь написать больше вопросов
P.s Пиши, пожалуйста, мне на "ты", а то не удобно себя чувствую.
-
Защита ТрейнераСудя по названию ошибки нет закрывающих скобок для текста.
local aa_script =
[[
Здесь текст
]] -
Защита ТрейнераДа, можно. Скорее всего, желательно для флагов отдельную память делать. Чтобы флаги были выровнены по адресам и не смешивались с опкодами. Можно, этого и не делать. На твое усмотрение.
-
Рубрика "Lua код сегодня" №3Создать пустую запись чтобы пробовать вывод названия записи через lua
{$lua} print(memrec.Description) [ENABLE] print('is on') [DISABLE] print('is off')
Поля memrec многочисленны и описываются в документации. См. MemoryRecord Class: в ...\Cheat Engine 6.8.3\celua.txt
-
Защита ТрейнераУ меня другая версия CE
local aa_script = [[aobscanmodule(INJECT,Tutorial-x86_64.exe,29 93 90 07 00 00) // should be unique alloc(newmem,$1000,"Tutorial-x86_64.exe"+2B2D7) alloc(newmem2,$1000,"Tutorial-x86_64.exe"+2B2D7) registersymbol(flag) label(code) label(return) newmem2: flag: dd 0 newmem: code: sub [rbx+00000790],edx jmp return INJECT: jmp newmem nop return: registersymbol(INJECT)]] autoAssemble(aa_script)
-
Принципы управления-
Интерфейсный
Кнопками и графическими элеменами.
Например, окно CE позволяет удобно ставить галки и переключать скрипты, поведения, сценарии.
Например, ingame меню. Т.е. отрисовывается внутри окна игры. -
Горячими клавишами
Можно не переключаться между окнами, а активировать нужной комбинацией нужный сценарий. Однако, когда опций будет мноного, можно запросто забыть эти комбинации или подсматривать их. -
Через консоль
Эта консоль может быть в CE или ingame консоль.
Несморя на малую популярность это очень гибкий инструмент. С его помощью можно давать команды игровому процессу.
Например, сохранить или загрузить игру, сменить локацию и сцену, добавить ресурсов, создать персонажа, задать команду персонажу и прочее, прочее.
Сейчас это все в теории и не всегда просто реализуемо, но все это реализумо тем более что это процесс не удаленный и его память доступна. -
Программно
В этом случае создаются некоторые исходники, которые используют способы перечисленные выше.
Раньше на gamehacklab мы не уделяли внимания способу3. Теперь будем уделять большое внимание консоли. Практически все команды мы будем делать через консоль. И еще один момент исходники мы будем выкладывать в репозиторий, чтобы иметь возможность их корректировать и даже улучшать сохраняя версии.
-
-
Асинхронное выполнение сценариевЗаписи в таблице 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 -
Рубрика "Lua код сегодня" №2local 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 консоли
И убедиться, что данные записались в память процесса
Далее мы с вами будем очень много программировать короткими примерами в консоли управляя данными процесса и в том числе связывать это с базами данных. Например, такой-то пользователь, для такого-то персонажа создал таблицу телепортации с локациями и координатами. Этой таблицей можно будет очень удобно пользоваться. Также вы изучите принцип программирования, который используется при работе с СУБД.
-
Сделать большой брейкпоинт на структуру через dbk_useKernelmodeOpenProcessПользователь @Pitronic написал в Сделать большой брейкпоинт на структуру через dbk_useKernelmodeOpenProcess:
Мы знаем что адрес таймера на выстрел во первых лежит в одной структуре с патронами, во вторых адрес в начале меняется в момент выстрела одновременно с уменьшением патронов и в пределах от одной до 100 миллисекунд возвращается в прежнее значение. может lua скрипт специальный можно сделать?
Я бы сделал без скриптов.
- делаешь dessect structure
- Далее как обычно. Создаешь структуру. Затем вот это (следить за изменениями)
- ну а дальше воспроизводишь свой выстрел
- потом создаешь структуру из изменившихся данных (потому что их будешь очень много наверняка)
- затем делаешь lock на структуру, чтобы значения зафиксирвать
- затем рядом создаешь второй ряд по ctrl +a и смотрим изменения в реальном времени (игра должна быть в оконном режим, чтобы мы видели как цифры скачут)
- чтобы увидеть изменения менее 100мс нужно поставить интервал меньше
По идее это должно сработать
- делаешь dessect structure