Сейчас на форуме: asfa, bartolomeo (+7 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Как поставить брейкпоинт на доступ к регистру? |
Посл.ответ | Сообщение |
|
Создано: 13 марта 2012 02:06 · Поправил: Kuzya69 · Личное сообщение · #1 Народ, подскажите как отследить на большом участке кода, когда программа использует содержимое регистра. Причем может использоваться не весь, а лишь часть этого регистра (ecx, cx, ch,cl). Можно ли, как по аналогии с бряком на доступ к памяти, задать какое-то условие, чтобы программа останавливалась в том месте, где используется содержимое этого регистра? Содержимое постоянно меняется. Я хотел сказать, что обрабатывается массив, байты которого заносятся в этот регистр. И в зависимости от значения байта этого массива, само содержимое используется в разных местах. ( но и не только от значения самого регистра). Я понимаю, что надо использовать трассировку, но не могу придумать условие. А может у регистров тоже есть адрес, чтоб на него поставить "memory on access" ? Использую Олли. ![]() |
|
Создано: 13 марта 2012 09:00 · Личное сообщение · #2 |
|
Создано: 13 марта 2012 11:04 · Личное сообщение · #3 |
|
Создано: 13 марта 2012 13:26 · Поправил: Kuzya69 · Личное сообщение · #4 VodoleY А если трасса в текстовом файле достигает 90 мегабайт? И к тому-же надо найти когда из этого регистра чтение идет, причем отделить только нужные моменты. И тут-же проследить дальнейший путь, потому-что чтение идет в стек, а в следующий проход, стек уже может измениться. Dart Sergius Ну про адрес это я так спросил, на всякий случай. Думал вдруг я чего не знаю, ведь в АВР-контроллерах, есть такое (регистры РОН имеют еще и физический адрес). В основном надежда была на какие-нибудь недокументированные возможности, плагины, скрипты..... А может, при трассировке, какую нибудь "неточную команду" (так их в хелпе обозвали), можно придумать? ![]() |
|
Создано: 13 марта 2012 14:54 · Личное сообщение · #5 Kuzya69 у мну трассы по 2гб были, циклы вмпрота.. ниче страшного в этом нету. а вот со стеком это есть хорошо. тебе главное найти место в коде, где хотябы раз это сработает, а дальше ставь условные БП и лови. ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 13 марта 2012 19:35 · Личное сообщение · #6 Постараюсь вкратце описать. Вобщем код программы "зациклен" таким участком. Code:
Соответственно, после этой комбинации, программа оказывается в непредсказуемом месте, поэтому где ставить условные брейкпоинты не сообразишь заранее. К тому-же есть предчуствие, что код самомодифицируется. Пару раз встречал команды, которые пишут что-то в эту зону (может конечно и промежуточные расчеты, но не уверен). А так-как в данный момент (после прохода этого учаска кода) интересующий меня байт "cl", находится и над стеком, и в "ecx". То контроллировать, приходится два места. Со стеком все ясно, а вот как контроллировать "ecx" ? Забыл дописать. Значение этого "cl"(и его клона из стека), переодически пересчитывается в других участках кода. Но пока, я отловил, только одно место, где оно, пересчитанное, лежит как в хранилище. И сдается мне, что это просто для сбития с толку. Потому-что дальше нигде не используется. Вот и хотелось бы иметь какой-нибудь "типа брейкпоинт", чтоб при прохождении нового участка кода, он меня тормозил на доступе к "cl". А я мог сразу пошагово исследовать его дальнейшее поведение. ![]() |
|
Создано: 13 марта 2012 19:39 · Личное сообщение · #7 |
|
Создано: 13 марта 2012 20:04 · Личное сообщение · #8 |
|
Создано: 13 марта 2012 20:17 · Поправил: neomant · Личное сообщение · #9 |
|
Создано: 13 марта 2012 21:11 · Личное сообщение · #10 Понятно, тока видимо сначала надо пересчитать все эти "EAX" и потом исследовать каждую функцию вм по отдельности. Правда нет уверенности, что какая-то из функций не "подправляет", bh-байт, или регистр esi. Там, в выложенном мной коде, показано, что EAX зависит от двух (третий не в счет) регистров, расчитанных ранее. Это ESI и BH. Или идти по каждому переходу и просто ставить за ним бряк? Ух и понажимать придется. ![]() ![]() |
|
Создано: 14 марта 2012 11:09 · Поправил: VodoleY · Личное сообщение · #11 Kuzya69 первое, определить что это за протектор. если кодевирт или вмпрот то плагин ВАМита тебе все эти микропрограммки (примитивы) пообзывает, и выстроит логику работы проги. Если руками... то надо каждый примитив разобрать, вычистить от мусора и попытаца описать его логику. потом ты сам можешь, если цыкл виртуальной машины опишеш, сможешь из этих примитивов строить логику проги. НО быстро не получица, гарантирую З.Ы. оооочень рекомендую для начала почитать описание общего механизма работы Sweeper от ВАМита, он там описывает общие принципы работы вмпрота, многие вопросы отпадут Code:
Вот тебе пример, это кодевиртулайзер... правда похоже на твой код? ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 14 марта 2012 16:59 · Личное сообщение · #12 А по какому, ключевому, свойству можно судить, что это именно вмпрот, а это именно кодевиртуалайзер? А вообще, пните ссылкой в нужном направлении, где можно конкретно про это почитать, чтоб вам не надоедать? А то сложновато сразу тему ВАМИТа разбирать, когда первый раз натыкаешься на виртуализацию. VodoleY Тут заметил еще, что у меня таких блоков (Main Handler), по меньшей мере два, один другому передает управление циклами. ![]() |
|
Создано: 14 марта 2012 17:02 · Поправил: VodoleY · Личное сообщение · #13 Kuzya69 2 блока это номально, это как бы скоко виртуальных машин у тебя... это настраиваеца когда протектор накладываеца на прогу. http://exelab.ru/f/action=vthread&forum=13&topic=17944&page=-1#29 попробуй. это для кодевирта. LODS BYTE PTR [ESI] и JMP DWORD PTR [EDI+EAX*4] очень характерные его свойства, про фимиду не помню, но вроде не ВМпрот это у тебя. http://exelab.ru/f/action=vthread&forum=13&topic=15906&page=12 а это творение ВАМита ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 14 марта 2012 20:56 · Поправил: Kuzya69 · Личное сообщение · #14 |
|
Создано: 14 марта 2012 21:39 · Личное сообщение · #15 Kuzya69 давай ты сначала почитаеш, а потом буш уже дальше вопросы задавать. СНЯТЬ виртуальную машину полностью, веееесьма проблематично. в лучшем случае ты получиш кусочки алгоритма. точнее.. можно все..но ты готов пол года потратить на это? это весьма трудоемкий процесс, если совсем руками то АД ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 14 марта 2012 22:01 · Поправил: Kuzya69 · Личное сообщение · #16 Ладно, спасибо. Пойду в библиотеку, почитаю. Просто сам не знаю откуда начать изучение, отсюда и куча "тупых" вопросов. ...но ты готов пол года потратить на это? Я готов и больше тратить, главное чтобы процесс не прерывался. Я же это изучаю для себя. А знание это бесценное сокровище. Самое сложное в тупиковой ситуации, понять в каком направлении надо дальше двигаться. Хорошо когда знающие подскажут, а если сам не правильно выберешь направление, то можно утонуть в море не нужной в данный момент информации. ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Как поставить брейкпоинт на доступ к регистру? |