· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.RESEARCH —› Структура брейкпойнтов SoftIce

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Ноя 2, 2003 15:38:40

_http://ks.x-bees.com/soft/book/siug.rar
Тоже про софтайс, тоже на руском (прада старовата).

З.Ы.: НЕ ПИНАТЬ... :)))


Дата: Ноя 3, 2003 12:32:21 · Поправил: Four-F

Добрался я до компа, где памятка лежит. В общем, очень давно хотел я статью писАть про всякие хитрости с бряками. Сохранились черновики. Одним из примеров как раз и было как отловить чтение/запись в конкретный регистр. И вообще как отловить практически любую инструкцию. Эксперименты делались под кириллической 98SE. Под NT+ этот трюк, естественно, работать не будет, т.к. там нет bpr, на которой все завязано. Вот кусок черновика. Должно быть все понятно. Будут вопросы - спрашивайте.

Egorka, конкретно в твоём случае все намного проще. Ставишь бряк на диапазон и сравниваешь esi.
bpr <low eip> <high eip> r if esi==C8
А вот если нужно отловить чтение из esi, что гораздо труднее, то тогда уже эти примеры пригодятся.
======================================================================  ===========

Пример отлова точки выполнения определенной инструкции
Notepad.exe (оконная процедура)

0187:00401C74  55                  PUSH      EBP
0187:00401C75  8BEC                MOV       EBP,ESP                            
0187:00401C77  56                  PUSH      ESI                                
0187:00401C78  8B750C              MOV       ESI,[EBP+0C]                       
0187:00401C7B  83FE05              CMP       ESI,05                             
0187:00401C7E  7714                JA        00401C94                           
0187:00401C80  0F8406010000        JZ        00401D8C                           
0187:00401C86  83FE02              CMP       ESI,02                             
0187:00401C89  0F84F0000000        JZ        00401D7F                           
0187:00401C8F  E983000000          JMP       00401D17                           
0187:00401C94  83FE10              CMP       ESI,10                             
0187:00401C97  7723                JA        00401CBC                           
0187:00401C99  0F84A1010000        JZ        00401E40                           
0187:00401C9F  83FE06              CMP       ESI,06                             
0187:00401CA2  0F8422010000        JZ        00401DCA                           
0187:00401CA8  83FE07              CMP       ESI,07                             
0187:00401CAB  0F8452010000        JZ        00401E03                           
0187:00401CB1  83FE08              CMP       ESI,08                             
0187:00401CB4  0F846E010000        JZ        00401E28                           
0187:00401CBA  EB5B                JMP       00401D17                           
0187:00401CBC  83FE1A              CMP       ESI,1A                             
0187:00401CBF  7711                JA        00401CD2                           
0187:00401CC1  0F84E5030000        JZ        004020AC                           
0187:00401CC7  83FE11              CMP       ESI,11                             
0187:00401CCA  0F84D0010000        JZ        00401EA0                           
0187:00401CD0  EB45                JMP       00401D17                           

Допустим надо прерваться при выполнении команды JA XXXXXXXX (опкод 77??)
Ставим bpr на диапазон внутри которого надо искать JA:
	bpr 00401C74 00401CD0 r if byte(*EIP)==77

Прервемся по адресам:
0187:00401C7E  7714                JA        00401C94
0187:00401C97  7723                JA        00401CBC
0187:00401CBF  7711                JA        00401CD2


Или ищем CMP ESI, XX (опкод 83FE??):
	bpr 00401C80 00401CD0 r if word(*EIP)==fe83

Прервемся по адресам:
0187:00401C7B  83FE05              CMP       ESI,05                             
0187:00401C86  83FE02              CMP       ESI,02                             
0187:00401C94  83FE10              CMP       ESI,10                             
0187:00401C9F  83FE06              CMP       ESI,06                             
0187:00401CA8  83FE07              CMP       ESI,07                             
0187:00401CB1  83FE08              CMP       ESI,08                             
0187:00401CBC  83FE1A              CMP       ESI,1A                             
0187:00401CC7  83FE11              CMP       ESI,11                             


======================================================================  ===========

Пример отлова чтения регистра EAX
                                   des sor
8BC0 mov eax,eax   1000 101 1   11 000 000
8BD0 mov edx,eax   1000 101 1   11 010 000
8BC8 mov ecx,eax   1000 101 1   11 001 000
8BD8 mov ebx,eax   1000 101 1   11 011 000
8BF0 mov esi,eax   1000 101 1   11 110 000
8BF8 mov edi,eax   1000 101 1   11 111 000


(7 HEX = 00000111 BIN)
:bpr <low eip> <high eip> r if (byte(*eip)==8b)&&!((byte(*(eip+1)))&7)

