MasterGH Опубликовано 2 марта, 2015 Поделиться Опубликовано 2 марта, 2015 Задача. Нужно вызывать функции с копией стека, но так чтобы игра не вылетала, если это произошло с неудачей. Т.е. нужно вписать обработку исключительной ситуации, чтобы поток корректно закрылся. Я могу сам сделать, но уже несколько недель все никак не могу этим заняться. Если у кого желание есть,то код ниже и файлы плагина в аттаче. Repeater.rar--Author: MasterGH, 03.01.2015, Gamehacklab[RU] (http://gamehacklab.ru)frmRepeater = createFormFromFile(getCheatEngineDir().."\\autorun\\frmRepeater.xml")if(frmRepeater == nil) then messageDialog('Can not find frmRepeater', mtError, mbOK) returnendfunction OnClickMenuItemRepeater() frmRepeater.Show()endfunction DEC_HEX( IN ) return string.format( '%x', IN )end function HEX_DEC( IN ) return tonumber(IN, 16)end local menuItems = getMemoryViewForm().findComponentByName('MainMenu1').Itemslocal count = menuItems.Count - 1for i = 0, count-1 do local item = menuItems.getItem(i) if(item.Caption == 'Tools') then local mi = createMenuItem(popupmenu) menuItem_setCaption(mi, '* Repeater [Plugin]') menuItem_onClick(mi, OnClickMenuItemRepeater) item.add(mi) break endendlocal countLine = 1tableBtn = {}frmRepeater.CEEdit1.Text = 'Action1'frmRepeater.CEEdit2.Text = '00454690' --'00000000'frmRepeater.Caption = 'Repeater [CE Lua Plugin, ver 1.0]'function OnClickBtnCaller(sender) for i,v in ipairs(tableBtn) do if(tableBtn[i].btnCall == sender) then autoAssemble(tableBtn[i].AACallThread) end endendfunction OnClickCreateLine(sender) if (countLine > 10) then print('Records > 15') return end local labelName = frmRepeater.CEEdit1.Text local addressCode = frmRepeater.CEEdit2.Text if (labelName == '') then messageDialog('Label is empty', mtError, mbOK) return end if (addressCode == '') then messageDialog('AddressCode is empty', mtError, mbOK) return end for i,v in ipairs(tableBtn) do if(tableBtn[i].userLabel == labelName) then print('Name "'..labelName..'" is not unical') return end if(tableBtn[i].addressCall == addressCode) then print('AddressCode "'..addressCode..'" is not unical') return end end local btnCall = createButton(frmRepeater) btnCall.Caption = labelName..' (Do action in the game!)' btnCall.Top = (countLine - 1) * 50 + 10 btnCall.Width = 300 btnCall.Left = 80 btnCall.OnClick = OnClickBtnCaller btnCall.Enabled = false tableBtn[countLine] = {} tableBtn[countLine].btnCall = btnCall tableBtn[countLine].userLabel = labelName tableBtn[countLine].addressCall = addressCode tableBtn[countLine].addressCallNumber = HEX_DEC(addressCode) tableBtn[countLine].StackDump = false tableBtn[countLine].addressStack = 'StackMemRepeatCall'..countLine tableBtn[countLine].addressMemThread = 'ThreadMemRepeatCall'..countLine tableBtn[countLine].AACallThread = '' debug_setBreakpoint(addressCode, 1, bptExecute) frmRepeater.CEEdit1.Text = 'Action1' frmRepeater.CEEdit2.Text = '00000000' frmRepeater.CEPanel1.Top = countLine * 50 countLine = countLine + 1endfunction CallAction(itemTable) debug_removeBreakpoint(itemTable.addressCall) if (getOpenedProcessID() == 0) then messageDialog('No target any process', mtError, mbOK) return end autoAssemble(string.format([[alloc(%s,10000)registersymbol(%s)%s+1000:readmem(%x, 3000)]],itemTable.addressStack, itemTable.addressStack, itemTable.addressStack, ESP)) itemTable.StackDump = true--EFLAGS--32-bit: EAX, EBX, ECX, EDX, EDI, ESP, EBP, ESP, EIP--64-bit: RAX, EBX, RBX, RDX, RDI, RSP, RBP, RSP, RIP, R8, R9, R10, R11, R12, R13, R14, R15 : The value of the register local lineDissassemble = disassemble(itemTable.addressCall) extrafield, opcode, bytes, adressReturnHere = splitDisassembledString(lineDissassemble) --local _ebp = DEC_HEX(getAddress(itemTable.addressStack..'+'..DEC_HEX(EBP-ESP), false)) --string.format('getAddress(%s,10000) --local _ebp = DEC_HEX(getAddress(DEC_HEX(EBP)..'-'..DEC_HEX(ESP)..'+'..itemTable.addressStack, false)) --local _esp = DEC_HEX(getAddress(itemTable.addressStack)) local scriptAA0 = '' if(targetIs64Bit()) then print(RBP) print(RSP) print(DEC_HEX(RBP-RSP)) local _rbp = DEC_HEX(getAddress(itemTable.addressStack..'+'..DEC_HEX(RBP-RSP), false)) local _rsp = DEC_HEX(getAddress(itemTable.addressStack)) --call qword ptr [7FEF06C9C88] local _,_,x = string.find(opcode, '%[(.*)%]') ddDistanation = x --ddDistanation = getNameFromAddress(x) --opcode = 'call '..getNameFromAddress(x) scriptAA0 = string.format([[alloc(%s,4096)label(storyESP)label(ddAddress)registersymbol(%s)%s:mov rax,%xmov rbx,%xmov rcx,%xmov rdx,%xmov rsi,%xmov rdi,%xmov [storyESP],rspmov rsp,%s+1000mov rbp,%s+1000call qword ptr [ddAddress]mov rsp,[storyESP]retddAddress:dd %sstoryESP:dd 0]], itemTable.addressMemThread, itemTable.addressMemThread, itemTable.addressMemThread, RAX, RBX, RCX, RDX, RSI, RDI, _rsp, _rbp, ddDistanation) --opcode else local _ebp = DEC_HEX(getAddress(itemTable.addressStack..'+'..DEC_HEX(EBP-ESP), false)) local _esp = DEC_HEX(getAddress(itemTable.addressStack)) scriptAA0 = string.format([[alloc(%s,4096)label(storyESP)registersymbol(%s)%s:mov eax,%xmov ebx,%xmov ecx,%xmov edx,%xmov esi,%xmov edi,%xmov [storyESP],espmov esp,%s+1000mov ebp,%s+1000%smov esp,[storyESP]retstoryESP:dd 0]], itemTable.addressMemThread, itemTable.addressMemThread, itemTable.addressMemThread, EAX, EBX, ECX, EDX, ESI, EDI, _esp, _ebp, opcode) end print(scriptAA0) autoAssemble(scriptAA0) itemTable.AACallThread = string.format('createthread(%s)',itemTable.addressMemThread) itemTable.btnCall.Enabled = trueendfunction debugger_onBreakpoint() --_test --print(RIP) if(targetIs64Bit()) then for i,v in ipairs(tableBtn) do if(tableBtn[i].addressCallNumber == RIP) then CallAction(tableBtn[i]) return 1 end end else for i,v in ipairs(tableBtn) do if(tableBtn[i].addressCallNumber == EIP) then CallAction(tableBtn[i]) return 1 end end end return 0endfrmRepeater.CEButton2.OnClick = OnClickCreateLine Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения