После трёх неудачных попыток заставить жалких рабов трудиться на благо Отечества и сделать мне, наконец, библиотеку для работы с паттернами, чтоб я мог писать автопатчеры, я плюнул на это дело.
Результатом моего разочарования в рабовладельческом строе стало написание libpat, которая как раз и делает то, что мне (и надеюсь, не только мне) нужно.
Два основных режима работы - массовый поиск паттерн, как в FunctionFinder, и поиск всех вхождений какой-то одной паттерны.
Краткое описание API (заголовочный файл библиотеки - libpat.h):
Исходники с примером использования обоих режимов (test.cpp) прилагаю - файл libpat.rar.
Для использования нужно:
В бою ещё не испытывал, так что могут быть насекомые.
--- Обновление от 09.06.2010 ---
Версия 1.1. Переписал код RamTrans в состав libpat, т.к. выяснилось, что старый код потерялся.
Если кто не знает, что делает (делал) RamTrans: некоторые функции прошивки кешируются в RAM, и RamTrans переводит адрес в ROM в соответствующий ему адрес в IRAM, если таковой вообще есть.
Также в новой версии чуть более безопасный код и более функциональный тест.
Обработка RamTrans-ом включается с помощью новой функции libpatEnableRamTrans, по умолчанию - выключено.
В закреплённом файле libpat_v1.1.rar исходники + скомпилированные версии теста и библиотеки.
--- Обновление от 18.07.2010 ---
Версия 1.2. Добавил три новых функции.
libpatCrawlStart и libpatCrawlStop - для прохождения по всему списку паттерн в любой момент (при вызове коллбеков во время выполнения libpatFindAllPatterns им передаются промежуточные результаты)
libpatFindPatternSingle - упрощенная функция, не нужно возиться со списками, когда этого заранее не требуется
В закреплённом файле libpat_v1.2.rar исходники + скомпилированные версии теста и библиотеки.
Сообщение отредактировал Andy51 - 18.7.2010, 15:09
Результатом моего разочарования в рабовладельческом строе стало написание libpat, которая как раз и делает то, что мне (и надеюсь, не только мне) нужно.
Два основных режима работы - массовый поиск паттерн, как в FunctionFinder, и поиск всех вхождений какой-то одной паттерны.
Краткое описание API (заголовочный файл библиотеки - libpat.h):
Spoiler:
Код
LIBPAT_API void* __stdcall libpatLoadBinary(char *path, u32 *size);
Открывает для работы бинарный файл (CG1 обычно) и возвращает указатель на него, а также размер через u32 *size.
LIBPAT_API BOOL __stdcall libpatLoadPatterns(char *path);
Открывает и файл с паттернами в уже известном формате *.pat и загружает оттуда данные
LIBPAT_API BOOL __stdcall libpatAddPattern(char *pattern);
Функция для добавления паттерны вручную, формат - как в *.pat файле
LIBPAT_API void __stdcall libpatSaveSymfile(char *path);
Сохраняет результаты поиска libpatFindAllPatterns в файле формата *.sym
LIBPAT_API void __stdcall libpatSetOffset(u32 off);
Устанавливает смещение CG1. По умолчанию - 0x10080000
LIBPAT_API int __stdcall libpatFindAllPatterns();
Начать поиск всех введённых паттерн
LIBPAT_API u32* __stdcall libpatFindPattern(char *pattern, u32 *count);
Найти заданную паттерну. Возвращает массив найденных значений и count=кол-во значений.
Возвращает больше одного значения только если в паттерне не указан искомый номер вхождения
LIBPAT_API void __stdcall libpatGetStats(LIBPAT_LDSTAT *result);
Возвращает статистику по введённым паттернам
LIBPAT_API void __stdcall libpatSetCallback( libpatCallback fn );
Устанавливает коллбек-функцию, которая будет вызываться при нахождении очередной паттерны при поиске функцией libpatFindAllPatterns
LIBPAT_API void __stdcall libpatResetPatterns();
Сбрасывает все введённые паттерны
---- Добавлено в v1.1 ----
LIBPAT_API void __stdcall libpatEnableRamTrans(BOOL enable);
Включает/выключает обработку результата RamTrans-ом (утилита для нахождения кешированного в (I)RAM адреса фунции). По умолчанию - выключено
---- Добавлено в v1.2 ----
LIBPAT_API u32 __stdcall libpatFindPatternSingle(char *pattern);
Аналог libpatFindPattern для быстрого поиска отдельной паттерны. Сразу возвращает найденное значение, либо 0, если значение не найдено или их найдено больше одного.
LIBPAT_API void __stdcall libpatCrawlStart();
Запускает проход по списку паттерн, вызывая для каждой коллбек-функцию.
LIBPAT_API void __stdcall libpatCrawlStop();
Завершает досрочно проход по списку паттерн. Вызывается из коллбек-функции.
Открывает для работы бинарный файл (CG1 обычно) и возвращает указатель на него, а также размер через u32 *size.
LIBPAT_API BOOL __stdcall libpatLoadPatterns(char *path);
Открывает и файл с паттернами в уже известном формате *.pat и загружает оттуда данные
LIBPAT_API BOOL __stdcall libpatAddPattern(char *pattern);
Функция для добавления паттерны вручную, формат - как в *.pat файле
LIBPAT_API void __stdcall libpatSaveSymfile(char *path);
Сохраняет результаты поиска libpatFindAllPatterns в файле формата *.sym
LIBPAT_API void __stdcall libpatSetOffset(u32 off);
Устанавливает смещение CG1. По умолчанию - 0x10080000
LIBPAT_API int __stdcall libpatFindAllPatterns();
Начать поиск всех введённых паттерн
LIBPAT_API u32* __stdcall libpatFindPattern(char *pattern, u32 *count);
Найти заданную паттерну. Возвращает массив найденных значений и count=кол-во значений.
Возвращает больше одного значения только если в паттерне не указан искомый номер вхождения
LIBPAT_API void __stdcall libpatGetStats(LIBPAT_LDSTAT *result);
Возвращает статистику по введённым паттернам
LIBPAT_API void __stdcall libpatSetCallback( libpatCallback fn );
Устанавливает коллбек-функцию, которая будет вызываться при нахождении очередной паттерны при поиске функцией libpatFindAllPatterns
LIBPAT_API void __stdcall libpatResetPatterns();
Сбрасывает все введённые паттерны
---- Добавлено в v1.1 ----
LIBPAT_API void __stdcall libpatEnableRamTrans(BOOL enable);
Включает/выключает обработку результата RamTrans-ом (утилита для нахождения кешированного в (I)RAM адреса фунции). По умолчанию - выключено
---- Добавлено в v1.2 ----
LIBPAT_API u32 __stdcall libpatFindPatternSingle(char *pattern);
Аналог libpatFindPattern для быстрого поиска отдельной паттерны. Сразу возвращает найденное значение, либо 0, если значение не найдено или их найдено больше одного.
LIBPAT_API void __stdcall libpatCrawlStart();
Запускает проход по списку паттерн, вызывая для каждой коллбек-функцию.
LIBPAT_API void __stdcall libpatCrawlStop();
Завершает досрочно проход по списку паттерн. Вызывается из коллбек-функции.
[close]
Исходники с примером использования обоих режимов (test.cpp) прилагаю - файл libpat.rar.
Для использования нужно:
- Visual C++ 6.0
- Установленный Processor Pack для VC6
- Процессор с поддержкой SSE2
В бою ещё не испытывал, так что могут быть насекомые.
--- Обновление от 09.06.2010 ---
Версия 1.1. Переписал код RamTrans в состав libpat, т.к. выяснилось, что старый код потерялся.
Если кто не знает, что делает (делал) RamTrans: некоторые функции прошивки кешируются в RAM, и RamTrans переводит адрес в ROM в соответствующий ему адрес в IRAM, если таковой вообще есть.
Также в новой версии чуть более безопасный код и более функциональный тест.
Обработка RamTrans-ом включается с помощью новой функции libpatEnableRamTrans, по умолчанию - выключено.
В закреплённом файле libpat_v1.1.rar исходники + скомпилированные версии теста и библиотеки.
--- Обновление от 18.07.2010 ---
Версия 1.2. Добавил три новых функции.
libpatCrawlStart и libpatCrawlStop - для прохождения по всему списку паттерн в любой момент (при вызове коллбеков во время выполнения libpatFindAllPatterns им передаются промежуточные результаты)
libpatFindPatternSingle - упрощенная функция, не нужно возиться со списками, когда этого заранее не требуется
В закреплённом файле libpat_v1.2.rar исходники + скомпилированные версии теста и библиотеки.
Сообщение отредактировал Andy51 - 18.7.2010, 15:09