Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Технологии: Разные > Работа со старой 16-ти битной DLL


Автор: Georg4 23.7.2012, 17:24
Друзья, привет всем.
Возможно я не верно выбрал раздел, но пока не знаю где это должно быть.

Краткая предыстория.

У меня на работе испоконе веков пользуемся одной утилиткой, написанной ещё во времена Винды 3.11 и немного модифицировавшейся уже в 95-ю эпоху.
Программа исправно вполняет свои задачи, но проблема в том, что она совершенно устарела в плане производительности. Выполняет задачи очередью, про многопроцессорные системы ничего не знает и процессы не параллелит. Плюс обладает совсем бесящей функцией кейхука во время работы. Если она выполняет задачи (а они могут быть от 10 минут до 2-х часов), нажатие на любую клавишу приводит к зависанию любого активного виндового окна (не виснет только FAR-manager, в нем и работаем пока программа выполняет заданные функции). 
Поскольку контора моя международная, кто, когда и где делал эту прогу уже невозможно выяснить и, самое страшное, что пол-европы, Россия, Украина, прибалты работают на ней и не задумываются о том, что это может работать быстрее.
Поначалу я придумал запускать на нескольких виртуальных машинах параллельно 2-3 экземпляра и параллельно работать на основной, назначая каждому окну VM свой CPU. 
Но потом решил посмотреть, где же кроется этот хук на клавиши (вероятно на заре 90х он был актуален, чтобы ресурсы не тратить, а теперь только мешает) снял я ПроцессМонитором все внутренние DLL ки к которым обращается программа во время работы и уж было думал, что всё получится. Но тупо не могу найти чем и как хотябы просмотреть список функций внутри. Да что там функций, эти DLLки распознаются как старые  16-ти битные NE Executable (так ругнулся Resource tuner от heaventools) и никто ничего прочитать не может. 

Чем бы можно было рассмотреть эти DLLки?
Хотя бы понять список функций.
Я помню читал как создают свою DLL которая просто импортирует все функции другой, кроме тех, что нужно изменить, а они прописываются внутри новой DLL. Порыться в сети и можно найти это дело, но как узнать, что в этом DLL вообще есть?
Может имеются методы сделать из 16-ти битной старой, 32 битную новую и уже её использовать?
Вот одну прилагаю в приложении.
Если кто подскажет, буду очень признателен.

Автор: 500mhz 23.7.2012, 19:44
И где приложение?

Автор: DarkProg 23.7.2012, 20:07
Попробуйте её открыть чем-то вроде IDA. IMHO если DLL была написана для конкретного приложения, скорее всего в ней будет немного функций, и если просидеть с огромным желанием и усердием, то можно я думаю разобраться что к чему(я имею в виду выделить нужные рабочие процедуры и их переписать на новый лад), но не факт что старое приложение с радостью съест новую DLL. Скорее всего будет какая-то ошибка.

Цитата(Georg4 @  23.7.2012,  18:24 Найти цитируемый пост)
пол-европы, Россия, Украина, прибалты работают на ней и не задумываются о том, что это может работать быстрее.

Работа с файлами? Если так проще написать современную для себя, особенно если формат взаимодействия известен.

Автор: Georg4 23.7.2012, 21:41
Сорри, ребята. Затупил. Страница заглючила, когда добавлял, а второй раз забыл приложить. Завтра утром прийду на работу - приложу обязательно.

Цитата

Работа с файлами? Если так проще написать современную для себя, особенно если формат взаимодействия известен. 


Там очень-очень хитровыдолбленный процесс. Сам процесс не менялся годами, но полностью его глубину с высоты моего отдела идаже всего украинского офиса не постичь. Суть в том, что из специально структурированного огромных (по тем временам огромных это от 100мб до 1гб) размеров текстового файла создаётся так называемая база данных inf*act. Такой не очень распространённый тип 4-х мерной базы данных. Параллельно некоторые вычислимые поля вычилсяются (хотя возможно эти данные уже вычислины в изначальном файле, тут мнения разошлись).
Плюс побочные функции ввиде просмотрщика этих баз, возможности делать merge двух баз с одинаковыми измерениями и кое что другое.
Как бы работа с файлами, но копать глубоко.

Я сам думал что старое приложение не схавает новые DLL. Подумал сегодня установить виртуально 95 винду и там старыми средствами создать что-нибудь старое smile

А вот уходя с работы я нашел таки одно средство которым смог разобрать и DLL и EXE. Tdump.exe Он же Borland Turbo Dump толи 1988 толи 1992 года.
Правда я только бегло просмотрел полученный тектовик и мало что понял. Увидел только какие DLLки вызывает EXE полный список. Я тогда отловил всего 2 а там около 10 вообще. Плюс, я в DLL вроде бы увидел списко функций, а вроде бы не он. Я не понимаю пока формат файла. Завтра поищу доки и посмотрю как быть.

IDA я тоже нашел, завтра скачаю и попробую посмотреть, как оно пойдёт. 
В общем завтра ещё отпишусь и пришлю сюда файл.

Автор: Georg4 24.7.2012, 09:06
Вот оно, вложение!

Автор: Georg4 24.7.2012, 09:54
И ещё один. Они между собой связаны.

Автор: Georg4 24.7.2012, 10:37
А пока суть да дело, я установил IDA и там прогнал и EXE и самое главное  GDSLIB.DLL
Вот в последнем и обнаружил нечто похожее на то, что искал.
функции: 
ACNKEYHOOK
ACNSETWSKEYHOOK 
ACNCLEARWSKEYHOOK
среди многих.
ACN это корпоративная приставка.

Короче, эти функции вызывают последовательно из библиотеки USER (я так понимаю это user32.dll там видиом должы сохраниться старые функции из user.dll):
ACNKEYHOOK
-GETKEYSTATE
-GETACTIVEWINDOW
-GETWINDOWWORD
-GLOBALLOCK
-GLOBALUNLOCK
-DEFHOOKPROC

ACNSETWSKEYHOOK 
-SETWINDOWSHOOK

ACNCLEARWSKEYHOOK
-UNHOOKWINDOWSHOOK
-FREEPROCINSTANCE


Узнать, узнали. Чего делать теперь ?

Автор: 500mhz 24.7.2012, 10:53
Ну вот берите смотрите )
Там импорт по ординалам в виде  16: PTR      Import by ordinal        1C7F   KERNEL.15


Автор: 500mhz 24.7.2012, 10:57
Напишите свой загрузчик ехешника вашего, который подменяет SETWINDOWSHOOK и SETWINDOWSHOOKEX, а потом ехешник запускает.

Автор: Georg4 24.7.2012, 13:20
Значит лоадер нужно написать.
А почитаю-ка я RSDN на эту тему smile

Автор: 500mhz 24.7.2012, 17:09
А можно не изобретать велосипед, поставить AVZ и сбросить хуки )))

Автор: Georg4 24.7.2012, 19:34
AVZ Всмысле антивирус?
Разверни тему, пожалуйста более детально. А то я за день чтения разных доков по перехвату API уже готов на всё smile лишь бы ничего не пытаться писать.

Автор: Georg4 25.7.2012, 17:22
А если открыть exe через Hiew и там поставить ноп на вызов ACNSETWSKEYHOOK 
Только нужно узнать начальный адресс и длинну этого куска кода.

Автор: 500mhz 25.7.2012, 17:59
http://www.z-oleg.com/secur/avz/download.php/  AVZ )

ACNSETWSKEYHOOK  нет такой айпишки в винде

Автор: Georg4 25.7.2012, 19:04
Что такое AVZ я знаю (правда не пользуюсь) установил сегодня утром. Его наличие никак не повлияло на процесс.

ACNSETWSKEYHOOK само собой нет. Она лежит в библиотеке GDSLIB.dll
 

Автор: Georg4 28.7.2012, 16:36
Похоже эти функции со словом hook это был ложный манёвр.
Я посмотрел в IDA последовательность вызова.
Вслед за ACNSETWSKEYHOOK  идёт функция вызова help файла.
Короче говоря в программе есть фишка такая. Если программа запущена и вне зависимости от того, активно ли её окно или нет, то при нажатии F1 на любом окне, выводится справка становясь на первый план. 
Стало быть это видимо не та функция.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)