Сейчас на форуме: asfa, bartolomeo (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Как поставить брейкпоинт на доступ к регистру?
Посл.ответ Сообщение

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 13 марта 2012 02:06 · Поправил: Kuzya69
· Личное сообщение · #1

Народ, подскажите как отследить на большом участке кода, когда программа использует содержимое регистра. Причем может использоваться не весь, а лишь часть этого регистра (ecx, cx, ch,cl). Можно ли, как по аналогии с бряком на доступ к памяти, задать какое-то условие, чтобы программа останавливалась в том месте, где используется содержимое этого регистра? Содержимое постоянно меняется. Я хотел сказать, что обрабатывается массив, байты которого заносятся в этот регистр. И в зависимости от значения байта этого массива, само содержимое используется в разных местах. ( но и не только от значения самого регистра). Я понимаю, что надо использовать трассировку, но не могу придумать условие.
А может у регистров тоже есть адрес, чтоб на него поставить "memory on access" ?
Использую Олли.




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 13 марта 2012 09:00
· Личное сообщение · #2

регистры - это регистры, это вам не память в диапазоне 00000000-FFFFFFтебе надо получить адрес самого массива.
И как только будет чтение с этого адреса, ну там +20 байт ещё, то останавливаешься.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 13 марта 2012 11:04
· Личное сообщение · #3

Kuzya69 трассу пусти, и в логах потом буш искать значения свои. (trace into)

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 13 марта 2012 13:26 · Поправил: Kuzya69
· Личное сообщение · #4

VodoleY А если трасса в текстовом файле достигает 90 мегабайт? И к тому-же надо найти когда из этого регистра чтение идет, причем отделить только нужные моменты. И тут-же проследить дальнейший путь, потому-что чтение идет в стек, а в следующий проход, стек уже может измениться.
Dart Sergius Ну про адрес это я так спросил, на всякий случай. Думал вдруг я чего не знаю, ведь в АВР-контроллерах, есть такое (регистры РОН имеют еще и физический адрес). В основном надежда была на какие-нибудь недокументированные возможности, плагины, скрипты.....
А может, при трассировке, какую нибудь "неточную команду" (так их в хелпе обозвали), можно придумать?



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 13 марта 2012 14:54
· Личное сообщение · #5

Kuzya69 у мну трассы по 2гб были, циклы вмпрота.. ниче страшного в этом нету. а вот со стеком это есть хорошо. тебе главное найти место в коде, где хотябы раз это сработает, а дальше ставь условные БП и лови.

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 13 марта 2012 19:35
· Личное сообщение · #6

Постараюсь вкратце описать. Вобщем код программы "зациклен" таким участком.
Code:
  1. 01767CFE: LODS    BYTE PTR DS:[ESI]                ; Start Deshifr for JMP
  2. ..............................
  3. 0176B6C8: PUSH    CX
  4. 0176B6CA: MOV     CL, 0D0
  5. ...............................
  6. Тут расчет 
  7. 1) eax=function(eax, bh, cl)
  8. 2) bh=function(bh,al)
  9. ...................................
  10. 0176C670: POP     CX
  11. ...................................
  12. 0176AAFC: JMP     DWORD PTR DS:[EDI+EAX*4]         ; Stop Deshifr for JMP

Соответственно, после этой комбинации, программа оказывается в непредсказуемом месте, поэтому где ставить условные брейкпоинты не сообразишь заранее.
К тому-же есть предчуствие, что код самомодифицируется. Пару раз встречал команды, которые пишут что-то в эту зону (может конечно и промежуточные расчеты, но не уверен).
А так-как в данный момент (после прохода этого учаска кода) интересующий меня байт "cl", находится и над стеком, и в "ecx". То контроллировать, приходится два места. Со стеком все ясно, а вот как контроллировать "ecx" ?
Забыл дописать. Значение этого "cl"(и его клона из стека), переодически пересчитывается в других участках кода. Но пока, я отловил, только одно место, где оно, пересчитанное, лежит как в хранилище. И сдается мне, что это просто для сбития с толку. Потому-что дальше нигде не используется.
Вот и хотелось бы иметь какой-нибудь "типа брейкпоинт", чтоб при прохождении нового участка кода, он меня тормозил на доступе к "cl". А я мог сразу пошагово исследовать его дальнейшее поведение.




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 13 марта 2012 19:39
· Личное сообщение · #7

Сильно напоминает циклы вм



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 13 марта 2012 20:04
· Личное сообщение · #8

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




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 13 марта 2012 20:17 · Поправил: neomant
· Личное сообщение · #9

