MasterGH Опубликовано 5 мая, 2015 Поделиться Опубликовано 5 мая, 2015 Написал сегодня утром скриптец и не дописал. Если хотите, то можете помочь. Скрипт трейсит код приложения от брейкпоинта на адресе кода и логирует границы исполняемого кода. Ну, вот... а получается ерунда под конец Выводит:Старт! Дождитесь завершения...Макс. кол-во адресов трассировки : 10000Макс. кол-во регионов кода : 10000Не трейсить : CallПревышено макс. кол-во адресов трассировкиРегионы кода пройденные трассировкой:0045464A - 00454684 <==== мы здесь были0045468C - 0045468F <==== мы здесь были00454695 - 00454695 <==== мы здесь были75B962FA - 75B96319 <==== мы здесь были75B96D3A - 75B96D53 <==== мы здесь были75B9965E - 75B99673 <==== мы здесь были75B996C5 - 75B996C9 <==== мы здесь были75BD5FBB - 75BD5FBE <==== мы здесь были75BD60FC - 75BD6102 <==== мы здесь были75BD60FD - 75BD6102 <==== мы здесь были75BD60FE - 75BD6102 <==== мы здесь были75BD60FF - 75BD6102 <==== мы здесь были75BD6100 - 75BD6102 <==== мы здесь былиКол-во регионов : 13Время : 28.48 секунд(ы)Поиск регионов кода завершен Там где красное, те регионы лишние. Они не должны создаваться tableCode = {}isStartFindingCode = falselocal maxCountStep = 10000 -- количество шагов трассеровкиlocal maxCountRegions = 10000 -- количество формируемых регионов в таблицеlocal targetAdress = 0local startTimer = 0local isCallExecute = false-- Выводит таблицуfunction PrintTable() print('Регионы кода пройденные трассировкой:') if(targetIs64Bit()) then for i = 1, #tableCode do print(string.format('%16X - %16X <==== мы здесь были', tableCode[i][1],tableCode[i][2])) end else for i = 1, #tableCode do print(string.format('%08X - %08X <==== мы здесь были', tableCode[i][1],tableCode[i][2])) end end print(string.format('Кол-во регионов : %s', #tableCode)) print(string.format("Время : %.2f секунд(ы)", os.clock() - startTimer)) print('Поиск регионов кода завершен\n')endfunction ReadAdressCode(addressCode) for i = 1, #tableCode do if(tableCode[i][1] >= addressCode and addressCode <= tableCode[i][2]) then return end end for i = 1, #tableCode do --print(string.format('> %X == %X',tableCode[i][2]+1, addressCode)) if(tableCode[i][2]+1 == addressCode) then tableCode[i][2] = tableCode[i][2] + getInstructionSize(addressCode) return end end -- Код не был пройден и далеко от найденных границ table.insert(tableCode, {addressCode, addressCode + getInstructionSize(addressCode)-1})endfunction debugger_onBreakpoint() if(isStartFindingCode) then countStep = countStep + 1 if(targetIs64Bit()) then ReadAdressCode(RIP) else ReadAdressCode(EIP) end if(countStep >= maxCountStep) then isStartFindingCode = false print("Превышено макс. кол-во адресов трассировки ") debug_removeBreakpoint(targetAdress) debug_continueFromBreakpoint(co_run) PrintTable() return 1 end if(#tableCode >= maxCountRegions) then isStartFindingCode = false print("Превышено макс. кол-во регионов кода ") debug_removeBreakpoint(targetAdress) debug_continueFromBreakpoint(co_run) PrintTable() return 1 end -- Иначе делать шаг по коду if(isCallExecute) then debug_continueFromBreakpoint(co_stepinto) --co_run (just continue), co_stepinto(when on top of a call, follow it), co_stepover else debug_continueFromBreakpoint(co_stepover) end return 1 -- не показывать дизассемблер во время поиска isStartFinding end return 0 -- показывать дизассемблерendfunction Start(address) print("Старт! Дождитесь завершения...") print(string.format("Макс. кол-во адресов трассировки : %s", maxCountStep)) print(string.format("Макс. кол-во регионов кода : %s", maxCountRegions)) if(isCallExecute) then print("Трейсить : Call") else print("Не трейсить : Call") end isStartFindingCode = true countStep = 0 tableCode = {} targetAdress = address startTimer = os.clock() debug_setBreakpoint(address)end--Start('test.exe+5B5A4')--0045464A - FF 05 A4B54500 - inc [0045B5A4] : [000003EC]Start('0045464A') Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения