|
|
| Посл.отвђт | Сообщен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? Гы-гы ;-) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.074 |