Skip to content
  • Tool C# Regular Expression

    MasterGH
    1
    0 Голоса
    1 Сообщения
    15 Просмотры
    Нет ответов
  • CE mapbranches

    Плагин-строй
    1
    0 Голоса
    1 Сообщения
    634 Просмотры
    Нет ответов
  • Ветвления кода связанные с адресом (старые записи)

    MasterGH
    2
    0 Голоса
    2 Сообщения
    27 Просмотры
    MasterGHM
    Трассеровка по ретам

    -------
    857b57ff-3395-4d71-9f76-e191f66fc90b-image.png

    На скриншоте 22 ветви трассеровки от адреса патронов не входя в call-ы до корневого цикла. Корневой цикл определяется, когда поиск происходит более трех секунд и не находит ничего. Вполне хватает этого времени. Буду еще повторно тестить и проверять доходит ли он цикла или надо еще что-то придумывать.

    Желтым выделяется точка, вертикальная полоса ветви и связи с такими же узлами. Узел это адрес выхода из ret

    Внизу ряд счетчиков от 00 до 99. Если более 99 то отсчет заного. Показывает дианамику обращения к ветвям после нахождения корневого цикла

    Есть еще несколько функций, которых не видно на скриншоте — в контекстном меню.

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

    При тестах увидел, что логи неполные. Например, первый кружок это инструкция читающая патроны очень часто. От этой инструкции идут вверх множество вариантов ветвей,а у меня один вариант — вертикальная полоска с кружками. От первого круга надо сделать ветвление влево и вправо.

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

    function IsRet(address) local value = readBytes(address,1, false) return value == 0xC3 or value == 0xCB or value == 0xC2 or value == 0xCA end

    Скорость трассеровки должна в несколько раз увеличиться. К сожалению, смогу это узнать, когда перепишу текущий плагин.

    Там были уже сделаны изменения (все еще сырое для публикации плагина, пока не публикую)

    Нумерация ветвей Клик на круг — переход в дефоттный дизассемблер Подсвечивать выбранный круг Перерасчет позиций, когда поменялся размер окна Счетчики выполнений инструкций срабатывающих к обращению на адрес Изменен способ рисования связей между ветвями Контекстное меню Показать ветку Контекстное меню Скрыть ветку На скрытой ветви не показываются связи упрощая обзор. Код поднимается снизу вверх. Если одна ветвь ниже другой, то можно её скрыть. Ориентируемся по счетчикам хитов на инструкции Контекстное меню Сброс хитов Оптимизация поиска корневого цикла Выделение связей Оптимизация рисования новых свзей Контекстное меню пауза/продолжение Запуск из контекстного меню при выделеии адреса в главной таблице При закрытии окна снимаются все брейкпоинты Возможность ставить логи на запись из контекстного меню и на чтение в главной таблице CE
  • [CE Lua Plugin] Способ раскраски значений найденных адресов

    MasterGH
    1
    0 Голоса
    1 Сообщения
    14 Просмотры
    Нет ответов
  • CE Tool Lua Regular expressions 2

    Плагин-строй
    2
    0 Голоса
    2 Сообщения
    26 Просмотры
    MasterGHM
    Lua поиск элемента до и после строки

    Была задача получить два списка из документа, в котором было с пару десятков тысяч строк. На практике выяснилось, что искать текст после ключевого слова легче чем искать текст до ключевого слова. Об этом и будет дальше

    В утилите "Lua Regular Expressions (v. 1.0)"
    image.png
    Текст во вкладке "gmatch"

    Game1
    gameCompany
    DAU
    53.21k
    -20%
    Game2
    gameCompany
    DAU
    20.35k
    -20%

    Поиск элемента после строки: "DAU "DAU%c%c(.-)%c%c"

    53.21k;20.35k;

    Поиск элемента до строки: "%c%c(.-)gameCompany%c%c"
    (паттерн со двигом скобок для поиска предыдущей фразы)
    не прокатит для вывода списка игр над фразой gameCompany

    ;53.21k
    -20%

    Game2
    ;

    Очевидно, можно сделать поиск по похожим фрагментам, которые идут последовательно сверху вниз.

    Cначала добавим первую пустую строку и видим повторяющиеся фрагменты

    "%c%cGame1%c%cgameCompany%c%c"

    пишем шаблон ".*%c%c(.-)%c%cgameCompany%c%c" и опять мимо

    Game1;53.21k
    -20%

    Game2;

    Потому что текст над Game2 пошел выше Game2. Тогда делаем захват, только первой фразы и дальше не идем "%c%c(%w-)%c%cgameCompany%c%c"

    Game1;Game2;
    И тогда все ок.

    Но это еще не все. Осталась первая пустая строка, которую добавили, если её удалить, тогда "%c%c(%w-)%c%cgameCompany%c%c"

    Game2;
    Не видит Game1.

    Значит мы можем убрать %c%c, и будет "(%w-)%c%cgameCompany"

    Game1;Game2;

    Дальше название игры может быть таким "My Game: my Game". Здесь и пробел и двоеточие. В таком случае текст уже будет

    My Game1: my Game

    gameCompany

    DAU

    53.21k

    -20%

    My Game2: my Game

    gameCompany

    DAU

    20.35k

    -20%

    Пробуем "(%w-)%c%cgameCompany"

    Game;Game;
    Что не верно, т.к. захват одним (%w-)

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

    '([%w%s]-)%c%cgameCompany'

    my Game; my Game;

    Затем ([:%w%s]-)%c%cgameCompany

    My Game1: my Game;

    My Game2: my Game;

    Затем %c?%c?([:%w%s]-)%c%cgameCompany

    My Game1: my Game;
    My Game2: my Game;

    Вот и все. Если попариться один раз, то тексты уже парсить будет гораздо быстрее.

    Так я вывел столбы DAU и названий игр в таблицу, что было в районе 500 строк из пару десятков тысяч строк

    p.s. Текст в консоли Lua отличается %c%c, а %с

    p.s.p.s. Можно раcсплитить текст по "/n/r" или "/n" в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести "%c?%c?([:%w%s]-)%c%cgameCompany" и "DAU%c%c(.-)%c%c"

  • CE disassembler

    Плагин-строй
    1
    0 Голоса
    1 Сообщения
    638 Просмотры
    Нет ответов
  • CE Compact View

    Плагин-строй
    2
    0 Голоса
    2 Сообщения
    33 Просмотры
    MasterGHM

    Ниже находится обучающий пример плагина для CE Lua с установкой компактного режима применяя парадигму ООП — инкапсуляции.

    Для программирования плагинов на Lua могут пригодится приемы ООП. Это касается сущностей, их поведений и взаимодействий между ними. В данном примере CECompactView — описание класса на основе мета-таблицы и оно является сущностью. Функции класса — uncompact() и compact(), которые реализуют поведения этой сущности. Основной скрипт с описанием сущности можно поместить в отдельный файл .lua и далее можно кратко инициализировать сущность и управлять ей

    Например

    \-- Создание экземпляра класса через new() функцию, где аргументом является состояние компактный или некомпактный ce_compact_view = CECompactView:new(true) \-- Проверить состояние \--print(ce_compact_view:get_state() and 'Compact View Mode' or 'Full View Mode') \-- Установить компактный режим \--ce_compact_view:compact() \-- Установить не компактный режим \--ce_compact_view:uncompact()

    Сам класс или мета-таблица.

    \-- Класс инкапсулирующий поведения компактного состояния окна CE CECompactView = {} function CECompactView:new(state) local obj = {} -- Состояние компактное или нет: true или false obj.compact_mode = state -- Форма CE, где getMainForm — поддерживаемая функция CE и возвращает главную форму CE obj.form_ce = getMainForm() -- Получение элементов контекстного меню главной формы local menu_items = obj.form_ce.menu.items -- Создание нового контекстного меню с названием CompactView и именем ItemCompact obj.menu_item_compact = createMenuItem(menu_items) obj.menu_item_compact.name = 'ItemCompact' obj.menu_item_compact.caption = 'CompactView' -- Добавление контекстного меню на главную форму menu_items.add(obj.menu_item_compact) -- Сменить состояние окна CE: компактное или нет function obj:set(state) -- view_components состояния скрытия компонентов obj.compact_mode = state -- видимость компонентов обратна компактному режиму local view_components = not state obj.form_ce.panel1.visible = view_components obj.form_ce.panel4.visible = view_components obj.form_ce.panel5.visible = view_components obj.form_ce.Splitter1.visible = view_components -- Записать имя по состоянию obj.menu_item_compact.caption = state and 'Full View Mode' or 'Compact View Mode' -- Поставить обработчик по состоянию obj.menu_item_compact.onClick = state and obj.compact or obj.uncompact print(state and 'Compact View Mode' or 'Full View Mode') end -- Некопактное окно CE function obj:uncompact() obj:set(true) end -- Компактное окно CE function obj:compact() obj:set(false) end -- Состояние окна CE: компактное или нет function obj:get_state() return obj.compact_mode end -- Связь таблицы (смотрим докуметацию по Lua) setmetatable(obj, self) obj.__index = self -- Активировать состояние obj:set(state) -- Возвращает ссылку на экземпляр return obj end \------------ \-- Создание экземпляра класса ce_compact_view = CECompactView:new(true) \-- Проверить состояние \--print(ce_compact_view:get_state() and 'Compact View Mode' or 'Full View Mode') \-- Установить компактный режим \--ce_compact_view:compact() \-- Установить не компактный режим \--ce_compact_view:uncompact()

    Скрипт можно сохранить в Lua файл и добавить в папку autorun.

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

    MasterGH
    1
    0 Голоса
    1 Сообщения
    18 Просмотры
    Нет ответов
  • Функции для работы с адресами

    MasterGH
    1
    0 Голоса
    1 Сообщения
    15 Просмотры
    Нет ответов
  • Пользовательские тип данных в hex-окне (пример)

    MasterGH
    1
    0 Голоса
    1 Сообщения
    12 Просмотры
    Нет ответов
  • Lua генерирует и исполняет код

    MasterGH
    1
    0 Голоса
    1 Сообщения
    754 Просмотры
    Нет ответов
  • 0 Голоса
    1 Сообщения
    17 Просмотры
    Нет ответов
  • Часть1. Lua простые регулярные выражения

    Программирование
    1
    0 Голоса
    1 Сообщения
    38 Просмотры
    Нет ответов
  • Часть2. Lua простые регулярные выражения

    Программирование
    1
    0 Голоса
    1 Сообщения
    12 Просмотры
    Нет ответов
  • Notepad++ и CE Lua. Автозавершение строк

    MasterGH
    1
    0 Голоса
    1 Сообщения
    11 Просмотры
    Нет ответов
  • Задачка по IDA и Python (старое)

    MasterGH
    2
    0 Голоса
    2 Сообщения
    18 Просмотры
    MasterGHM

    Пост принадлежит автору partoftheworlD, GamehackLab[RU]. (ref)

    Подключение к питону происходит с помощью:

    import idc import idautils import idaapi

    У меня есть наработки некоторые, возможно что-то пригодится.

    import idc import idaapi class Func(object): def __init__(self): self.reg_value = re.compile(r'') self.stack_view = [] self.level = 1 def range_reverse(self, start, stop): for i in FuncItems(stop): if start > i >= stop: yield i def run(self): if self.stack_view: for j in self.stack_view: current_function = idaapi.get_func(j) level = "-" * self.level print("{} Jump into -> 0x{}".format(level, hex(current_function.startEA)[2:].replace("L", "").upper())) for j in [i for i in self.range_reverse(current_function.endEA, current_function.startEA)]: print("{} 0x{} -- {}".format(level, hex(j)[2:].replace("L", "").upper(), idc.GetDisasm(j))) self.level += 1 else: print "Please input addresses to stack view buffer" pass if __name__ == '__main__': f = Func() f.stack_view = [0x214FE, 0x20F30, 0x214E0, 0x13F00] f.run()

    В выводе получим

    \- Jump into -> 0x214E0 \- 0x214E0 -- push ebp \- 0x214E1 -- mov ebp, esp \- 0x214E3 -- lea esp, [esp-10h] \- 0x214E7 -- mov [ebp+var_C], eax \- 0x214EA -- mov [ebp+var_4], edx \- 0x214ED -- mov [ebp+var_8], ecx \- 0x214F0 -- mov eax, [ebp+arg_0] \- 0x214F3 -- test eax, eax \- 0x214F5 -- jnz locret_21589 \- 0x214FB -- mov eax, [ebp+var_8] \- 0x214FE -- cmp word ptr [eax], 1Bh \- 0x21503 -- jnz locret_21589 \- 0x21509 -- push 0 \- 0x2150B -- mov eax, [ebp+var_8] \- 0x2150E -- movzx ecx, word ptr [eax] \- 0x21511 -- mov eax, [ebp+var_4] \- 0x21514 -- mov edx, 0B01Eh \- 0x21519 -- call sub_8E870 \- 0x2151E -- test eax, eax \- 0x21520 -- jnz short locret_21589 \- 0x21522 -- push 0 \- 0x21524 -- mov eax, [ebp+var_4] \- 0x21527 -- mov ecx, 0 \- 0x2152C -- mov edx, 87h ; '‡' \- 0x21531 -- call sub_8E870 \- 0x21536 -- and eax, 4 \- 0x21539 -- jnz short locret_21589 \- 0x2153B -- mov eax, [ebp+var_C] \- 0x2153E -- test dword ptr [eax+160h], 4 \- 0x21548 -- jz short locret_21589 \- 0x2154A -- mov eax, [ebp+var_4] \- 0x2154D -- mov dl, 1 \- 0x2154F -- call sub_13F00 \- 0x21554 -- mov [ebp+var_10], eax \- 0x21557 -- test eax, eax \- 0x21559 -- jz short locret_21589 \- 0x2155B -- mov eax, [ebp+var_10] \- 0x2155E -- cmp dword ptr [eax+378h], 0 \- 0x21565 -- jz short locret_21589 \- 0x21567 -- mov eax, [ebp+var_10] \- 0x2156A -- mov eax, [eax+378h] \- 0x21570 -- mov edx, [ebp+var_10] \- 0x21573 -- mov edx, [edx+378h] \- 0x21579 -- mov edx, [edx] \- 0x2157B -- call dword ptr [edx+2E8h] \- 0x21581 -- mov eax, [ebp+var_8] \- 0x21584 -- mov word ptr [eax], 0 \- 0x21589 -- leave \- 0x2158A -- retn 4 \-- Jump into -> 0x20F30 \-- 0x20F30 -- push ebp \-- 0x20F31 -- mov ebp, esp \-- 0x20F33 -- lea esp, [esp-10h] \-- 0x20F37 -- mov [ebp+var_C], eax \-- 0x20F3A -- mov [ebp+var_4], edx \-- 0x20F3D -- mov [ebp+var_8], ecx \-- 0x20F40 -- mov eax, [ebp+var_8] \-- 0x20F43 -- cmp word ptr [eax], 0 \-- 0x20F48 -- jz locret_20FCF \-- 0x20F4E -- mov edx, [ebp+var_4] \-- 0x20F51 -- mov eax, 5C29B4h \-- 0x20F56 -- call sub_C910 \-- 0x20F5B -- test al, al \-- 0x20F5D -- jz short loc_20FC3 \-- 0x20F5F -- mov eax, [ebp+var_4] \-- 0x20F62 -- mov [ebp+var_10], eax \-- 0x20F65 -- mov eax, [ebp+var_C] \-- 0x20F68 -- cmp word ptr [eax+150h], 0 \-- 0x20F71 -- jz short locret_20FCF \-- 0x20F73 -- mov eax, [ebp+var_C] \-- 0x20F76 -- mov edx, [ebp+var_8] \-- 0x20F79 -- mov ax, [eax+150h] \-- 0x20F80 -- cmp ax, [edx] \-- 0x20F83 -- jnz short locret_20FCF \-- 0x20F85 -- mov eax, [ebp+var_C] \-- 0x20F88 -- mov eax, [eax+154h] \-- 0x20F8E -- cmp eax, [ebp+arg_0] \-- 0x20F91 -- jnz short locret_20FCF \-- 0x20F93 -- mov eax, [ebp+var_C] \-- 0x20F96 -- mov eax, [eax+14Ch] \-- 0x20F9C -- cmp eax, [ebp+var_10] \-- 0x20F9F -- jnz short locret_20FCF \-- 0x20FA1 -- push [ebp+arg_0] \-- 0x20FA4 -- mov ecx, [ebp+var_8] \-- 0x20FA7 -- mov edx, [ebp+var_10] \-- 0x20FAA -- mov eax, [ebp+var_C] \-- 0x20FAD -- call sub_21590 \-- 0x20FB2 -- push [ebp+arg_0] \-- 0x20FB5 -- mov ecx, [ebp+var_8] \-- 0x20FB8 -- mov edx, [ebp+var_10] \-- 0x20FBB -- mov eax, [ebp+var_C] \-- 0x20FBE -- call sub_214E0 \-- 0x20FC3 -- mov eax, [ebp+var_C] \-- 0x20FC6 -- mov word ptr [eax+150h], 0 \-- 0x20FCF -- leave \-- 0x20FD0 -- retn 4 \--- Jump into -> 0x214E0 \--- 0x214E0 -- push ebp \--- 0x214E1 -- mov ebp, esp \--- 0x214E3 -- lea esp, [esp-10h] \--- 0x214E7 -- mov [ebp+var_C], eax \--- 0x214EA -- mov [ebp+var_4], edx \--- 0x214ED -- mov [ebp+var_8], ecx \--- 0x214F0 -- mov eax, [ebp+arg_0] \--- 0x214F3 -- test eax, eax \--- 0x214F5 -- jnz locret_21589 \--- 0x214FB -- mov eax, [ebp+var_8] \--- 0x214FE -- cmp word ptr [eax], 1Bh \--- 0x21503 -- jnz locret_21589 \--- 0x21509 -- push 0 \--- 0x2150B -- mov eax, [ebp+var_8] \--- 0x2150E -- movzx ecx, word ptr [eax] \--- 0x21511 -- mov eax, [ebp+var_4] \--- 0x21514 -- mov edx, 0B01Eh \--- 0x21519 -- call sub_8E870 \--- 0x2151E -- test eax, eax \--- 0x21520 -- jnz short locret_21589 \--- 0x21522 -- push 0 \--- 0x21524 -- mov eax, [ebp+var_4] \--- 0x21527 -- mov ecx, 0 \--- 0x2152C -- mov edx, 87h ; '‡' \--- 0x21531 -- call sub_8E870 \--- 0x21536 -- and eax, 4 \--- 0x21539 -- jnz short locret_21589 \--- 0x2153B -- mov eax, [ebp+var_C] \--- 0x2153E -- test dword ptr [eax+160h], 4 \--- 0x21548 -- jz short locret_21589 \--- 0x2154A -- mov eax, [ebp+var_4] \--- 0x2154D -- mov dl, 1 \--- 0x2154F -- call sub_13F00 \--- 0x21554 -- mov [ebp+var_10], eax \--- 0x21557 -- test eax, eax \--- 0x21559 -- jz short locret_21589 \--- 0x2155B -- mov eax, [ebp+var_10] \--- 0x2155E -- cmp dword ptr [eax+378h], 0 \--- 0x21565 -- jz short locret_21589 \--- 0x21567 -- mov eax, [ebp+var_10] \--- 0x2156A -- mov eax, [eax+378h] \--- 0x21570 -- mov edx, [ebp+var_10] \--- 0x21573 -- mov edx, [edx+378h] \--- 0x21579 -- mov edx, [edx] \--- 0x2157B -- call dword ptr [edx+2E8h] \--- 0x21581 -- mov eax, [ebp+var_8] \--- 0x21584 -- mov word ptr [eax], 0 \--- 0x21589 -- leave \--- 0x2158A -- retn 4 \---- Jump into -> 0x13F00 \---- 0x13F00 -- push ebp \---- 0x13F01 -- mov ebp, esp \---- 0x13F03 -- lea esp, [esp-0Ch] \---- 0x13F07 -- mov [ebp+var_4], eax \---- 0x13F0A -- mov [ebp+var_8], dl \---- 0x13F0D -- jmp short loc_13F33 \---- 0x13F10 -- cmp [ebp+var_8], 0 \---- 0x13F14 -- jnz short loc_13F27 \---- 0x13F16 -- mov edx, [ebp+var_4] \---- 0x13F19 -- mov eax, 59ECF0h \---- 0x13F1E -- call sub_C910 \---- 0x13F23 -- test al, al \---- 0x13F25 -- jnz short loc_13F45 \---- 0x13F27 -- mov eax, [ebp+var_4] \---- 0x13F2A -- mov eax, [eax+1F8h] \---- 0x13F30 -- mov [ebp+var_4], eax \---- 0x13F33 -- cmp [ebp+var_4], 0 \---- 0x13F37 -- jz short loc_13F45 \---- 0x13F39 -- mov eax, [ebp+var_4] \---- 0x13F3C -- cmp dword ptr [eax+1F8h], 0 \---- 0x13F43 -- jnz short loc_13F10 \---- 0x13F45 -- mov edx, [ebp+var_4] \---- 0x13F48 -- mov eax, 59ECF0h \---- 0x13F4D -- call sub_C910 \---- 0x13F52 -- test al, al \---- 0x13F54 -- jz short loc_13F5E \---- 0x13F56 -- mov eax, [ebp+var_4] \---- 0x13F59 -- mov [ebp+var_C], eax \---- 0x13F5C -- jmp short loc_13F65 \---- 0x13F5E -- mov [ebp+var_C], 0 \---- 0x13F65 -- mov eax, [ebp+var_C] \---- 0x13F68 -- leave \---- 0x13F69 -- retn

    Надо будет поправить пару строк, чтобы выводилась не функция целиком, а как при трассировке:

    for j in [i for i in self.range_reverse(current_function.endEA, current_function.startEA)]: https://raw.githubusercontent.com/EiNSTeiN-/idapython/master/examples/ex_graph.py
  • Unity API (игровой движок)

    API
    1
    0 Голоса
    1 Сообщения
    13 Просмотры
    Нет ответов
  • Panda3D API (игровой движок)

    API
    1
    0 Голоса
    1 Сообщения
    13 Просмотры
    Нет ответов
  • Frostbite API (игровой движок)

    API
    1
    0 Голоса
    1 Сообщения
    13 Просмотры
    Нет ответов
  • CryEngine API (игрвой движок)

    API
    1
    0 Голоса
    1 Сообщения
    14 Просмотры
    Нет ответов