· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.HEAP —› Поиск имен констант по их значению

Посл.отвђт Сообщенiе


Дата: Июн 6, 2004 19:56:37

есть ли какая-нибудь утилитка для поиска
имен констант (из Windows API имею в виду)
по их значению ? т.е, так же, как это делает
ИДА, только в виде отдельной утилиты, и помощнее...
чтобы показывала все константы, значение которых
совпадает с запрошенным, например, ввели 111h,
прога выдает: WM_COMMAND, ... и т.д. если есть еще.

а то замучаешься рыться в .h да в API-Viewer'е от KPDTeam.


Дата: Июн 6, 2004 20:08:21

Можно написать самому. На перловом движке. Проходишь через все .h-файлы и выбираешь все #define. Т.к. #define могут быть самые разные, то необходимо тщательно подобрать нужный regex. Например, вот так:
/\#define\s+([A-Z_]+)\s+([0-9x]+)/


Потом прицепить к скрипту поддержку какой-нибудь DB типа MySQL и шарашить $1/$2 прямо в базу данных. Т.о. у тя будет все, что тебе нуно для реверсинга :)


Дата: Июн 6, 2004 20:14:49 · Поправил: Funbit

в MySQL запихать это неплохая идея :)

но вот что с такой фигней делать:
#define CALG_MD5 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5)

или, что еще хуже:
#define GET_CERT_UNICODE_RDN_ERR_INDEX(X)   \
    ((X >> CERT_UNICODE_RDN_ERR_INDEX_SHIFT) & CERT_UNICODE_RDN_ERR_INDEX_MASK)


полный парсер хидеров писать... =\


Дата: Июн 6, 2004 20:20:32

Да, это хуже.
Мой вариант возьмет нечто вроде:
#define LANG_INDONESIAN 0x21


Для твоих случаев все намного более напряжно.
Видимо, имеет смысл написать лишь какой-то частичный вариант. Прогонишь ты, скажем, тем, что я предложил. Вырипаешь примерно 80 %. Если мало будет, то тогда действительно придется писать нечто совсем общее, основанное на конкретном лексическом движке данного компилера.


Дата: Июн 6, 2004 21:47:49

а что если попробовать возложить всю эту работу прямо на MSVC :) написать простенький парсер, который будет преобразовывать #define XXX 123 к виду: dwArray[...] = 123, и запоминать имя (т.е. XXX). а потом можно просто пройтись по массиву и взять расчитанные значения :) должно прокатить


Дата: Июн 6, 2004 21:50:14

Не очень понял. Ты имеешь в виду ассоциативный массив?
Или ты просто хочешь переписать на сях, то, что можно сделать на перле? Ну так ведь и твой вариант не сможет взять тот случай, что ты сам предложил. Необходимо накапливать где-то все имена в #define, чтобы потом можно было это использовать.


Дата: Июн 6, 2004 21:57:23

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

o) рассматривать только #define, остальное удалять
o) #define XXX (0x123 - WM_HAHA) заменять на dwArray[n] = (0x123 - WM_HAHA)

dwArray - это наш массив, в коде.
потом, просто откомпилить и собрать значения.

т.е. исходник будет генерица небольшой программкой,
на перле например


Дата: Июн 6, 2004 22:03:19

Мда... То ли ты хреново объясняешь, то ли я плохо соображаю :(
Ладно, замнем для ясности.
А вообще, как вариант, можно сделать следующее.
Создать проект в VS. Влючить туда ВСЕ хедеры. Прогнать через препроцессор, а потом через специальную перловую программу. И все.


Дата: Июн 6, 2004 22:05:34 · Поправил: Funbit

жаль все-таки, что мой вариант остался непонятным :(

ладно, сейчас посмотрю, будет ли он работать


Дата: Июн 6, 2004 22:50:49

volodya
Видимо, имеет смысл написать лишь какой-то частичный вариант. Прогонишь ты, скажем, тем, что я предложил. Вырипаешь примерно 80 %.
А оставшиеся 20% define'ов, которые имеют более сложную структуру, кидать в лог-файл, чтоб потом их можно было вручную отресолвить и добавить в базу. Это вариант мне кажется самым приемлемым, но не самым Дзенным :-) Кстати, #define ещё используется и для макросов. Такие дэфайны надо отсеить.

Funbit
Взять книжку Красного Дракона и написать простенький препроцессор (таблица символов + парсер мат. операторов).


Дата: Июн 6, 2004 23:00:14 · Поправил: Funbit

Quantum
свой препроцессор это конечно гибко, мощно и удобно... но я думаю все же попроще это дело сделать, оставить из всех хидеров только #define (может быть максоры отсеить). потом написать скрипт, который сгенерит исходник, состоящий из строк:

DWORD dwArray[кол_во_найденных_define];

dwArray[0] = то_что_было_у_первого_define;
dwArray[1] = то_что_было_у_второго_define;

и т.п.

потом пройтись по этому массиву и взять готовые вычисленные значения :)


Дата: Июн 6, 2004 23:08:53

Funbit
Теперь понял :-)


Дата: Июн 7, 2004 00:13:29

Теперь и я понял. Но я по прежнему думаю, что и вариант с MySQL отнюдь не самый пропащий :)


Дата: Июн 7, 2004 00:30:48

volodya
так его никто не отменял :)
то что я собираюсь делать только лишь промежуточное дело...
потом в mysql. надеюсь найду время все это сделать


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.174