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

CE 6.6 Lua. OnExtraLineRender обработчик


MasterGH

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

OnExtraLineRender: function(sender, Address, AboveInstruction, Selected): RasterImage OPTIONAL, x OPTIONAL, y OPTIONAL

 

Такой обработчик, который позволяет рисовать прямоугольную область над инструкцией или под ней в окне дизассемблера.

Где

sender - объект класса DisassemblerviewLine

AboveInstruction - bool, рисовать перед инструкцией? (в противном случае после). Если не учитвать, то будет рисовать и до и после

x,y - позиционирование. Если ставить по нулям, то смещение будет как на скриншоте ниже. Если смещать, то область над адресом будет увеличена и зеленая рамка будет смещена в этой области

 

Описание (eng):

Скрытый текст
Цитата

Disassemblerview class: (Inheritance: Panel->CustomControl->WinControl->Control->Component->Object)
  The visual disassembler used on the memory view window
properties
  SelectedAddress: integer - The currently selected address in the disassemblerview
  SelectedAddress2: integer - The secondary selected address in the disassemblerview
  TopAddress: Integer - The first address to show
  ShowJumplines: boolean - Determines if the jumplines should be shown
  OnSelectionChange: function(sender, address, address2) - Function to call when the selection has changed
  OnExtraLineRender: function(sender, Address, AboveInstruction, Selected): RasterImage OPTIONAL, x OPTIONAL, y OPTIONAL
    Function to call when you wish to provide the disassembler view with an extra image containing data you wish to show.
    This function is called once to get an image to show above the instruction, and once to get an image to show under the instruction and optional comments.
    The image for both calls must be different objects as rendering will only be done when both calls have been completed

    Sender is a DisassemblerviewLine object
    If no coordinates are given the image will be centered above/below the instruction


methods
  -

 

 

 

OnExtraLineRender.thumb.png.6878a4b18e85

Рис.1 Применение OnExtraLineRender. Фраза "Any Coment" поставлена из контекстного меню дизассемлера как пример.

 

Скрытый текст

ClRed    = 0x0000FF
ClGreen    = 0x008000
ClBlue    = 0xFF0000

extraLineRender_defaultColor = ClGreen
extraLineRender_tableAddress = {}
extraLineRender_X = 0
extraLineRender_Y = 0

--RasterImage OPTIONAL, x OPTIONAL, y OPTIONAL
function OnExtraLineRender(sender_disassemblerviewLine, address, aboveInstruction, selected)
    if(aboveInstruction) then
    for i = 1, #extraLineRender_tableAddress do
        if(extraLineRender_tableAddress == address) then
            return commentImage, extraLineRender_X, extraLineRender_Y
        end
    end
    end
end

function ExtraLineRender_Init()
    local disassemblerView = getMemoryViewForm().DisassemblerView
    disassemblerView.OnExtraLineRender = OnExtraLineRender
    local width = 1000
    local height = 20
    if(commentImage == nil) then
        commentImage = createBitmap(width, height)
    end
    commentImage.Width = width
    commentImage.Height = height
    commentImage.Canvas.clear()
    commentImage.Canvas.Pen.Color = extraLineRender_defaultColor
    commentImage.Canvas.Brush.Color = extraLineRender_defaultColor
    commentImage.Canvas.fillRect(0, 0, commentImage.Width, commentImage.Height)
end

-- Создание новой таблицы
function ExtraLineRender_NewTable(newTable)
    extraLineRender_tableAddress = newTable
end

-- Добавляет адрес в таблицу
function ExtraLineRender_AddRecord(address)
    table.insert(extraLineRender_tableAddress,address)
end

-- Удаляет адрес из таблицы
function ExtraLineRender_RemoveRecord(address)
    for key,value in pairs(extraLineRender_tableAddress) do
        if(address == value) then
            table.remove(extraLineRender_tableAddress, key)
        end
    end
end

ExtraLineRender_Init()
ExtraLineRender_AddRecord(0x004556D9)
-----

 

p.s. Разочарование. Не придумал, где это можно применить. Вместо зеленой рамки можно рисовать все что угодно и текст в том числе. Но текст не нужен, т.к. это Header текст и ставится из дизассемблера или функцией setHeader(address, text).

Вообще цель была пометить адреса цветом, которые были пройдены или не были пройдены после отладки. Но такой способ "добавляет строки" с цветной областью совсем не то, что хотелось. Попробую добавить колонку после колонки адресов и там цветной прямоугольник.

Ссылка на комментарий
Поделиться на другие сайты

31 минуты назад, MasterGH сказал:

Не придумал, где это можно применить.

Навскидку:

Эти области не плохо использовать для видео-уроков.

Отметить место инъекции.

Отметить начало и конец исследуемой игровой функции.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

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

 

Далее, я сделал костыль пока как черновой вариант.

OnExtraLineRender_2.thumb.png.48d8ecbf21

Рис.2 Обозначение инструкций цветным маркером

 

Это почти то, чего я хотел добиться.

 

1. Когда инструкцию я хочу выделить определенным цветом (маркер адреса)

2. В перспективе, когда я хочу в динамике добавлять и удалять маркеры с адресов (например, при пошаговой отладке, когда прошел по адресам, то они выделяются маркером)

3. В перспективе использовать разные цвета маркеров для разных прохождений по коду в отладке (в ручном или автоматическом режиме). Можно увидеть наглядно, какие прыжки выполнялись, а какие еще нет.

В общем идей много...

 

Скрытый текст

ClRed	= 0x0000FF
ClGreen	= 0x008000
ClBlue	= 0xFF0000

extraLineRender_defaultColor = ClGreen
extraLineRender_tableAddress = {}
extraLineRender_X = 60
extraLineRender_Y = -20

--RasterImage OPTIONAL, x OPTIONAL, y OPTIONAL
function OnExtraLineRender(sender_disassemblerviewLine, address, aboveInstruction, selected)
	for i = 1, #extraLineRender_tableAddress do
		if(extraLineRender_tableAddress == address) then
			if(aboveInstruction) then
				return commentImage, extraLineRender_X - 100, extraLineRender_Y
			else
				return commentImage, extraLineRender_X, extraLineRender_Y
			end
		end
	end

end

function ExtraLineRender_Init()
	local disassemblerView = getMemoryViewForm().DisassemblerView
	disassemblerView.OnExtraLineRender = OnExtraLineRender
	local width = 20
	local height = 20
	if(commentImage == nil) then
		commentImage = createBitmap(width, height)
	end
	commentImage.Width = width
	commentImage.Height = height
	commentImage.Canvas.clear()
	commentImage.Canvas.Pen.Color = extraLineRender_defaultColor
	commentImage.Canvas.Brush.Color = extraLineRender_defaultColor
	commentImage.Canvas.fillRect(0, 0, commentImage.Width, commentImage.Height)
	commentImage.Canvas.Brush.Color = 0xC8D0D4
	commentImage.Canvas.fillRect(0, 0, commentImage.Width, commentImage.Height-13)
end

-- Создание новой таблицы
function ExtraLineRender_NewTable(newTable)
  extraLineRender_tableAddress = newTable
end

-- Добавляет адрес в таблицу
function ExtraLineRender_AddRecord(address)
	table.insert(extraLineRender_tableAddress,address)
end

-- Удаляет адрес из таблицы
function ExtraLineRender_RemoveRecord(address)
	for key,value in pairs(extraLineRender_tableAddress) do
		if(address == value) then
			table.remove(extraLineRender_tableAddress, key)
		end
	end
end

ExtraLineRender_Init()
ExtraLineRender_AddRecord(0x004556E3)
ExtraLineRender_AddRecord(0x004556EF)

 

 

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

17 минуту назад, MasterGH сказал:

Я думаю, для видеороликов это затратно по времени и энергии (в плане сил и ресурсов человека делающего видеоурок).

Это зависит от того. как будет реализован плагин в будущем.

 

17 минуту назад, MasterGH сказал:

Это почти то, чего я хотел добиться.

Уже - ЗДОРОВО!!!

 

ЗЫ: Я после «Кин-дза-дза!», всегда за "Цветовую дифференциацию штанов".:D

Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Garik66 сказал:

Это зависит от того. как будет реализован плагин в будущем.

 

Я не буду спорить. ИМХО проще выделить адреса тем способом, о котором я уже писал.

Сейчас цель в пошаговой отладке закрасить адреса и наглядно увидеть, где прыжки не выполняются. Потом Следующий проход уже с другим цветами: цвет, который проходит по месту где не было прохода и другой цвет - по месту где был проход. Или же не трогать цвета, по которым проход уже был раньше.

 

Ссылка на комментарий
Поделиться на другие сайты

Закраска адресов одним цветом

 

Данные:

1. Адрес 1 - начало

2. Адрес 2 - конец

3. Цвет - красный

 

Подключаемся к процессу. Вставляем скрипт. Меняем данные на свои. Запускаем скрипт и смотрим как прошли маркеры

 

Пример

Скрытый текст

OnExtraLineRender_3.thumb.png.0e8e43c4a6

 

На скриншоте видим, что прошли путь до

 

0056EB13 - 0F8A AB000000         - jp 0056EBC4

Дальше выполняется прыжок и опять маркеры - выход из функции

Скрытый текст

OnExtraLineRender_3_1.thumb.png.82c9ea49

 

 

Код закраски одним цветом.

Скрытый текст

ClRed	= 0x0000FF
ClGreen	= 0x008000
ClBlue	= 0xFF0000

extraLineRender_defaultColor = ClRed
extraLineRender_tableAddress = {}
extraLineRender_X = 60
extraLineRender_Y = -20

--RasterImage OPTIONAL, x OPTIONAL, y OPTIONAL
function OnExtraLineRender(sender_disassemblerviewLine, address, aboveInstruction, selected)
	for i = 1, #extraLineRender_tableAddress do
		if(extraLineRender_tableAddress == address) then
		if(aboveInstruction) then
			return commentImage, extraLineRender_X - 100, extraLineRender_Y
		else
			return commentImage, extraLineRender_X, extraLineRender_Y
		end
		end
	end
end

function ExtraLineRender_Init()
	local disassemblerView = getMemoryViewForm().DisassemblerView
	disassemblerView.OnExtraLineRender = OnExtraLineRender
	local width = 20
	local height = 20
	if(commentImage == nil) then
		commentImage = createBitmap(width, height)
	end
	commentImage.Width = width
	commentImage.Height = height
	commentImage.Canvas.clear()
	commentImage.Canvas.Pen.Color = extraLineRender_defaultColor
	commentImage.Canvas.Brush.Color = extraLineRender_defaultColor
	commentImage.Canvas.fillRect(0, 0, commentImage.Width, commentImage.Height)
	commentImage.Canvas.Brush.Color = 0xC8D0D4
	commentImage.Canvas.fillRect(0, 0, commentImage.Width, commentImage.Height-13)
end

-- Создание новой таблицы
function ExtraLineRender_NewTable(newTable)
	extraLineRender_tableAddress = newTable
end

-- Добавляет адрес в таблицу
function ExtraLineRender_AddRecord(address)
	table.insert(extraLineRender_tableAddress,address)
end

-- Удаляет адрес из таблицы
function ExtraLineRender_RemoveRecord(address)
	for key,value in pairs(extraLineRender_tableAddress) do
		if(address == value) then
			table.remove(extraLineRender_tableAddress, key)
		end
	end
end

ExtraLineRender_Init()
--ExtraLineRender_AddRecord(0x004556E3)
--ExtraLineRender_AddRecord(0x004556EF)
-----

function debugger_onBreakpoint()

	if(EIP >= startAddress) then
		--Breakpoint continue methods: co_run=0, co_stepinto=1, co_stepover=2
		debug_continueFromBreakpoint(co_stepover)
		ExtraLineRender_AddRecord(EIP)
	else
		debug_continueFromBreakpoint(co_run)
		debug_removeBreakpoint(startAddress)
		debug_removeBreakpoint(endAddress)
	end

	return 1 --I handled it so dont tell the user
	--return 0 --unexpected breakpoint, show the the user
end


startAddress = 0x0056EAC0
endAddress = 0x0056EBC3
-- тип отладки (0=default, 1=windows debug, 2=VEHDebug, 3=Kerneldebug)
local typeDebug = 1
--Breakpoint triggers: bptExecute=0, bptAccess=1, bptWrite=2
--vtByte=0, vtWord=1, vtDword=2
debug_setBreakpoint(startAddress, vtByte, bptExecute)
debug_setBreakpoint(endAddress, vtByte, bptExecute)
debugProcess(typeDebug)

 

 

Что у нас есть

1. Закраска маркером одного цвета пути, который проходит поток игры от адреса1 до адреса2

2. Если запустить скрипт снова, то прошлые данные стираются. Не сохраняются

3. Нельзя видеть несколько цветов

Скрытый текст

Что я увидел. Функция, которую я прогонял взята из Limbo игры. Он вызывается несколько раз и код в ней выполняется по разным путям. Два из ни них, когда поток то перепрыгивает тот "jp" (первое состояние)

0056EB13 - 0F8A AB000000         - jp 0056EBC4

то не перепрыгивает. Маркеры красят первое состояние за один проход в один цвет. Отладка выключается. Но если бряк поставить после jp, когда он не выполняется, то он срабатывает. Значит после отладки код проходит эту же функцию иначе. Это значит, что

 

а) нельзя останавливать отладку, пока не перестанут появляться новые уникальные пути, которые будут связаны с цветами

б) можно останавливать отладку, но при повторном запуске уже будет поиск нового уникально пути. Если он будет, то он маркером другого цвета закрасится и после этого отладка остановится

 

Что можно сделать.

1. Взять 8 цветов. Больше 8-ми я думаю пока не стоит брать.

2. Каждый новый проход (пройденный путь)  связывать с новым цветом. Проходы и цвета запоминать. Причем если проход нового цвета такой же как уже известный проход, то новый цвет на проход не назначать

3. Сделать UI менеджер группы цветов. Включая чекбоксы, накладывать маркеры друг на друга. Цвета не прозрачные, что-то с прозрачностью проблема, пока не решил.

 

Что интересно

Видеть пути прохождения отличающиеся друг от друга по отдельности и вместе

Узнать сколько уникальных проходов может быть исполнено в функции за исследуемое время (пока от 1-го до 8-ми проходов)

 

Зачем это нужно. Предположительно это позволит связать цвет пути и действие, которое делаем в игре. Два действия - два цвета. Три действия - три цвета. Если одно действие, то один цвет. Например, одно действие - нет стрельбы. Второе действие - есть стрельба. Функцию находим поставив бряк на адрес патронов и сделав трейслог выхода из функции. На каждый call-выход ставим бряки. Там где бряк срабатывает, когда  игре ничего не делаем, тот этот бряк снимаем. Затем ищем бряк, когда стреляем. И вот этот call внешний или внутренний исследуем маркерами. Пусть стреляет - будет цвет X, а другой путь  - не стреляет будет цветом Y.

 

Дальше идеи

1. Красить маркерами вложенные call-s. Сейчас у нас без входов в call-ы

2. Подумать о Tracelog-ах. Есть стандартный CE Tracelog (из меню дизассемблера), но в нем повторные проходы либо затираются последним (инфо о регистрах затирается последней инфой), либо первый проход не затирается(инфа о ригистрах остается первая от первого прохода). Если надо изучить все проходы на одном участке не поднимаясь на всю ветку, то задача усложняется без маркеров,  а с ними по идеи должна упроститься.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Продолжение исследования той же функции.

 

Функция срабатывает, когда персонаж падает.

С помощью маркеров я увидел

 

1) не больше двух вариантов прохождения  кода (только два маркера, только два пути)

2) есть код, который вообще не выполнялся

 

Очень интересно, что маркеры появлялись в рантайм на мои действия в игре.

 

Скрытый текст

586e7d3c41199_Markedaddresse1s.thumb.png

* На этом скриншоте зеленые маркеры перекрашивают красные

 

Можно включать и выключать маркеры через Lua консоль

visibleColorTable[1] = false
visibleColorTable[2] = false

Проблемы:

1. Прозрачное наложение цветов не удалось добиться. Маркеры сейчас могут перекрашивать друг друга.

2. Не хватает UI инфы. Сколько сейчас цветов всего может быть, идет ли отладка.

3. Не изучена ситуация, если функция будет выполняться очень часто. Сейчас подлагивает на глазок до 4-6 fps.

4. Нет кнопки, чтобы остановить отладку. Отладка не останавливается пока не будет зарегистрировано больше 8-ми отличающихся логик в функции (т.е. путей обозначенных цветами)

5. Включение и выключение плагина

6. Нужен UI ввода адресов старта и конца исследования

 

Пока решил не красить маркерами адреса во внутренних call-ах, т.к. надо решить проблемы выше. Но забегая вперед скажу, я в предвкушении изучить вложенные функции, которые работают и для ГГ и для NPS (вражеских, дружественных). Хочу увидеть как раскрашивается код для каждой группы. Там где отличие, там можно попробовать поставить фильтр.

 

Завел репозиторий "Lua Plugin CE Marked addresses", последний коммит там. Но код еще сырой.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Рад сообщить об обновлении до 0.9.1 beta.

Код в репозитории обновлен

 

1. Исправления ошибок

2. Проходы рисуются полосами

3. Выводится информация над стартовым адресом о количестве проходов и количестве хитов стартого адреса (т.е. прерываний)

4. При запуске Lua кода открывается отладчик на стартовом адресе

 

Известные проблемы:

1. Стартовый и конечные адреса вводятся из кода

2. Запуск, остановка из кода

3. Остановку и затем запуск. Не тестил. Если баги, то перезапустить CE.

4. Выравнивание элеметов UI. Например, полоски могут заезжать на адреса. Нажмите, Ctrl+M и в настройках что-то поменять. Чтобы адреса были числовые в hex

 

Впечатления:

Запарился )

 

Скрытый текст

586fe57565fc9_Markedaddresse2.thumb.png.586fe71d037db_Markedaddresse2_2.thumb.pn

 

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

 

Теория, теорией.  Хорошо бы показать на практике.

Проба сапера.

1. Нашел адрес мин

2. Вышел на инструкцию. Выделил функцию

3. Скопипастил и вставил код. Ввел начальный и конечный адрес

4. Кликаю на поле и не попадаю на мину, затем кликаю и попадаю GameOver

5. Смотрю раскраску

Скрытый текст

586fffc82e0b9_1.thumb.png.26b5e88a1c8081

 

Все цвета идут по последовательности радуги. Это чтобы запомнить было проще. Первый - красный. Второй - оранжевый. Ну, ты знаешь считалку "каждый охотник желает знать где сидит фазан". Если дойдешь до фазана, то дальше отладка остановится.

 

Смотри, там где красный и оранжевый расходятся, то какая-то интересная штука. Давай занопим и безусловный прыг поставим

6. Нопим и прыг

Скрытый текст

586fffd1007ad_2.thumb.png.4a6772c108c64a

4. Рестарт игры (ну не игры, а уровень начался заного)

5. Кликаем на поле и "бам", появлся желтый путь. Следующий цвет радуги - желтый

Скрытый текст

586fffd804091_3.thumb.png.815198d3c542d2

 

Что вижу. Сколько не кликаю, никакие мины не ставятся. Конечно, интересно. В игре шутере, вы например стреляете, а выстрела не происходит. Тоже самое. Это значит, что мы находимся в самом сердце логики игры. Связываем происходящие действия в игре с маркерами, пытаемся найти что-то чего такого хотим. Например, никогда не проигрывать.

 

6. Оранжевый путь привел к GameOver, а красный нет. Значит меняем прыги на красный путь.

Скрытый текст

5870032a7cf5e_4.thumb.png.80fa7a5d08f2f2

 

7. Покликал чтобы проиграть и к сожалению проиграл опять. Ну теперь смотрим на путь, куда он ведет.

Зеленый - ничего не было - миимо мины. А вот голубой - ведет к GameOver и оранжевый вел. Т.е. надо смотреть эти два пути, они должны отличаться от других!

Скрытый текст

58700338aa2fb_5.thumb.png.aed1fc0b6b2451


 

Скрытый текст

587003e081765_6.thumb.png.586978a20277c6

 

Скрытый текст

587004282c833_7.thumb.png.828ee04d471505

 

К сожалению, я не вижу здесь где красный и оранжевый ведут однозначно к проигрышу. Либо надо пересмотреть код, либо подняться выше на уровень, либо залезть в call-ы. Если вы найдете решение, то можно его сюда запостить. Задача - при клике на клетку с бомбой не умирать (ничего не происходит)

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

Пока перерв. На подходе UI с новыми функциями

 

Скрытый текст

mainForm.png.1453eea7c65e47742847ce7f973

 

Обновления:

  1. Вызов плагина из Tools меню дизассемблера
  2. Перенос адресов и показ формы плагина из контекстного меню. Можно выделить вручную функцию, а можно сразу после Selection Function.
  3. Чекбокс "Break on new branch". Брейкпоинт с остановкой и показом отладчика, когда появляется новая ветка ( появляется новый цвет прохождения или новая логика)
  4. Чекбокс "Break on start branch". Брейкпоинт с остановкой и показом отладчика на начальном адресе любой ветки
  5. Чекбокс "Break on end branch". Брейкпоинт с остановкой и показом отладчика на конечном адресе любой ветки
  6. Отдельные чекбоксы для каждой из веток - будет срабатывать на начале исполнения ветки.
  7. Хиты для веток "HitsN" - работаю всегда, пока запущен плагин
  8. Branches. Количестве ветвей
  9. All hits: счетчик вызовов стартового адреса. Там сейчас 180, а по идеи должно быть не меньше 183, т.к. ветка 1 вызывалась 183 раза. Надо будет поправить.
  10. Кнопка "Run/Stop" будет запускать или останавливать
  11. Подсказки в виде сообщений во время работы
  12. Выключение и включение различных компонентов во время работы плагина или когда он выключен

На данный момент идет стадия тестирования. Если успею, то сегодня выложу. Если нет, то... не сегодня :)

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Такой вопрос, а будет ли плагин определять и раскрашивать маркеры, если код выполняется одинаковый, но с разными значениями в регистрах?

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, partoftheworlD сказал:

Такой вопрос, а будет ли плагин определять и раскрашивать маркеры, если код выполняется одинаковый, но с разными значениями в регистрах?

 

Плагин раскрашивает адреса в любом случае и  с разными значениями регистров, и с одинаковыми.

Если код будет выполняться одинаковый, а регистры на нем будут разные, то в одном случае код пройдет по старому пути и это не изменит цвет, в другом случае код пройдет по новому пути. Новый путь будет закрашен новым маркером. Всего доступно для раскраски путей 8 цветов. 7 цветов радуги +1 цвет (радуги не хватило)

 

Значения регистров определяют путь, а мы только следим за путем по адресам. Нам не нужны регистры. Хотя нужны и связь с цветом нужна, но пока не до них.

 

 

Ссылка на комментарий
Поделиться на другие сайты

50 минут назад, MasterGH сказал:

Плагин раскрашивает адреса в любом случае и  с разными значениями регистров, и с одинаковыми.

Если код будет выполняться одинаковый, а регистры на нем будут разные, то в одном случае код пройдет по старому пути и это не изменит цвет, в другом случае код пройдет по новому пути.

Теперь понял.

Просто подумал сначала, что в плагине примерно такой же функционал как в плагине для IDA под названием DIE, было бы не плохо увидеть когда-нибудь подобное в CE.

 

 

 

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

Сравнить дампы стека я могу и в CE без IDA. Сдампить два стека с брейкпоинта  на начале функции с правильным и не правильным паролем. Дампы отправить в окно структур и там поискать отличия. Или можно попробовать стек глянуть поставив бряк на адресе текста...

 

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

Ссылка на комментарий
Поделиться на другие сайты

Рад сообщить о выходе версии 0.9.2 (beta)

 

Lua Plugin CE Marked addresses.rar

 

* Распаковать архив в папку Autorun с заменой файлов в папке forms.

 

Скрытый текст

mainForm.png.9db4c1e65ac3de8b8498c3b1197

 

8 часов назад, MasterGH сказал:
  • Вызов плагина из Tools меню дизассемблера
  • Перенос адресов и показ формы плагина из контекстного меню. Можно выделить вручную функцию, а можно сразу после Selection Function.
  • Чекбокс "Break on new branch". Брейкпоинт с остановкой и показом отладчика, когда появляется новая ветка ( появляется новый цвет прохождения или новая логика)
  • Чекбокс "Break on end branch". Брейкпоинт с остановкой и показом отладчика на конечном адресе любой ветки
  • Отдельные чекбоксы для каждой из веток - будет срабатывать в конце исполнения ветки.
  • Хиты для веток "HitsN" - работаю всегда, пока запущен плагин
  • Branches. Количестве ветвей
  • All hits: счетчик вызовов стартового адреса.
  • Кнопка "Run/Stop" будет запускать или останавливать
  • Подсказки в виде сообщений во время работы
  • Выключение и включение различных компонентов во время работы плагина или когда он выключен
  • Обновлен репозиторий, там все исходники

 

Известные проблемы:

1. Окно памяти с hex мышкой не таскается
2. Debug режим (тот самый с регистрами  и стеком в пошаговой отладке) включается, когда ставим галки. А когда появляется анализатор стека, то тормозит игра. Поэтому галки включаем тогда когда надо, потом Stop, потом галки не включаем. Анализатор стека пропадает и тормозов меньше

3. Раскраски-полоски заезжают за цифры. Напрягает. Поправить пока не могу

 

Впечатления:

