GH*master Expert Cheater Reputation: 8
Joined: 10 Jan 2008 Posts: 159
|
Posted: Thu Jun 06, 2013 5:29 am Post subject: New BreakPoint Window (for CE 6.3 Beta, rev 1846) |
|
|
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 |
|
|