CELua[RU]
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Зарегистрироваться
    • Войти

    Поиск данных в окне Tracer

    Запланировано Прикреплена Закрыта Перенесена MasterGH
    tracerce lua
    1 Сообщения 1 Posters 37 Просмотры 1 Watching
    Загружаем больше сообщений
    • Сначала старые
    • Сначала новые
    • По количеству голосов
    Ответить
    • Ответить, создав новую тему
    Авторизуйтесь, чтобы ответить
    Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
    • MasterGHM Не в сети
      MasterGH Администраторы
      отредактировано MasterGH

      \-- ищет адрес по адресу
      referencedAddress == 0x0165F8BC
      
      \-- ссылка на байты. Почему-то не работает. Ниже будет другой путь
      referencedBytes == dwordToByteTable(98)
      
      \-- сравнение по инструкции. В конце инструкции нужно ставить пробел
      instruction == "ret "
      
      \-- так будет искать все вхождения "mov"
       instruction:match("mov")
      

      Ну и более интересная версия перебора и одновременного выделения записей.

      Здесь нужно открыть окно "Трейсера" и рядом в Lua окне писать свои условия в функции "Compare()", "PrintData()", Selected()

       -- Поиск окна Трейслога
      function GetTTreeViewTracelogs()
        local max = getFormCount()
        for i=0, max-1 do
          if(getForm(i).ClassName == 'TfrmTracer') then
            return getForm(i)
          end
        end
        return nil
      end
      
      function FindTraceLogData()
        -- Нашли окно Трейслога
        tracerForm = GetTTreeViewTracelogs()
        -- Перебираем все записи
        for index=0, tracerForm.Count do
          -- Если запись пуста, то пропускаем
          if tracerForm.Entry[index] ~= nil then
            local entry = tracerForm.Entry[index]
            if Compare(entry) then
              Selected(entry, index)
              PrintData(entry,index )
            end
          end
        end
      end
      
      \-- Можно свое условие
      addressEAX = 0x001FB780
      
      function Compare(entry)
         return addressEAX == entry.context.EAX
      end
      
      function PrintData(entry)
        --print(tracerForm.Entry[index].instruction)
         print(disassemble(entry.context.RIP))
      end
      
      function Selected(entry, index)
         tracerForm.lvTracer.Items[index].Selected = true
      end
      
      FindTraceLogData()
      

      Из документации по окну Tracer

      TfrmTracer class (Inheritance: Form->ScrollingWinControl->CustomControl->WinControl->Control->Component->Object)
      
      properties
        Count: integer - number of entries in the list
        selectionCount: integer - The number of selected entries
      
        Entry[index]: table - Information about each entry. Read only. (Index starts at 0)
          table is formatted as:
          {
            address: integer - address of the instruction
            instruction: string - disassembled instruction
            instructionSize: integer - bytesize of the instruction
            referencedAddress: integer - address the code references
            referencedData: bytearray - The bytes of the referenced data at the time of tracing
            context: contexttable - the state of the cpu when this instruction got executed (contains registers(EAX/RAX, ...), floating points(FP) and XMM values
            hasStackSnapshot: boolean - set to true if there is a stack entry      
            selected: boolean - Set to true if the entry is selected
      
          }
      
      
        StackEntry[index]: bytearray - The stacksnapshot of that entry. Nil if not available
      
      methods
      \---------------------------------------------------
      Treeview Class : (Inheritance: CustomControl->WinControl->Control->Component->Object)
      createTreeView(owner)
      
      properties
        Items: TreeNodes - The Treenodes object of the treeview (ReadOnly)
        Selected: TreeNode - The currently selected treenode
      
      methods
        beginUpdate()
        endUpdate()
        getItems()
        getSelected()
        setSelected()
        fullCollapse()  : Collapses all the nodes, including the children's nodes
        fullExpand() : Expands all the nodes and all their children
        saveToFile(filename): Saves the contents of the treeview to disk
      
      \---------------
      
      TreeNodes class : (Inheritance: TObject)
      properties
        Count : Integer - The total number of Treenodes this object has
        Item[]: TreeNode - Array to access each node
        [] = Item[]
      methods
        clear()
        getCount()
        getItem(integer) : Return the TreeNode object at the given index (based on the TreeView's Treenodes)
        add(text:string): Returns a new root Treenode object
        insert(treenode, string): Returns a new treenode object that has been inserted before the given treenode
        insertBehind(treenode, string): Returns a new treenode object that has been inserted after the given treenode
      
      \---------------
      
      TreeNode class : (Inheritance: TObject)
      properties
        Text: string - The text of the treenode
        Parent: Treenode - The treenode this object is a child of. (can be nil) (ReadOnly)
        Level: Integer - The level this node is at
        HasChildren: boolean - Set to true if it has children, or you wish it to have an expand sign
        Expanded: boolean - Set to true if it has been expanded
        Count : Integer - The number of children this node has
        Items[]: Treenode - Array to access the child nodes of this node
        [] = Items[]
        Index: Integer - The index based on the parent
        AbsoluteIndex: Integer - The index based on the TreeView's Treenodes object (Items)
        Selected: Boolean - Set to true if currently selected
        MultiSelected: Boolean - Set to true if selected as well, but not the main selected object
        Data: Pointer - Space to store 4 or 8 bytes depending on which version of CE is used
      methods
        delete()
        deleteChildren()
        makeVisible()
        expand(recursive:boolean=TRUE OPTIONAL) : Expands the given node
        collapse(recursive:boolean=TRUE OPTIONAL)  : collapses the given node
        getNextSibling(): Returns the treenode object that's behind this treenode on the same level
        add(text:string): Returns a Treenode object that is a child of the treenode used to create it
        
        ------------------------------------------
        wordToByteTable(number): {}          - Converts a word to a bytetable
      dwordToByteTable(number): {}         - Converts a dword to a bytetable
      qwordToByteTable(number): {}         - Converts a qword to a bytetable
      floatToByteTable(number): {}         - Converts a float to a bytetable
      doubleToByteTable(number): {}        - Converts a double to a bytetable
      extendedToByteTable(number): {}      - Converts an extended to a bytetable
      stringToByteTable(string): {}        - Converts a string to a bytetable
      wideStringToByteTable(string): {}    - Converts a string to a widestring and converts that to a bytetable
      
      byteTableToWord(table, OPTIONAL signed:boolean): number       - Converts a bytetable to a word
      byteTableToDword(table, OPTIONAL signed:boolean): number      - Converts a bytetable to a dword
      byteTableToQword(table): number      - Converts a bytetable to a qword
      byteTableToFloat(table): number      - Converts a bytetable to a float
      byteTableToDouble(table): number     - Converts a bytetable to a double
      byteTableToExtended(table): number   - Converts a bytetable to an extended and converts that to a double
      byteTableToString(table): string     - Converts a bytetable to a string
      byteTableToWideString(table): string - Converts a bytetable to a widestring and converts that to a string
      
      bOr(int1, int2)   : Binary Or
      bXor(int1, int2)  : Binary Xor
      bAnd(int1, int2)  : Binary And
      bShl(int, int2)   : Binary shift left
      bShr(int, int2)   : Binary shift right
      bNot(int)         : Binary not
      

      Для вывода referencedBytes из трейслога можно использовать byteTableToDword(referencedBytes) (смотрим документации выше) получая из TfrmTracer.Entry[index].referencedBytes или в строке поиска у Трейслога вбить

      byteTableToDword(referencedBytes) > 0 and print(string.format("0x%08X - 0x%08X", RIP, byteTableToDword(referencedBytes))) == 1
      
      1 ответ Последний ответ Ответить Цитировать 0

      • 1 / 1
      • Первое сообщение
        Последнее сообщение
      Powered by NodeBB | Contributors
      СeLua[RU] 2025©