| 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 и отладка будет остановлена. Отладка останавливается
 | 
 |  |