Nano Hash - криптовалюты, майнинг, программирование

WinDbg — подсчет попаданий в точку останова, когда определенные значения находятся в стеке

Я не говорю о стеке вызовов.

Я хочу посчитать, сколько раз вызывается определенная функция, когда по адресу, удерживаемому ESP, находится определенное значение. Прежде чем вы скажете мне проверить адрес возврата, я не заинтересован в этом - адрес возврата в этом случае находится на ESP + 4, [ESP] содержит значение, которое извлекается до того, как функция вернется. Детали неважны.

Я могу подсчитывать вызовы функций со следующим синтаксисом:

bp MyFunction "r @$t0 = @$t0 + 1; r @$t0; gc"

Я могу отобразить двойное слово в [ESP], добавив

dd $csp L1

к вышеуказанной команде.

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

Я все еще привыкаю к ​​синтаксису WinDbg. Как должно выглядеть условие в моем выражении .if?

Я пробовал некоторые сумасшедшие вещи, такие как

.if( (dd $csp L1) == 2 )

Но это явно неправильно.

Я также думал об установке точки останова где-то в функции после того, как значение в [ESP] будет перемещено в локальную переменную (что-то вроде bp MyFunction+eip_after_assignment), но это уже слишком поздно. Я думаю, что могу работать с этим, но было бы проще, если бы я мог просто проверить [ESP] в начале.

29.09.2014

  • Не могли бы вы попробовать .if(poi($csp) == 2), пожалуйста? 29.09.2014
  • @ Томас В. это то, что я искал. Спасибо. Сейчас по-прежнему ломается на всех звонках, но засчитываются только интересующие меня. Я полагаю, есть способ вообще не ломаться, когда условие не выполняется? 29.09.2014
  • Вы имеете в виду как .if (Condition) { Commands } .else { g; }? К сожалению, я не могу попробовать все это в данный момент. 29.09.2014
  • Это все еще ломается, но входит в другой путь, и выдается команда продолжения. Что-то вроде .if(условие) {break}. При большом количестве звонков система зависает на несколько секунд из-за большого количества перерывов. Сейчас это не проблема, просто любопытство. Я немного поиграю с EIP, чтобы увидеть, где я в конечном итоге. 29.09.2014
  • @ТомасВ. Ветвь else должна использовать gc вместо g, чтобы выполнение возобновилось с использованием того же типа выполнения, который использовался ранее. 29.09.2014

Ответы:


1

0:000> lsa .

     2: int dummy=0;
     3: void useless(int in) {
     4:     dummy=in;
     5: }
>    6: void main(void) {
     7:     for(int i=0;i<0xffffffff;i++)
     8:         useless(i);        
     9: }

0:000> uf countfunc!useless

countfunc!useless [c:\countfunc.cpp @ 3]:
    3 00401000 55              push    ebp
    3 00401001 8bec            mov     ebp,esp
    4 00401003 8b4508          mov     eax,dword ptr [ebp+8]
    4 00401006 a320bb4000      mov     dword ptr [countfunc!dummy (0040bb20)],eax
    5 0040100b 5d              pop     ebp
    5 0040100c c3              ret

0:000> bl 0:000> bp 0040100b ".if ( poi(@$csp+8) != 1337 ) {gc}" 0: 000> .bpcmds

bp0 0x0040100b  ".if ( poi(@$csp+8) != 1337 ) {gc}";

0:000> г

> eax=00001337 ebx=7ffdf000 ecx=00001337 edx=0040c340 esi=00000000
> edi=0098f6ee eip=0040100b esp=0013ff68 ebp=0013ff68 iopl=0         nv
> up ei pl nz ac po cy cs=001b  ss=0023  ds=0023  es=0023  fs=003b 
> gs=0000             efl=00000213 countfunc!useless+0xb: 0040100b 5d   
> pop     ebp

0:000> ?? in
int 0n4919
0:000> dv
in = 0n4919
0:000> ? 0n4919/1
Оценить выражение: 4919 = 00001337

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

0:000> r $t0 = 0; bp 0040100b ".if ( poi(@$csp+8) != @$t0*1337 ) {gc} .else { .echotime ;? poi(@$csp+8) ; r$t0 = @$t0+1 ;gc }"
0:000> .bpcmds
bp0 0x0040100b  ".if ( poi(@$csp+8) != @$t0*1337 ) {gc} .else { .echotime ;? poi(@$csp+8) ; r$t0 = @$t0+1 ;gc }";
0:000> .echotime
Debugger (not debuggee) time: Tue Sep 30 12:12:15.890 2014 
0:000> g
Debugger (not debuggee) time: Tue Sep 30 12:12:24.062 2014 
Evaluate expression: 0 = 00000000
Debugger (not debuggee) time: Tue Sep 30 12:12:32.578 2014 
Evaluate expression: 4919 = 00001337
Debugger (not debuggee) time: Tue Sep 30 12:12:41.093 2014 
Evaluate expression: 9838 = 0000266e
Debugger (not debuggee) time: Tue Sep 30 12:12:49.609 2014 
Evaluate expression: 14757 = 000039a5
Debugger (not debuggee) time: Tue Sep 30 12:12:58.156 2014 
Evaluate expression: 19676 = 00004cdc
Debugger (not debuggee) time: Tue Sep 30 12:13:06.687 2014 
Evaluate expression: 24595 = 00006013
Debugger (not debuggee) time: Tue Sep 30 12:13:15.218 2014 
Evaluate expression: 29514 = 0000734a
Debugger (not debuggee) time: Tue Sep 30 12:13:23.765 2014 
Evaluate expression: 34433 = 00008681
Debugger (not debuggee) time: Tue Sep 30 12:13:32.828 2014 
Evaluate expression: 39352 = 000099b8
Debugger (not debuggee) time: Tue Sep 30 12:13:40.906 2014 
Evaluate expression: 44271 = 0000acef

этот простой код может занять 86 дней, если он будет продолжаться в том же духе, кажется, что обработка 4919 вызовов функций в Windbg занимает ~ 8,5 секунд.

30.09.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..