Перейти к содержанию

CE. AA Plagin. Исключительная ситуация. Вызов функции.


Рекомендуемые сообщения

Задача. Нужно вызывать функции с копией стека, но так чтобы игра не вылетала, если это произошло с неудачей. Т.е. нужно вписать обработку исключительной ситуации, чтобы поток корректно закрылся. Я могу сам сделать, но уже несколько недель все никак не могу этим заняться. Если у кого желание есть,то код ниже и файлы плагина в аттаче.

 

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
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.