IDAW.EXE
Если посмотреть в распакованном файле, то мы не сможем найти ни одной строки меню. Однако можно обнаружить названия всех пунктов меню в текстовом виде в файле idatui.cfg. Далее все также не очень сложно - находим любую строку и отслеживаем ссылки на нее. В результате по адресу 0x6604EC50 обнаруживаем что-то вроде массива указателей на структуры обработчиков меню:
0x6604EC50 | Меню Jump |
0x6604EC54 | Меню Search |
0x6604EC58 | Подменю Edit->Comments |
0x6604EC5C | Подменю Edit->>Operand types |
0x6604EC60 | Подменю Edit->Other |
0x6604EC64 | Подменю Edit->Segments |
0x6604EC68 | Подменю Edit->Patch program |
0x6604EC6C | Подменю File->Produce Output File |
0x6604EC70 | Подменю Edit->Functions |
0x6604EC74 | Подменю Edit->Structs |
0x6604EC78 | Подменю Edit->Enums |
0x6604EC7C | Подменю File->Load file |
0x6604EC80 | Подменю View->Open subviews |
0x6604EC84 | Меню File |
0x6604EC88 | Меню Edit |
0x6604EC8C | Меню View |
0x6604EC90 | Меню Options |
0x6604EC94 | Меню Win |
Каждый из вышеприведенных указателей ссылается на массив структур, названных мною
struct menu_handler { BYTE unkn[12]; char *name; WORD unkn_w; DWORD func_ptr; };
Значение многих полей не было выяснено (ясно,что какие-то из них могут указывать на под-меню, горячие клавиши по умолчанию, номер события в TurboVision и так далее), меня в данной структуре интересовали только поля name (название пункта меню) и func_ptr (указатель на функцию-обработчик данного пункта меню). Для переименования этих функций я написал маленький script rename_h.idc. Рекомендуется запускать его с большой осторожностью, передавая функции rename_h адрес начала массива структур menu_handler. Теперь у меня есть и другая интересующая меня часть кода - реализация пунктов меню пользовательского интерфейса с помощью функций API. Осталось лишь найти время для reverse engeneeringа этих мегабайт ассеблерного листинга...