0187:0040103D  33C0                XOR       EAX,EAX
0187:0040103F  33D2                XOR       EDX,EDX
0187:00401041  33C9                XOR       ECX,ECX
0187:00401043  33DB                XOR       EBX,EBX
0187:00401045  33F6                XOR       ESI,ESI
0187:00401047  33FF                XOR       EDI,EDI
0187:00401049  B8FF000000          MOV       EAX,000000FF
0187:0040104E  8BC0                MOV       EAX,EAX <-break
0187:00401050  8BCA                MOV       ECX,EDX
0187:00401052  8BCB                MOV       ECX,EBX
0187:00401054  8BCE                MOV       ECX,ESI
0187:00401056  8BD0                MOV       EDX,EAX <-break
0187:00401058  8BCA                MOV       ECX,EDX
0187:0040105A  8BCB                MOV       ECX,EBX
0187:0040105C  8BCE                MOV       ECX,ESI
0187:0040105E  8BCA                MOV       ECX,EDX
0187:00401060  8BCB                MOV       ECX,EBX
0187:00401062  8BCE                MOV       ECX,ESI
0187:00401064  8BC8                MOV       ECX,EAX <-break
0187:00401066  8BCA                MOV       ECX,EDX
0187:00401068  8BCB                MOV       ECX,EBX
0187:0040106A  8BCE                MOV       ECX,ESI
0187:0040106C  8BCA                MOV       ECX,EDX
0187:0040106E  8BCB                MOV       ECX,EBX
0187:00401070  8BCE                MOV       ECX,ESI
0187:00401072  8BD8                MOV       EBX,EAX <-break
0187:00401074  8BCA                MOV       ECX,EDX
0187:00401076  8BCB                MOV       ECX,EBX
0187:00401078  8BCE                MOV       ECX,ESI
0187:0040107A  8BF0                MOV       ESI,EAX <-break
0187:0040107C  8BCA                MOV       ECX,EDX
0187:0040107E  8BCB                MOV       ECX,EBX
0187:00401080  8BCE                MOV       ECX,ESI
0187:00401082  8BF8                MOV       EDI,EAX <-break
0187:00401084  50                  PUSH      EAX
0187:00401085  58                  POP       EAX
0187:00401086  68B80B0000          PUSH      00000BB8

:bpr 40103d 401086 r if (byte(*eip)==8b)&&!((byte(*(eip+1)))&7)
BPR #0030:0040103D #0030:00401086 R IF ((BYTE(*(EIP))==0x8B)&&!((BYTE(*((EIP+1)))&7)))


=================================================================================

Пример отлова чтения регистра EDI на примере Calc.exe

:class calc                                                                     
Handle  Class Name                  Owner           Wndw Proc        Styles     
----------------------------- Application Private ------------------------------
5014    SciCalc                     CALC            4167:0000033A    07000000   

----------------------------------------------------------------------  ----------
:u4167:0000033A

4167:033A  66682A590001        PUSH      0100592A
4167:0340  666800000300        PUSH      00030000
4167:0346  EA16766F01          JMP       016F:7616    
                                             
----------------------------------------------------------------------  ----------
:u&0100592A

018F:0100592A  55                  PUSH      EBP
018F:0100592B  8BEC                MOV       EBP,ESP
018F:0100592D  83EC10              SUB       ESP,10 
018F:01005930  53                  PUSH      EBX
018F:01005931  56                  PUSH      ESI
018F:01005932  57                  PUSH      EDI
; в EDI помещается uMsg. Где-то дальше оно будет скопировано в EAX.
018F:01005933  8B7D0C              MOV       EDI,[EBP+0C]
018F:01005936  83FF10              CMP       EDI,10
018F:01005939  0F87E4000000        JA        01005A23

----------------------------------------------------------------------  ----------
:map32 calc
Owner     Obj Name  Obj#  Address        Size      Type
CALC      .text     0001  0187:01001000  00011A0E  CODE  RO
CALC      .data     0002  018F:01013000  00000F84  IDATA RW
CALC      .rsrc     0003  018F:01014000  00003000  IDATA RO

8BC7 mov reg, edi   10001011   11 xxx 111
----------------------------------------------------------------------  ----------
:bpr 01001000 01001000+00011a0e r if byte(*eip)==8b&&(byte(*(eip+1))&7)==7

0187:01005ACA  E919020000          JMP       01005CE8
0187:01005ACF  8BC7                MOV       EAX,EDI			; <-break
0187:01005AD1  83E853              SUB       EAX,53


:bpr 01001000 01001000+00011a0e r if byte(*eip)==8b&&(byte(*(eip+1))&7)==7      
Break due to BPR #0030:01001000 #0030:01012A0E R IF ((BYTE(*(EIP))==0x8B)&&((BYTE(*((EIP+1)))&7)==7))                           

=================================================================================


Дата: Ноя 3, 2003 17:35:08

Four-F
Не ставятся чего твои бряки.
Ни под 98 ни под Ме.
Хотя ставил на те адреса где точно есть ESI.
BPX adderess IF ESI==C8 - срабатывает
а
BPR adderess adderess IF ESI==C8 - нет (на тот же адрес)

Может у меня Айс не настроен или руки -крюки?


Дата: Ноя 3, 2003 17:57:47

Egorka

bpr <low eip> <high eip> r if esi==C8

Ты "r" случайно не забываешь поставить??


Дата: Ноя 3, 2003 19:06:02

Во-первых, как будет себя вести bpr при совпадении начального и конечного адресов я не знаю. В этом случае надо ставить
bpm address x if esi==c8
Если же именно на диапазон, то нужно явно указать модификатор r, т.к. насколько я помню айс по умолчанию детектит только запись в диапазон. Т.е. для тебя так:
bpr <low eip> <high eip> r if esi==C8

Те же примеры, что я привел были проверены практически и 100% работали.


Дата: Ноя 3, 2003 19:14:25

Мне интересно, а есть ли какое-нибудь внятное объяснение отсутствию
команды bpr в Айсах под NT+??
Безусловно bpr полезная фича и не всегда есть возможность заменить её
чем то ещё.


Дата: Ноя 3, 2003 19:24:33

Four-F
Твой пример - явно штука полезная.
Мне помогла разобраться, но только в другом.
r я ставил, но попробую еще.


Дата: Ноя 4, 2003 08:21:36

Four-F
Спасибо, очень ценная информация!
Итересно, а TRW будет работать bpr?


Дата: Ноя 4, 2003 11:48:30

Итересно, а TRW будет работать bpr?

Гы-гы ;-)

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.074