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

WinDbg — сравнить строковый аргумент со строкой из памяти

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

Например, строка расположена по определенному смещению внутри загруженного PE. Итак, я могу легко прочитать строку, выполнив da /c 100 <addr>. Но как я могу использовать эту строку, чтобы сравнить ее с arg1 в скрипте WinDbg, используя .if? (и $SPAT(), наверное)

Я пытался прочитать вывод команды da в Псевдоним или Определяемый пользователем регистр, но безуспешно.


  • Я не помню, как получить командную строку WinDbg. Однако вы можете написать расширение, которое делает это. 26.09.2017
  • @conio, что ты имеешь в виду под расширением? Разве нет способа просто прочитать строку с определенного адреса? (возможно, с использованием синтаксиса MASM/@@c++) Я просто думаю, что крайне маловероятно, что такую ​​тривиальную задачу невозможно выполнить с помощью сценариев WinDbg. 26.09.2017
  • @ThomasWeller Я просто хочу сравнить переданный аргумент, который содержит строку, со строкой, хранящейся в определенном смещении в загруженном PE. Подстановочные знаки здесь не важны. 26.09.2017
  • @conio: есть -c, который можно использовать для выполнения команд. Смотрите мой ответ ниже. Не произвольная командная строка, а что-то под вашим контролем. 26.09.2017

Ответы:


1

Вы можете назначить строку псевдониму, используя as /c:

0:012> as /c Hello .printf "%ma", 06130000
0:012> .echo @"${Hello}"
Hello world

Затем вы можете использовать $spat() на нем:

0:012> ? $spat(@"${Hello}","*ell*")
Evaluate expression: 1 = 00000000`00000001
0:012> ? $spat(@"${Hello}","x*")
Evaluate expression: 0 = 00000000`00000000

Чтобы управлять шаблоном из командной строки, установите другой псевдоним с помощью переключателя командной строки -c:

windbg -c "as Pattern *ell*"

// this line is from the command line argument
0:006> as Pattern *ell*

0:006> .dvalloc 1000
Allocated 1000 bytes starting at 04610000
0:006> ea 04610000 "Hello world"
0:006> as /c Hello .printf "%ma", 04610000
0:006> .echo ${Pattern}
*ell*
0:006> .echo ${Hello}
Hello world
0:006> ? $spat(@"${Hello}", @"${Pattern}")
Evaluate expression: 1 = 00000001
26.09.2017
  • Почти тривиально, не так ли? 26.09.2017
  • определенно.. ;_; 26.09.2017
  • Почему as /c Name .printf "%m(s)u/a", Address, а не просто as /m(s)u/a Name Address? 27.09.2017
  • @conio: действительно. Сначала у меня были проблемы с кавычками, но теперь это может сработать. 27.09.2017
  • Я бы хотел, чтобы это можно было использовать для режима ядра, это только пользовательский режим. Моя альтернатива - захватить пространство памяти ранее выделенного qint. 15.02.2018

  • 2

    такой javascript тоже можно использовать

    function log(instr) {
        host.diagnostics.debugLog(instr + "\n");
    }
    function initializeScript(){
        return [new host.namedModelParent(foo, "Debugger.Models.Process")];
    }
    class foo {
        Init(comparand)    {
            var peb             = host.currentProcess.Environment.EnvironmentBlock;
            var cmdlinebuff     = peb.ProcessParameters.CommandLine.Buffer;
            var cmdline         = host.memory.readWideString(cmdlinebuff);
            var progname        = cmdline.slice(0, cmdline.indexOf(" "));
            var argname1        = cmdline.slice(cmdline.indexOf(" ")+1);
            log (progname);
            log (argname1);
            if(comparand==argname1)        {
                log ( "argument matches with comparand");
            }else{
                log("argument does not match with comparand ");
            }       
        }
    }
    

    и запустить его так

    C:\>cdb -c ".load jsprovider;.scriptload c:\cmdln.js" calc my_1337_cmdline
    
    0:000> cdb: Reading initial command '.load jsprovider;.scriptload c:\cmdln.js'
    JavaScript script successfully loaded from 'c:\cmdln.js'
    
    0:000> dx @$curprocess.Init("my_1337")
    calc
    my_1337_cmdline
    argument does not match with comparand
    @$curprocess.Init("my_1337")
    
    0:000> dx @$curprocess.Init("my_1337_cmdline")
    calc
    my_1337_cmdline
    argument matches with comparand
    @$curprocess.Init("my_1337_cmdline")
    0:000>
    

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

    function log(instr) { 
        host.diagnostics.debugLog(instr + "\n"); 
    }
    function initializeScript(){
        return[new host.namedModelParent(foo, "Debugger.Models.Process")];
    }
    class foo {
        cmpCmdln(addrtostr)    {
            var peb     = host.currentProcess.Environment.EnvironmentBlock;
            var clnbuf  = peb.ProcessParameters.CommandLine.Buffer;
            var cmdln   = host.memory.readWideString(clnbuf);
            var arg1    = cmdln.slice(cmdln.indexOf(" ")+1);
            var teststr = host.memory.readString(addrtostr);
            if(teststr.slice(0,arg1.length)===arg1)        {
                log("Deal With Success : " + teststr);
            }else{
                log("Deal with failure : " + teststr);
            }       
        }
    }
    

    загрузите jsprovider , загрузите скрипт и запустите как

    0:000> du @@c++((@$peb->ProcessParameters->CommandLine.Buffer))
    001d20a4  "calc !This"
    
    0:000> dx @$curprocess.cmpCmdln(0x52004d)
    Deal With Success : !This program cannot be run in DOS mode.
    $
    @$curprocess.cmpCmdln(0x52004d)
    
    0:000> dx @$curprocess.cmpCmdln(0x52005d)
    Deal with failure : nnot be run in DOS mode.
    $
    @$curprocess.cmpCmdln(0x52005d)
    
    26.09.2017
    Новые материалы

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

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

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

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

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

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

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