EAX - код операции, EDI - начало таблицы переходов на обработчики инструкций виртуальной машины. На адреса этих обработчиков и ставь бряки.

-----
Следуй за белым кроликом




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 13 марта 2012 21:11
· Личное сообщение · #10

Понятно, тока видимо сначала надо пересчитать все эти "EAX" и потом исследовать каждую функцию вм по отдельности. Правда нет уверенности, что какая-то из функций не "подправляет", bh-байт, или регистр esi. Там, в выложенном мной коде, показано, что EAX зависит от двух (третий не в счет) регистров, расчитанных ранее. Это ESI и BH.

Или идти по каждому переходу и просто ставить за ним бряк? Ух и понажимать придется.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 14 марта 2012 11:09 · Поправил: VodoleY
· Личное сообщение · #11

Kuzya69 первое, определить что это за протектор. если кодевирт или вмпрот то плагин ВАМита тебе все эти микропрограммки (примитивы) пообзывает, и выстроит логику работы проги. Если руками... то надо каждый примитив разобрать, вычистить от мусора и попытаца описать его логику. потом ты сам можешь, если цыкл виртуальной машины опишеш, сможешь из этих примитивов строить логику проги. НО быстро не получица, гарантирую
З.Ы. оооочень рекомендую для начала почитать описание общего механизма работы Sweeper от ВАМита, он там описывает общие принципы работы вмпрота, многие вопросы отпадут
Code:
  1. //////// Main Handler
  2. 02FFD34E LODS BYTE PTR [ESI]
  3. 02FFD34F ADD AL,BL
  4. 02FFF9C6 XOR AL,0xd2
  5. 02FFFC9D SUB AL,0xf1
  6. 0300057A ADD BL,AL
  7. 02FFD70B MOVZX EAX,AL
  8. 02FFD70E JMP DWORD PTR [EDI+EAX*4]
  9. ///////////////////////////////////////////////////////////
  10. //////// Virtual Handler 0000
  11. 02FFF6CB POP EAX
  12. 03001335 ADD DWORD PTR [ESP],EAX
  13. 03001338 PUSHFD 
  14. ///////////////////////////////////////////////////////////
  15. //////// Virtual Handler 0001
  16. 030001C9 POP CX
  17. 03000C1A SAR BYTE PTR [ESP],CL
  18. 03000C1D PUSHFD 
  19. ///////////////////////////////////////////////////////////

Вот тебе пример, это кодевиртулайзер... правда похоже на твой код?

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 14 марта 2012 16:59
· Личное сообщение · #12

А по какому, ключевому, свойству можно судить, что это именно вмпрот, а это именно кодевиртуалайзер?
А вообще, пните ссылкой в нужном направлении, где можно конкретно про это почитать, чтоб вам не надоедать?
А то сложновато сразу тему ВАМИТа разбирать, когда первый раз натыкаешься на виртуализацию.
VodoleY Тут заметил еще, что у меня таких блоков (Main Handler), по меньшей мере два, один другому передает управление циклами.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 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 а это творение ВАМита

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....


| Сообщение посчитали полезным: Kuzya69

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 14 марта 2012 20:56 · Поправил: Kuzya69
· Личное сообщение · #14

VodoleY это как бы скоко виртуальных машин у тебя...
Что-то типа виртуалка в виртуалке? То-есть дважды снимать придется?



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 14 марта 2012 21:39
· Личное сообщение · #15

Kuzya69 давай ты сначала почитаеш, а потом буш уже дальше вопросы задавать. СНЯТЬ виртуальную машину полностью, веееесьма проблематично. в лучшем случае ты получиш кусочки алгоритма. точнее.. можно все..но ты готов пол года потратить на это? это весьма трудоемкий процесс, если совсем руками то АД

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 14 марта 2012 22:01 · Поправил: Kuzya69
· Личное сообщение · #16

Ладно, спасибо. Пойду в библиотеку, почитаю. Просто сам не знаю откуда начать изучение, отсюда и куча "тупых" вопросов.
...но ты готов пол года потратить на это?
Я готов и больше тратить, главное чтобы процесс не прерывался. Я же это изучаю для себя. А знание это бесценное сокровище. Самое сложное в тупиковой ситуации, понять в каком направлении надо дальше двигаться. Хорошо когда знающие подскажут, а если сам не правильно выберешь направление, то можно утонуть в море не нужной в данный момент информации.


 eXeL@B —› Вопросы новичков —› Как поставить брейкпоинт на доступ к регистру?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати