MasterGH Опубликовано 30 апреля, 2015 Поделиться Опубликовано 30 апреля, 2015 Представляю замечательный скрипт по поиску инструкций, которые прыгают на известный адрес. 1. Описание проблемы на примере игры "Assassin Creed Unity" Скрытый текст У нас есть инструкция "1455D741F - 32 02 - xor al,[rdx]", но мы не знаем какие инструкции на неё прыгают. Нужен такой инструмент, который позволит найти инструкции и отобразить их 2. Описание практического решения решения Мы можем сделать вручную или в автоматическом режиме. Нажимая кнопку F7 начиная с бряка на 1455D741F запоминать откуда прыгали. Вручную это делать утомительно, а вот в автоматическом режиме самое то. Я выполнил скрипт и получил результат Я увидел что за 2К инструкций (и даже в тестах на 20К инструкций) на инструкцию "1455D741F - 32 02 - xor al,[rdx]" происходит прыжок только с "1455CE87B - E9 9F8B0000 - jmp 1455D741F" Этот скрипт может помочь в исследовании отладочного кода 3. Скрипт и как им пользоваться -- Плагин CE Lua. Ищет адреса с которых происходит прыжок или вызов на целевой адрес-- 1. Запустить CE-- 2. Если надо в CE поставить VEH дебаггер или другой-- 3. Подключиться к процессу игры-- 4. Скоприовать код ниже в Lua консоль-- 5. Ввести в stringAddress свой адрес в виде строки-- 6. Ввести в maxFoundAddreses свое значение-- 7. Ввести в maxCountStep свое значение-- 8. Запустить выполнение скрипта и набраться терпения. Каждый новый прыжок, который находит скрипт будет выводится сразу. А после завершения поиска будут выведены результаты.local stringAddress = 'ACU.exe+55D741F' -- адрес на который будут пыржки или calllocal maxFoundAddreses = 2000 -- поиск остановится если адресов нашлось больше maxCountAddreseslocal maxCountStep = 2000 -- количество шагов (F7) после которых поиск остановится. Если очень много, то ждать окончания поиска придется долго. Задавать эксперементально-- Эти переменные редактировать не нужноlocal isStartFinding = truelocal countStep = 0local countFoundAddreses = 0local iTargetAdress = getAddress(stringAddress)local tableAdresses = {}local lastEIPorRIP = 0 -- прошлый адресfunction TryAddAddressToStory(lastAddress) for i = 1, #tableAdresses do if(tableAdresses[i] == lastAddress) then return false end end table.insert(tableAdresses, lastAddress) local sAddress = string.format('0x%X', lastAddress) local moduleAddress = getNameFromAddress(sAddress) print(string.format('Find %s : %s', moduleAddress, disassemble(sAddress))) return trueendfunction debugger_onBreakpoint() if(isStartFinding) then countStep = countStep + 1 if(targetIs64Bit()) then -- Если код оказался на целевом адресе, то попытаться добавить в историю прошлый lastEIPorRIP if(RIP == iTargetAdress and lastEIPorRIP ~= 0) then if(TryAddAddressToStory(lastEIPorRIP)) then countFoundAddreses = countFoundAddreses + 1 end end -- Сохранить значение RIP регистра lastEIPorRIP = RIP else -- Если код оказался на целевом адресе, то попытаться добавить в историю lastEIPorRIP if(EIP == iTargetAdress and lastEIPorRIP ~= 0) then if(TryAddAddressToStory(lastEIPorRIP)) then countFoundAddreses = countFoundAddreses + 1 end end -- Сохранить значение EIP регистра lastEIPorRIP = EIP end -- Оставновить поиск, если количество шагов боьше максимальрых или найденных адресов больше максимального значения if(countStep >= maxCountStep or countFoundAddreses >= maxFoundAddreses) then isStartFinding = false debug_removeBreakpoint(iTargetAdress) debug_continueFromBreakpoint(co_run) print("Найдено адресов " .. countFoundAddreses) print("Совершено количество шагов " .. countStep) --print("Адреса: ") --for i = 1, #tableAdresses do -- local sAddress = string.format('0x%X', tableAdresses[i]) -- local moduleAddress = getNameFromAddress(sAddress) -- print(string.format('%s : %s', sAddress, moduleAddress)) --end print("Трассировка завершена") else -- Иначе делать шаг по коду debug_continueFromBreakpoint(co_stepinto) --co_run (just continue), co_stepinto(when on top of a call, follow it), co_stepover (when on top of a call run till after the call) end return 1 -- не показывать дизассемблер во время поиска isStartFinding end return 0 -- показывать дизассемблерend-- Установить бряк на адрес, на который будут совершаться прыжки. Будет происходить поиск этих прыжков в автоматической пошаговой отладке начиня с этого брякаdebug_setBreakpoint(iTargetAdress) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 30 апреля, 2015 Поделиться Опубликовано 30 апреля, 2015 Представляю замечательный скрипт по поиску инструкций, которые прыгают на известный адрес.MasterGH, здорово. Спасибо.Может теперь найти все три jmp на проверки для этой игры и просто занопить их одновременно?Может это сработает? Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 30 апреля, 2015 Автор Поделиться Опубликовано 30 апреля, 2015 Garik66, возможно я отвечу на твои вопросы в теме обхода защиты игры ACU. Остается ждать. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения