GH*master Expert Cheater
  Reputation: 8
  Joined: 10 Jan 2008 Posts: 159
 
  | 
		
			
				 Posted: Fri Jan 06, 2017 1:26 pm    Post subject: Lua Plugin CE Marked addresses (branches) | 
				        | 
			 
			
				
  | 
			 
			
				Hint
 
1. Attach process
 
2. Copy/pasle Lua code
 
3. Change address:
 
startAddress          = 0x0056EAC0
 
endAddress             = 0x0056EBCB 
 
4. Run Lua code
 
 
* Maximum 8 unique branches
 
** 0.91 beta version/possible bugs
 
 
Repository: link
 
-----------------
 
 
 
 
 
 
 
 
 
 	  | Code: | 	 		  --RasterImage OPTIONAL, x OPTIONAL, y OPTIONAL
 
function OnExtraLineRender(sender_disassemblerviewLine, address, aboveInstruction, selected)
 
 
   for i = 1,8 do
 
      temporaryMarkerTable[i] = 0
 
   end
 
 
   -- по умолчанию #tablePuths == 8
 
   for i = 1,#tablePuths do
 
      -- tableAddresses хранит пары адресов не прерывного пути. Все пары составляют путь
 
      local tableAddresses = tablePuths[i][1]
 
      if(tableAddresses ~= nil) then
 
         for j = 1, #tableAddresses do
 
            if (tableAddresses[j] == address) then
 
               temporaryMarkerTable[i] = 1
 
            end
 
         end
 
      end
 
   end
 
 
   local allNull = true
 
   for i = 1,8 do
 
      if(temporaryMarkerTable[i] == 1) then
 
      allNull = false
 
      end
 
   end
 
 
   if(allNull) then
 
      return nil, extraLineRender_X - 100, extraLineRender_Y
 
   end
 
 
   -- Ищем в матрице индекс растрового изображения
 
   for i = 1,255 do
 
 
      -- Сохранить растровое изображение bitmap и карту марекров bitTable
 
      local tempalteTable = matrixColorsTable[i]
 
      local bitTable = tempalteTable[1]
 
      local bitmap = tempalteTable[2]
 
 
      local isFindedIndex = true
 
      for j = 1,8 do
 
         if (temporaryMarkerTable[j] ~= bitTable[j]) then
 
           isFindedIndex = false
 
           break
 
         end
 
      end
 
 
 
      if (isFindedIndex) then
 
         if(aboveInstruction) then
 
            -- TODO: bug CE 6.6. Если не возвращать, то вылет
 
            return bitmap, extraLineRender_X - 600, extraLineRender_Y
 
         else
 
            return bitmap, extraLineRender_X, extraLineRender_Y
 
         end
 
      end
 
   end
 
end
 
 
function debugger_onBreakpoint()
 
 
      if(EIP >= startAddress and EIP <= endAddress) then
 
         --Breakpoint continue methods: co_run=0, co_stepinto=1, co_stepover=2
 
         debug_continueFromBreakpoint(co_stepover)
 
         
 
         -- Добавляет адрес во временную таблицу
 
         table.insert(temporaryRecordPath, EIP)
 
         hitsCode = hitsCode + 1
 
      else
 
         -- TODO: Паковать адреса парами (оптимизация, сделать потом)
 
         -- TODO: Сравнивать пары адресов с другими путями, если отличиные, то это новый путь
 
         
 
         -- По умолчанию есть отличия между текущим путем и ранее сохраненным
 
         anyDifference = false
 
         
 
         
 
------------------ Ищем полное совпадение ветки
 
 
         -- Если все ветки пустые, то проход считается новым
 
         
 
         
 
         -- Проверить, что нет еще ни одной созданной ветки
 
         local someBranch = false
 
         -- Проверить, есть ли хотябы одно совпадения с ветками
 
         local anyDiffBranch = false
 
         
 
         for i = 1,#tablePuths do
 
            if(tablePuths[i] ~= nil and #tablePuths[i] > 0) then 
 
               someBranch = true 
 
               break
 
            end 
 
         end
 
         
 
         if (not someBranch) then 
 
            anyDifference = true
 
            --print('J')
 
            goto done
 
         end
 
         ----------------------------------------------------
 
         
 
         for i = 1,#tablePuths  do
 
            local tableAddresses = tablePuths[i][1]
 
            
 
            if(tableAddresses ~= nil) then
 
               if(#tableAddresses == #temporaryRecordPath) then
 
                  
 
                  anyDiffBranch = false
 
                  
 
                  for j = 1, #tableAddresses do
 
                     if (tableAddresses[j] ~= temporaryRecordPath[j]) then
 
                        
 
                        -- У ветки i, есть различия. Но нужно проверить остальные пути
 
                        anyDiffBranch = true
 
                        break
 
                     end
 
                  end
 
                  
 
                  -- Ветка похожа, не добавлять
 
                  if(anyDiffBranch) then
 
                     --print(#tablePuths..'-'..i)
 
                     -- Если кончились пути и есть отличия, то выход
 
                     if (i >= #tablePuths) then 
 
                        --print('A11')
 
                        anyDifference = true
 
                        goto done
 
                     end
 
                  else
 
                     --print('AA')
 
                     -- Это похожая ветка
 
                     anyDifference = false
 
                     goto done
 
                  end
 
               end
 
               
 
               --print(i)
 
               --print('N')
 
            end
 
 
 
            if (i >= #tablePuths) then 
 
               --print('A 333')
 
               anyDifference = true
 
               goto done
 
            end
 
         end
 
         
 
         ----------------------------------------------------
 
         --print('KKK')
 
         ::done::
 
         
 
         if (anyDifference and countGlobalPath < 8) then
 
            -- Это отличиный путь и его нужно связать с новым цветом
 
            tablePuths[countGlobalPath][1] = temporaryRecordPath
 
            countGlobalPath = countGlobalPath + 1
 
            
 
            if(countGlobalPath >= 8) then
 
               print('countGlobalPath >= 8. Stop marked')
 
               debug_removeBreakpoint(startAddress)
 
               debug_removeBreakpoint(endAddress)
 
            end
 
         else
 
            -- Это путь уже был. Пока ничего не делать
 
         end
 
         
 
         -- Если создается 8 путей, то новый путь не создается. Отладка останавливается
 
         temporaryRecordPath = {}
 
         debug_continueFromBreakpoint(co_run)
 
      end
 
         
 
   return 1 --I handled it so dont tell the user
 
   -- return 0 --unexpected breakpoint, show the the user
 
end
 
 
function ExtraLineRender_Init()
 
 
   local widthSingleMarker = 2
 
   local heightSingleMarker = 20
 
   local deltaX_Position = 2
 
   
 
   local ClRed      = 0x0000FF
 
   local clOrange   = 0x00AEFF
 
   local ClYellow    = 0x00FFFF
 
   local ClGreen   = 0x008000
 
   local clAqua   = 0xFFFF00
 
   local ClBlue   = 0xFF0000
 
   local clPurpure   = 0xFF00B2
 
   local ClLightGreen = 0x00FF00
 
 
   -- Создаем 255 растровых изображений - комбинаций маркеров в ряд
 
   -- Связываем ряд с индексом
 
   for i = 1,255 do
 
      local bitTable = ToBits(i)
 
     
 
      local bitmap = createBitmap((widthSingleMarker+deltaX_Position)*8, heightSingleMarker)
 
      bitmap.Width = (widthSingleMarker + deltaX_Position) * 8
 
      bitmap.Height = heightSingleMarker
 
      -- bitmap.Canvas.clear()
 
      -- Обрезка
 
      -- Серый цвет
 
      bitmap.Canvas.Brush.Color = 0xC8D0D4
 
      bitmap.Transparent = true
 
      bitmap.TransparentColor = 0xC8D0D4
 
      
 
      bitmap.Canvas.clear()
 
      bitmap.Canvas.fillRect(0, 0, bitmap.Width, bitmap.Height)
 
            
 
      -- Рисование маркеров в ряд
 
      for j = 1,8 do
 
      
 
         if(bitTable[j] == 1) then
 
      
 
            if (j == 1) then bitmap.Canvas.Brush.Color = ClRed         end
 
            if (j == 2) then bitmap.Canvas.Brush.Color = clOrange      end
 
            if (j == 3) then bitmap.Canvas.Brush.Color = ClYellow      end   
 
            if (j == 4) then bitmap.Canvas.Brush.Color = ClGreen      end
 
            if (j == 5) then bitmap.Canvas.Brush.Color = clAqua         end
 
            if (j == 6) then bitmap.Canvas.Brush.Color = ClBlue         end
 
            if (j == 7) then bitmap.Canvas.Brush.Color = clPurpure      end
 
            if (j == 8) then bitmap.Canvas.Brush.Color = ClLightGreen   end
 
 
            local x0 = (widthSingleMarker + deltaX_Position) * (j - 1)
 
            local x1 = x0 + widthSingleMarker
 
            
 
            -- Закраска в ряд
 
            bitmap.Canvas.fillRect(x0, 0, x1, 20)
 
         end
 
         
 
      end
 
      
 
      -- Сохранить растровое изображение bitmap и карту марекров bitTable 
 
      local tempalteTable = {}
 
      table.insert(tempalteTable, bitTable)
 
      table.insert(tempalteTable, bitmap)
 
      
 
      table.insert(matrixColorsTable, tempalteTable)
 
   end
 
 
   -- Инициализируем таблицу адресов на каждый из 8-ми возможных путей
 
   for i=1,8 do
 
      local tableAddresses = {}
 
      table.insert(tablePuths, tableAddresses)
 
   end
 
   
 
   -- Связь обработчика c OnExtraLineRender
 
   getMemoryViewForm().DisassemblerView.OnExtraLineRender = OnExtraLineRender
 
end
 
 
function ToBits(num, bits)
 
   local t={}
 
   for b=8,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 UpdateUIData()
 
 -- Сколько раз вызывается код
 
 setHeader(startAddress, 'Hits:'..hitsCode..', Branches: '..(countGlobalPath - 1))
 
end
 
 
-- Вызывать, если надо остановить
 
function Stop()
 
   debug_removeBreakpoint(startAddress)
 
   debug_removeBreakpoint(endAddress)
 
   uiTimer.Enabled = false
 
   destroy(timer)
 
   getMemoryViewForm().DisassemblerView.OnExtraLineRender = nil
 
end
 
 
-- Запуск
 
function Start()
 
   startAddress          = 0x0056EAC0
 
   endAddress             = 0x0056EBCB
 
   extraLineRender_X       = 65
 
   extraLineRender_Y       = -20
 
 
   tablePuths             = {}
 
   temporaryRecordPath    = {}
 
   countGlobalPath       = 1
 
   matrixColorsTable       = {}
 
   temporaryMarkerTable    = {}
 
 
   hitsCode = 0
 
   ExtraLineRender_Init()
 
   -- тип отладки (0=default, 1=windows debug, 2=VEHDebug, =Kerneldebug)
 
   local typeDebug = 13
 
   -- Breakpoint triggers: bptExecute=0, bptAccess=1, bptWrite=2
 
   debug_setBreakpoint(startAddress, vtByte, bptExecute)
 
   -- vtByte=0, vtWord=1, vtDword=2
 
   debug_setBreakpoint(endAddress, vtByte, bptExecute)
 
   debugProcess(typeDebug)
 
   
 
   -- UI таймер
 
   uiTimer = createTimer(nil, true)
 
   uiTimer.Interval = 1
 
   uiTimer.OnTimer = UpdateUIData
 
   
 
   -- Перход и наблюдение
 
   getMemoryViewForm().Show()
 
   getMemoryViewForm().DisassemblerView.TopAddress = startAddress
 
end
 
 
Start()
 
 
 
   -- TODO: кнопка - остановки отладки. Сейчас остановка возможна, если путей больше равно восьми
 
   -- TODO: Если путей больше 8-ми, то сообщение что лимит цветов превысел 8 и отладка будет остановлена. Отладка останавливается | 	  
 | 
			 
		  |