Используя cdb, у меня есть следующая условная точка останова
bp 004bf9f8 ".if (@eax = 0) {.echotime;.echo Breakpoint 004bf9f8;r};gc"
Поскольку это делается для исследования прерывистой проблемы, она должна оставаться подключенной в течение некоторого времени, но условная точка останова замедляется общая производительность приложения намного больше, чем я могу себе позволить.
- Кто-нибудь знает, как оптимизировать условную точку останова? Все, что он делает, это проверяет
eax=0
. Я прочитал некоторые записи , объясняющие , почему условные точки останова так сильно тормозят, и они имеют смысл, поэтому я предполагаю, что это тупик. - Я могу в значительной степени делать то, что я хочу с изображением в памяти. Можно ли пропатчить некоторые инструкции, чтобы вставить что-то вроде
if eax = 0 { <whatever>}
, чтобы я мог добавить безусловную точку останова на <whatever>
?
Edit
из комментариев план действий состоит в следующем:
.dvalloc <bytes>
и сохраняют результат в переменной с именем patch
a 004bfa08 JMP patch
a patch MOV eax,esi
a patch+x CMP eax,0
a patch+y JNE 004bfa0a
a patch+z JMP 004bfa0a
и теперь я смогу добавить безусловную точку останова на patch+z
, чтобы выгружать нужную мне информацию без остановки приложения.
bp patch+z ".echotime;.echo Breakpoint patch+z;~.;r;!dpx;gc"
Редактировать 2
После PO C работает в сеансе отладки в режиме реального времени, но его все равно необходимо преобразовать в сценарий, который не останавливает приложение, ожидает нажатия клавиш или что-либо еще.
Выполненные команды
.dvalloc 1000
a 004bfa00
JMP 0x0c570000
NOP
a 0xc570000
mov edi,edx
mov esi,eax
mov ebp,edi
cmp eax,0
jne 0x004bfa06
jmp 0x004bfa06
bp 0c570011 ".echo Hello World"
Выполненные команды, включая вывод / контекст
0:010> .dvalloc 1000
Allocated 1000 bytes starting at 0c570000
0:010> u 004bf9f8 LD
application+0xbf9f8:
004bf9f8 53 push ebx
004bf9f9 56 push esi
004bf9fa 57 push edi
004bf9fb 55 push ebp
004bf9fc 51 push ecx
004bf9fd 890c24 mov dword ptr [esp],ecx
004bfa00 8bfa mov edi,edx |
004bfa02 8bf0 mov esi,eax |-> these get overwritten so repeat in patch
004bfa04 8bef mov ebp,edi |
004bfa06 8bd5 mov edx,ebp
004bfa08 8bc6 mov eax,esi
004bfa0a e8e5feffff call application+0xbf8f4 (004bf8f4)
0:010> a 004bfa00
JMP 0x0c570000
NOP
0:010> u 004bf9f8 LD
application+0xbf9f8:
004bf9f8 53 push ebx
004bf9f9 56 push esi
004bf9fa 57 push edi
004bf9fb 55 push ebp
004bf9fc 51 push ecx
004bf9fd 890c24 mov dword ptr [esp],ecx
004bfa00 e9fb050b0c jmp 0c570000
004bfa05 90 nop
004bfa06 8bd5 mov edx,ebp
004bfa08 8bc6 mov eax,esi
004bfa0a e8e5feffff call application+0xbf8f4 (004bf8f4)
0:010> a 0xc570000
0c570000 mov edi,edx
mov edi,edx
0c570002 mov esi,eax
mov esi,eax
0c570004 mov ebp,edi
mov ebp,edi
0c570006 cmp eax,0
cmp eax,0
0c57000b jne 0x004bfa06
jne 0x004bfa06
0c570011 jmp 0x004bfa06
jmp 0x004bfa06
0c570016
0:010> u 0x0c570000 L6
0c570000 8bfa mov edi,edx
0c570002 8bf0 mov esi,eax
0c570004 8bef mov ebp,edi
0c570006 3d00000000 cmp eax,0
0c57000b 0f85f5f9f4f3 jne application+0xbfa06 (004bfa06)
0c570011 e9f0f9f4f3 jmp application+0xbfa06 (004bfa06)
0:010> bp 0c570011 ".echo Hello World"
Редактировать 3
ручное исправление 7 запущенных исполняемых файлов прошло успешно, но в зависимости от адреса, возвращаемого .dvalloc
, Собранная JMP
инструкция содержит другую инструкцию. Я предполагал, что это будет так же просто, как вычитать адрес, к которому мы переходим, из адреса, полученного из .dvalloc
, но это не так.
-------------------------------------------------------------
.dvalloc+0x11 |a jmp 004bfa06 |opcode |cd |LE
--------------|---------------|-------|---------|------------
1. 00df0011 |e9f0f96cff |e9 |f0f96cff |ff 6c f9 f0
2. 00e30011 |e9f0f968ff |e9 |f0f968ff |ff 68 f9 f0
3. 00f00011 |e9f0f95bff |e9 |f0f95bff |ff 5b f9 f0
4. 00ff0011 |e9f0f94cff |e9 |f0f94cff |ff 4c f9 f0
5. 093a0011 |e9f0f911f7 |e9 |f0f911f7 |f7 11 f9 f0
6. 0c570011 |e9f0f9f4f3 |e9 |f0f9f4f3 |f3 f4 f9 f0
7. 0ce70011 |e9f0f964f3 |e9 |f0f964f3 |f3 64 f9 f0
-------------------------------------------------------------
Первый f
является знаковым битом возможно?
Редактировать 4
В конце концов, расчет прост, хотя и занял у меня достаточно много времени. Первый f
действительно является знаком.
- Возьмите адрес, чтобы перейти к. В моем случае
004bfa06
- Вычтите конец ячейки памяти инструкции
jmp 004bfa06
. В моем случае это всегда .dvalloc+0x16
(.dvalloc+0x11
- начало инструкции)
Применительно к моей последней попытке (7), что дает
004fba01 - 0ce70016 = f3 64 f9 f0.
The instruction to edit the memory at 0ce70011 then becomes e9f0f964f3.
Ниже приведен пролог функции, в котором я устанавливаю точку останова. Инструкция на 004bfa08 (MOV param_1,ESI)
является избыточной из-за предыдущей инструкции на 004bfa02 (MOV ESI,param_1)
, поэтому она может быть полезной, но мне не хватает знаний о том, как действовать дальше.
**************************************************************
* FUNCTION *
**************************************************************
int * __register FUN_004bf9f8(int param_1, int param_2,
int * EAX:4 <RETURN>
int EAX:4 param_1
int EDX:4 param_2
int ECX:4 param_3
undefined4 Stack[-0x14]:4 local_14
004bf9f8 53 PUSH EBX
004bf9f9 56 PUSH ESI
004bf9fa 57 PUSH EDI
004bf9fb 55 PUSH EBP
004bf9fc 51 PUSH param_3
004bf9fd 89 0c 24 MOV dword ptr [ESP]=>local_14,param_3
004bfa00 8b fa MOV EDI,param_2
004bfa02 8b f0 MOV ESI,param_1
004bfa04 8b ef MOV EBP,EDI
004bfa06 8b d5 MOV param_2,EBP
004bfa08 8b c6 MOV param_1,ESI
004bfa0a e8 e5 fe CALL FUN_004bf8f4
ff ff
004bfa0f 8b d8 MOV EBX,param_1