Вот я вижу инструкцию на строк 1К с кучей условных джампов. Я попал на неё через снятие брейкпоинтов с трейслога CE. С помощью этого плагина я могу увидеть "дорожки-полосы", по которым код бегает ловко прыгая по джампам. В общем прикольно. Только пока я ни одной игры не сломал - код писал :-D

 

Что можно знать. Конечно, можно ломать игры без этого плагина, ломали и обходились. Теория. Ветки красятся от адресаА до адресаБ по уникальном путям. Всего возможно 8-мь путей. По цветам определяем куда код пошел и что в игре произошло. После того как увидели пути "хорошие" и "плохие", то думаем как воздействовать на них. Либо меняем условные прыги методом тыка, либо данные по адресам методом тыка. Можно все испортить. Либо на "плохой/хорошей ветке" ставим бряк и врубаем трейслог с выходом из функций, т.е. по ret-ам. Далее по логам, по call-ам ехать и смотреть на стек. Аргументы функций убираются из стека при выходе. Это мы трейсили из глубины вверх. Выключаем плагин. Определяем параметры условного бряка, ставим его и уже трейсим теперь вглубь до ветки. Так для плохой и хорошей ветки два трейслога в глубь. Остается сравнить их ближе к концу веток и понять когда  и какая вызывается.

 

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

Cheat Engine 6.6

 

Репозиторй обновлен вчера. Там был фикс. Когда остановили плагин, то пошаговую отладку нельзя было провести, т.к. Lua обработчик отпускал процесс по F9 при любом брейкпоинте.

 

При экспериментах плагина.

 

1. Раскраска в циклах - не позволяет увидеть дорожки

 

увидел 7-мь одинаковых путей раскрашенных разными цветами (на скриншоте их три, но потом стало 7). Оказалось попал на цикл и пути шли вверх вниз. Когда дорожка на дорожку попадает вертикально на саму себя, то её не отличить. Таким образом 7 дорожек одинаково прошли функцию

 

Скрытый текст

5874d3963d5af_.thumb.png.e6b885544648c98

 

 

2. Тормоза, когда включается анализ стека и регистров

 

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

 

3. Тормоза на быстро обращающихся функциях.

 

Была у меня функция. Вызывается примерно 500-1000 раз в секунду, а длина ~200 адресов. Если 1000 *200  = 200 тысяч брейкпоинтов в секунду. Виснет жестко. Один кадр за секунд 20.

 

Есть вариант оптимизировать Lua код при работе с таблицами адресов. Сейчас эта таблица разрушается и заполняется после прохождения функции. Есть предположение, что не очень ускорит, но сделать можно, т.к. это не очень сложно. Над другими вариантами надо думать.

Ссылка на комментарий
Поделиться на другие сайты

Скрытый текст

58750074b1af1_2.thumb.png.3b85f414ffd0b7Плохая оптимизация.png

Плохая оптимизация.rar

 

Есть такой массив temporaryRecordPath и он создавался много раз. Попытался его не создавать, а заполнять nil-ами и проверять их. Думал будет лучше по оптимизации, а стало хуже примерно три раза.

 

upd1:

В общем данные не точные. Если долго ждать, все значения по скорости падают в обоих случаях

 

upd2:

В оптимазации Lua я ничего не знаю. Надо будет погуглить примеры и решения.

Ссылка на комментарий
Поделиться на другие сайты

В 10.01.2017в21:34, MasterGH сказал:

В общем данные не точные. Если долго ждать, все значения по скорости падают в обоих случаях

 

Исправлено. Обновлен репозиторий.

Lua Plugin CE Marked addresses.rar

 

Причина.

Скрытый текст

Нельзя ставить перед адресом с брейкпоинтом еще один брейкпоинт через


debug_continueFromBreakpoint(co_stepover)

а ставить


debug_continueFromBreakpoint(co_run)

Иначе мы получаем автоматически не снимаемые CE-ом брейкпоинты на последнем адресе замедляя работу игры и отладчика CE. Скорее всего, они будут накапливаться (а накапливаются они точно - их видно в окне брейкпоинтов) пока оперативы и файла подкачки не хватит.  Теперь проблема исправлена. Забыл версию CE поднять. Остается 0.92 beta

Ссылка на комментарий
Поделиться на другие сайты

59 минут назад, Xipho сказал:

У нас есть собственный GIT движок на сервере, могу тебе сделать учетку, чтобы там хранил инфу, если хочешь.

 

Я подумаю

Ссылка на комментарий
Поделиться на другие сайты

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

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

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