Сейчас на форуме: vsv1, r0lka, -Sanchez-, testrev1337, johnniewalker (+3 невидимых)

 eXeL@B —› Крэки, обсуждения —› Определение адреса хардварного брейка в ODbgScript
Посл.ответ Сообщение


Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 05 февраля 2010 13:25
· Личное сообщение · #1

Тема повисела в "Вопросах новичков" но никто из посетивших не отписался, видимо зубры в "новички" не ходят.

Поэтому вынужден повторить тут .

Olly Script

Например есть команда, на нее ставлю апаратный останов на запись в память. Одновременно несколько таких адресов.

EIP-6 | MOV DWORD PTR DS:[EDI+4E0],EAX
EIP <===== Hardware Break

Останавливаюсь с EIP ниже команды осуществившей запись.

Как получить адрес доступа, для определения какой из апаратных остановов
сработал?

Пробую делать так:

bphws _addr0, "w" ; ставлю хардварные бряки ОК
bphws _addr1, "w"
bphws _addr2, "w"
bphws _addr3, "w"
erun ; брейк ОК
preop eip ; получаю адрес предыдущей команды ОК
gopi $RESULT, 1, ADDR ; пытаюсь получить адрес доступа

но получаю данные по команде на EIP, а не по команде которая выше.

Что делаю не так в этом способе, а может есть другой для определения которая
из точек сработала?

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 61.4 (постоянный), 1thx
Активность: 0.020
Статус: Участник

Создано: 05 февраля 2010 13:41
· Личное сообщение · #2

bpgoto не подойдёт?




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 05 февраля 2010 17:04 · Поправил: mak
· Личное сообщение · #3

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

Не знаю связано ли это как то с выполнением команды преоп или гопи , но там была кажется проблема интерпретации команда типа MOV DWORD PTR DS:[EDI+4E0],EAX из за отсуствия 0 операнда впереди...

PS

Попробовал сейчас сделать , на запись в стек

Code:
  1. bphws 0012FFB0, "w"
  2. erun
  3. gopi eip, 1, ADDR
  4. mov eax,$RESULT


и все нормальное получилось , preop eip не использовал , так как встал сразу на команде записи, ща поробую в другой район памяти. Оллискрипт последний

PS - 2 Попробовал на секции кода или дате , команда встает после выполнения , делаю преоп также и уже результат 0 ... ничего неполучается , хотя на стеке все было хорошо

PS - 3 Все заработало , сделал вот так
Code:
  1. bphws 00401EBA, "w" 
  2. bphws 00401EBE, "w"
  3. bphws 00401EC2, "w"
  4. erun
  5. preop eip
  6. PUSH eip
  7. MOV eip,$RESULT
  8. gopi eip, 1, ADDR
  9. mov eax,$RESULT
  10. POP eip


на стеке еще не тестировал

У тебя будет вот так где то
Code:
  1. bphws _addr0, "w" ; ставлю хардварные бряки ОК
  2. bphws _addr1, "w" 
  3. bphws _addr2, "w" 
  4. bphws _addr3, "w" 
  5. erun ; брейк ОК
  6. preop eip ; получаю адрес предыдущей команды ОКPUSH eip
  7. MOV eip,$RESULT
  8. gopi eip, 1, ADDR
  9. mov eax,$RESULT
  10. POP eip


PS - 4
на стеке отработало тоже хорошо по данному варианту

kioresk пишет:
Имхо еще EIP лучше сохранять и восстанавливать из переменной, чтобы в стэк не лезть, а то мало ли что.


ага , просто код нормально отрабатвает с еип только .. лично у меня .. в скрипте влом строчить переменные было , на скорую руку делалось. А вообще нужно приучаться сразу делать как надо

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 154.2 (ветеран), 66thx
Активность: 0.080
Статус: Участник
REVENGE Crew

Создано: 05 февраля 2010 18:29
· Личное сообщение · #4

Имхо еще EIP лучше сохранять и восстанавливать из переменной, чтобы в стэк не лезть, а то мало ли что.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 05 февраля 2010 18:44
· Личное сообщение · #5

OKOB
> Как получить адрес доступа, для определения какой из апаратных остановов сработал?
Регистр Dr6, биты [0%3].




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 05 февраля 2010 19:10
· Личное сообщение · #6

Спасибо всем. Получилось по способу МАКа с учетом замечания kioresk.

Но все таки не понятно по поводу самой команды, почему по EIP отрабатывает, а по ADDR нет, хотя синтаксис команды это предполагает. Посмотрел сырки, вроде все правильно - дизассемблируется команда по адресу и из структуры возвращается значение. Видно блохи самой Олли.

-----
127.0.0.1, sweet 127.0.0.1





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 05 февраля 2010 19:27
· Личное сообщение · #7

кстати о том что Clerk сказал тоже сразу подумал , но хз как это на практике в скрипте отрабатывать будет... надо попробовать

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube



 eXeL@B —› Крэки, обсуждения —› Определение адреса хардварного брейка в ODbgScript
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати