Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


New BreakPoint Window (for CE 6.3 Beta, rev 1846)

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Tutorials -> LUA Tutorials
View previous topic :: View next topic  
Author Message
GH*master
Expert Cheater
Reputation: 8

Joined: 10 Jan 2008
Posts: 159

PostPosted: Thu Jun 06, 2013 5:29 am    Post subject: New BreakPoint Window (for CE 6.3 Beta, rev 1846) Reply with quote

Screenshot in runtime working:



1. Unpack files in to autoran-directory for CE 6.3 Beta OR see sources
2. Find address (some type of byte, word, dword, float)
3. Add adress-record to the main CE Table
4. Get Context menu on the record and call item "* Set BreakPoint"

-------------------
Sources:

1. Window Form is file DebugWindowForm.xml:
Code:
<?xml version="1.0"?>
<FormData>
    <frmBreakPointReceiver_1 Class="TCEForm" Encoding="Ascii85">tyIfy)=Ap+,ig5}P@r*gHifJZNGNT)gI$vnwWuXg9JNw6Xqwz4qu4Xn%)xF$Ecga}qb(IhRQ]Z)V8f2F$B)px!UAtR/2m:9bI,aYjS?nGUT4c4v_o3*2p+0[(:NpqJx-bG!w}2hh/DAU0}jmkn@oEaI,-fxrR5BG:v/-YV;)h):Z*;QNvJ4irDhTz#[^zmLH)?WY.4t@O[d5=ZEj9T08:uY]Q*?AqUW]=Pl2gCb:B.%%/FB:q!L6Yl#N5mQrrt]=bd,[[,cTetLYI2K2G08zm0Cnw:=zE+7A-_C)OmfH^5wOd4?YhUR!uTPP/_R!bYg7:=_z;M-/N2i*G:fG.)q]uTUb#O67cAAcy-:z}qXR3v/4I^Dcq5MG_6f/E)yr(1A73qXMksBc=zU0VhR3Ck.437T$;z[vm^l:b[d8+yCszZ(G}(OV]-pOf](t]*4][email protected][@10Rw_T/H.@3yE/U[koPM%*cy]]}2Ks%Gl#V4K71*OH%C.MdlnW$M$+Z)gzox$v%V^TIsUg*7YNj%-vXMa({znGQ,X2AaI^7#1.V4J{;mC)uP%wWwX=dgyh1-LvfURyxBz=CnND0E$Cv4E5)CaAEfqnhYhE38ZtAV5sIhp5CVSRy!tTF3PJ3%F}4/FJ_s8A]SNFyzc:Q9GLQ^V3CbqY)m#Ot-c-Dy.J*7=Lb==x/NKiVPK##P[=U}*u@:Hv::Vw6Hh,q1Yw?Vr7pY#C]2G0(uCcN(3R)-5HB}FpC9))E!c#o#inh-s7?yX(UOY]}a=++id#+8ER!d_SBMbBMi?u!Xal6disYeS*l9TyK+U$gWmceS-VgNF_XRBFl@}BJXytIsRDaPiEtMeIdQCSHW]WMtM</frmBreakPointReceiver_1>
</FormData>


2. Lua Plugin is file BreakPointWindow.lua:
Code:
--Author: Andrew, 01.06.2013)
   
   
   function CEButtonStopOrCloseClick(sender)
      debug_removeBreakpoint(breakAddress);
      form_hide(frmBreakPointReceiver)
      logRegistersTable = {}
      countLogRegistersTable = 0
      currentSelectIndex = 1
      lvi.clear()
      memoRegs.getLines().clear()
   end
   
   function CEListViewBreakPointsDblClick(sender)
   
      if(logRegistersTable ~= nil and logRegistersTable[currentSelectIndex]~=nil) then
         local mv = createMemoryView()
         mv.show()
         local dv = mv.DisassemblerView
         dv.TopAddress = getPreviousOpcode(logRegistersTable[currentSelectIndex][1])
      end

   end
   
   function CEListViewBreakPointsSelectItem(sender, listitem, selected)
      if (selected == true) then
         currentSelectIndex = listitem.Index + 1
         UpdateMemo(currentSelectIndex)
      end
   end
   
   frmBreakPointReceiver  = createFormFromFile(getCheatEngineDir().."\\autorun\\DebugWindowForm.xml")
   memoRegs = component_findComponentByName(frmBreakPointReceiver, 'CEMemoRegisterInfo')
   lv = component_findComponentByName(frmBreakPointReceiver, 'CEListViewBreakPoints')
   lv.OnSelectItem = CEListViewBreakPointsSelectItem
   lvi = listview_getItems(lv);
   
   logRegistersTable = {}
   countLogRegistersTable = 0
   maxCountLogRegistersTable = 100
   maxCountLineTable = 50
   breakAddress = nil
   
 
--- MENUITEM PART ---
   function OnSetBreakPoint()
      local al = getAddressList()
      local mr = addresslist_getSelectedRecord(al) --getMemoryRecord
      
      local dataType = mr.Type
      
      if(dataType == vtByte or dataType == vtWord or dataType == vtDword or dataType == vtSingle) then
      
         breakAddress = memoryrecord_getAddress(mr)
         local description = memoryrecord_getDescription(mr)
         local strHexAddress = string.format("0x%08X", breakAddress)
         control_setCaption(frmBreakPointReceiver, "Break at: "..description.. ' : '..strHexAddress)
         
         form_show(frmBreakPointReceiver)

         ---= SET BREAKPOINT PART 1 =----
         --todo: добавить определение типа данных отличных от vtDword
         -- Breakpoint triggers: bptExecute=0, bptAccess=1, bptWrite=2
         -- Variable types: (ref http://code.google.com/p/cheat-engine/source/browse/trunk/Cheat%20Engine/bin/defines.lua)
         -- todo: реализовать bptAccess (дублирует обращение к инструкциям inc[] и другие)
         
         if(dataType == vtByte) then
            debug_setBreakpoint(breakAddress, 1, bptAccess)
            return
         end
         
         if(dataType == vtWord) then
            debug_setBreakpoint(breakAddress, 2, bptAccess)
            return
         end
         
         if(dataType == vtDword or dataType == vtSingle) then
            debug_setBreakpoint(breakAddress, 4, bptAccess)
            return
         end
      else
         print('Only types: Byte, Word, Dword, Single(float)')
      end
   end


    function GetDataFromLineRegister(regName, lineREG, isNotOverflow)
      if(isNotOverflow) then
         regName = regName .. ': '
      else
         regName = regName .. '(Overflow):'
      end
      
       local tempLate2 = '0x%08X(%d),'
       for i = 1, #lineREG, 1 do
           regName = regName..string.format(tempLate2, lineREG[i][1],lineREG[i][2])
       end
       return regName
    end


   -- todo: обновление мемо
   function UpdateMemo(argIndex)

      if(logRegistersTable ~= nil and logRegistersTable[argIndex]~=nil) then
         local line = logRegistersTable[argIndex]
         
            local strEAX = GetDataFromLineRegister('EAX', line[3][2], line[3][1])
            local strEBX = GetDataFromLineRegister('EBX', line[4][2], line[4][1])
         local strECX = GetDataFromLineRegister('ECX', line[4][2], line[4][1])
         local strEDX = GetDataFromLineRegister('EDX', line[4][2], line[4][1])
         local strESI = GetDataFromLineRegister('ESI', line[4][2], line[4][1])
         local strEDI = GetDataFromLineRegister('EDI', line[4][2], line[4][1])
         local strESP = GetDataFromLineRegister('ESP', line[4][2], line[4][1])
         local strEBP = GetDataFromLineRegister('EBP', line[4][2], line[4][1])
         
         local str = string.format('%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s',strEAX, strEBX, strECX, strEDX, strESI, strEDI, strESP, strEBP)
         control_setCaption(memoRegs, str)
      end
   end
   

   

   



   local al = getAddressList()
   local view = component_getComponent(al,0)
   local popupmenu = control_getPopupMenu(view)

   mi = createMenuItem(popupmenu)
   menuItem_setCaption(mi, '* Set BreakPoint')
   menuItem_onClick(mi, OnSetBreakPoint)
   --menuItem_setShortcut(mi, 'Ctrl+Shift+T');
   local items = menu_getItems(popupmenu)
   menuItem_add(items, mi)

    
   currentSelectIndex = 1 -- текущий индек выделенной линии в ListView бряков
    
  ---= SET BREAKPOINT PART 2 =----
   function debugger_onBreakpoint() -- срабатывает всегда, когда срабатывает брейкпоинт


      -------ЛОГИРОВАНИЕ--------
      --for i = 1, #logRegistersTable, 1 do
      --   logRegistersTable[i]
      --end
      --------------------------
      
      if (countLogRegistersTable <= 250) then
      
         local isMemoUpdate = false
         
         -- Перебираем все EIP
         for i = 1, #logRegistersTable, 1 do
            -- Ищем EIP И если нашли, ТО ищем значения регистров И увеличиваем счётчик
            if(logRegistersTable[i][1] == EIP) then
            
               isMemoUpdate = currentSelectIndex == i
               
               -- счётчик обращений к инструкции
               logRegistersTable[i][2] = logRegistersTable[i][2] + 1
               
               -- Обновить данные счётчика в линии лист бокса
               local row = lvi.getItem(i-1)
               local row_subitems = listitem_getSubItems(row)
               row_subitems.setString(0, logRegistersTable[i][2])
               
               -- Ищем значение регистров
               local newSize = 0
               local isExistInTable = false
               local regTable = nil
               local regValues = nil
               local maxSise = 50
               
               
               
               -- 1. Анализ EAX значений
               regTable = logRegistersTable[i][3]
               regValues = regTable[2]
               -- Если значение регистра в таблице есть
               for j = 1, #regValues, 1 do
                  if (regValues[j][1] == EAX) then
                     isExistInTable = true
                     regValues[j][2] = regValues[j][2] + 1
                     break;
                  end
               end
               -- Если значение регистра в таблице нет, то добавить его в конец при условии что элементов не больше maxSise
               if(regTable[1] and not isExistInTable) then
                  newSize = #regValues + 1
                  if (newSize == maxSise) then
                     regTable[1] = false -- таблица переполнена и более заполнятся не будет                           
                  end
                  regValues[newSize] = {EAX, 1} -- добавить значение в таблицу
               end

               
               
               -- 2. Анализ EBX значений
               regTable = logRegistersTable[i][4]
               isExistInTable = false
               regValues = regTable[2]
               -- Если значение регистра в таблице есть
               for j = 1, #regValues, 1 do
                  if (regValues[j][1] == EBX) then
                     isExistInTable = true
                     regValues[j][2] = regValues[j][2] + 1
                     break;
                  end
               end
               -- Если значение регистра в таблице нет, то добавить его в конец при условии что элементов не больше maxSise
               if(regTable[1] and not isExistInTable) then
                  newSize = #regValues + 1
                  if (newSize == 50) then
                     regTable[1] = false -- таблица переполнена и более заполнятся не будет                           
                  end
                  regValues[newSize] = {EBX, 1} -- добавить значение в таблицу
               end
               
               
               
               -- 3. Анализ ECX значений
               regTable = logRegistersTable[i][5]
               isExistInTable = false
               regValues = regTable[2]
               -- Если значение регистра в таблице есть
               for j = 1, #regValues, 1 do
                  if (regValues[j][1] == ECX) then
                     isExistInTable = true
                     regValues[j][2] = regValues[j][2] + 1
                     break;
                  end
               end
               -- Если значение регистра в таблице нет, то добавить его в конец при условии что элементов не больше maxSise
               if(regTable[1] and not isExistInTable) then
                  newSize = #regValues + 1
                  if (newSize == 50) then
                     regTable[1] = false -- таблица переполнена и более заполнятся не будет                           
                  end
                  regValues[newSize] = {ECX, 1} -- добавить значение в таблицу
               end
               
               
               
               -- 4. Анализ EDX значений
               regTable = logRegistersTable[i][6]
               isExistInTable = false
               regValues = regTable[2]
               -- Если значение регистра в таблице есть
               for j = 1, #regValues, 1 do
                  if (regValues[j][1] == EDX) then
                     isExistInTable = true
                     regValues[j][2] = regValues[j][2] + 1
                     break;
                  end
               end
               -- Если значение регистра в таблице нет, то добавить его в конец при условии что элементов не больше maxSise
               if(regTable[1] and not isExistInTable) then
                  newSize = #regValues + 1
                  if (newSize == 50) then
                     regTable[1] = false -- таблица переполнена и более заполнятся не будет                           
                  end
                  regValues[newSize] = {EDX, 1} -- добавить значение в таблицу
               end
               
               
               
               -- 5. Анализ ESI значений
               regTable = logRegistersTable[i][7]
               isExistInTable = false
               regValues = regTable[2]
               -- Если значение регистра в таблице есть
               for j = 1, #regValues, 1 do
                  if (regValues[j][1] == ESI) then
                     isExistInTable = true
                     regValues[j][2] = regValues[j][2] + 1
                     break;
                  end
               end
               -- Если значение регистра в таблице нет, то добавить его в конец при условии что элементов не больше maxSise
               if(regTable[1] and not isExistInTable) then
                  newSize = #regValues + 1
                  if (newSize == 50) then
                     regTable[1] = false -- таблица переполнена и более заполнятся не будет                           
                  end
                  regValues[newSize] = {ESI, 1} -- добавить значение в таблицу
               end
               
               
               
               -- 6. Анализ EDI значений
               regTable = logRegistersTable[i][8]
               isExistInTable = false
               regValues = regTable[2]
               -- Если значение регистра в таблице есть
               for j = 1, #regValues, 1 do
                  if (regValues[j][1] == EDI) then
                     isExistInTable = true
                     regValues[j][2] = regValues[j][2] + 1
                     break;
                  end
               end
               -- Если значение регистра в таблице нет, то добавить его в конец при условии что элементов не больше maxSise
               if(regTable[1] and not isExistInTable) then
                  newSize = #regValues + 1
                  if (newSize == 50) then
                     regTable[1] = false -- таблица переполнена и более заполнятся не будет                           
                  end
                  regValues[newSize] = {EDI, 1} -- добавить значение в таблицу
               end
               
               
               
               -- 7. Анализ ESP значений
               regTable = logRegistersTable[i][9]
               isExistInTable = false
               regValues = regTable[2]
               -- Если значение регистра в таблице есть
               for j = 1, #regValues, 1 do
                  if (regValues[j][1] == ESP) then
                     isExistInTable = true
                     regValues[j][2] = regValues[j][2] + 1
                     break;
                  end
               end
               -- Если значение регистра в таблице нет, то добавить его в конец при условии что элементов не больше maxSise
               if(regTable[1] and not isExistInTable) then
                  newSize = #regValues + 1
                  if (newSize == 50) then
                     regTable[1] = false -- таблица переполнена и более заполнятся не будет                           
                  end
                  regValues[newSize] = {ESP, 1} -- добавить значение в таблицу
               end

               -- 8. Анализ EBP значений
               regTable = logRegistersTable[i][10]
               isExistInTable = false
               regValues = regTable[2]
               -- Если значение регистра в таблице есть
               for j = 1, #regValues, 1 do
                  if (regValues[j][1] == EBP) then
                     isExistInTable = true
                     regValues[j][2] = regValues[j][2] + 1
                     break;
                  end
               end
               -- Если значение регистра в таблице нет, то добавить его в конец при условии что элементов не больше maxSise
               if(regTable[1] and not isExistInTable) then
                  newSize = #regValues + 1
                  if (newSize == 50) then
                     regTable[1] = false -- таблица переполнена и более заполнятся не будет                           
                  end
                  regValues[newSize] = {EBP, 1} -- добавить значение в таблицу
               end
               
                  
               -- обновляем мемо, если именно эта запись сейчас выделена
               if(isMemoUpdate) then
                  UpdateMemo(currentSelectIndex)
               end

               -- Отладчик не показываем И завершаем анализ данных от бряка
               debug_continueFromBreakpoint(co_run)
               return 1
            end
            
         end
         
         -- Если EIP нет в записях, тогда добавляем запись
         countLogRegistersTable = countLogRegistersTable + 1
         
         -- Визуальное добавление строки в список бряков      
         local row = listitems_add(lvi)
         listitem_setCaption(row, countLogRegistersTable-1);
         row_subitems = listitem_getSubItems(row)
         strings_add(row_subitems, countLogRegistersTable-1)
         strings_add(row_subitems, disassemble(getPreviousOpcode(EIP)))
         
         logRegistersTable[countLogRegistersTable] =
            {EIP,0, {true, {{EAX,1}} },
                  {true, {{EBX,1}} },
                  {true, {{ECX,1}} },
                  {true, {{EDX,1}} },
                  {true, {{ESI,1}} },
                  {true, {{EDI,1}} },
                  {true, {{ESP,1}} },
                  {true, {{EBP,1}} }
            }
            
         -- Если это первое добавление в список инструкций, то отобразить данные в мемо
         if countLogRegistersTable == 1 then
            UpdateMemo(1)
         end
      else
         print('Lemit 250 lines')
         debug_removeBreakpoint(breakAddress);
      end

      debug_continueFromBreakpoint(co_run)
      return 1
   end
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Tutorials -> LUA Tutorials All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You cannot download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites