Вообщем получилось сделать то, что хотел. Опишу вкратце алгоритм если вдруг кому пригодится. Все что напсианр ниже исключительно для начиающих. Матерым клиперистом читать не нужно =)
Дано: нужно получить исходники lib файла. Успех зависит от такого, что вы знаете об этом файле.
У меня есть исходник где вызываются функции из этой библиотеки. Поэтому я знаю количество параметров и их тип. И примерно логику что там происходит.
У меня также есть скрипт сборки всего этого добра. Поэтому я знаю что там не используется какие-либо внешние библиотеки ASM и C вставки.
Соответвенно я знаю компилятор и линкер которым все это собирается. Все это очень облегчает задачу. Приступим.
1. Качаем архив
http://gfile.ru/a57gl. Спасибо огромное
Pasha за утилиты и ликбез. Если на момент когда вы читает эти строки архив уже не доступен. То в нем лежат lib.exe и tlib.exe.
Это утилиты для работы с Lib файлами от Майкрософт(lib.exe) и Borland(tlib.exe). Ищите их в старых дистрибутивах Visual C++ и Borland C++. Конкретные версии назвать не могу.
2. Получаем список obj модулей из которых состоит lib.
Команда lib.exe ESCC.lib,file.lst
где ESCC.lib - название вашего lib файла( лежит в папке вместе с lib.exe)
file.lst - текстовый файл с описание obj файлво входящих в Lib.
3. Смотрим результат file.lst. В моем случае он выглядит так:
цитата: |
GET_PICT..........get_pict GET_PICTUR........get_pict LEES..............lees_is LEES_IS...........lees_is STRANGE_SE........str_ser STR_SER...........str_ser VOPR..............vopr VOPROS............vopr get_pict Offset: 00000010H Code and data size: 121H GET_PICT GET_PICTUR lees_is Offset: 00000430H Code and data size: b6H LEES LEES_IS vopr Offset: 000007b0H Code and data size: 3ffH VOPR VOPROS str_ser Offset: 00000f30H Code and data size: 823H STRANGE_SE STR_SER |
|
Мы видим что он состоит из четырех obj файлов: get_pict,lees_is,vopr,str_ser
4. Далее надо извлечь эти obj файлы. Выполняем LIB ESCC *get_pict, RESULT2.LST
где ESCC - понятно наш Lib файл,
*get_pict - название Obj файла внутри Lib.
На выходже получаем obj файл. В моем случае это get_pict.obj
5. Далее собираем exe.Например так:
цитата: |
rtlink FI TEST,GET_PICT LIB Ct52 |
|
где test - prg файл. У меня он пустой с одной командой cls.
LIB Ct52 - не обязательно. Просто из анализа исходников где используется этот Lib файл, я знал что возможно используются функции из clipper tools.
Если например собрать вот такой командой rtlink FI TEST,GET_PICT. То exe соберется но выдаст предупреждение:
цитата: |
F:\CLIP\GPPD>..\bin\rtlink FI TEST,GET_PICT .RTLink for Clipper Dynamic Overlay Linker / Pre-Linker Version 3.14B (C) Copyright Pocket Soft Inc., 1988-1991. All Rights Reserved. UNDEFINED SYMBOL(S) AFTER LIBRARY SEARCH: SYMBOL FIRST REFERENCE ------ --------------- 'FIELDDECI' GET_PICT.OBJ 'FIELDNUM' GET_PICT.OBJ 'FIELDSIZE' GET_PICT.OBJ warning wrt0022: .EXE may not execute properly -- undefined symbols 224K 1 warning message(s) |
|
Из этого сообщения понятно что линкер на знает что такое FIELDDECI,FIELDNUM,FIELDSIZE которые используются в get_piсt.obj
Быстрое гугление показывает, что это функции из clipper tools которые входят в стандартный дистрибутив clipper. Поэтому мы подключаем командой LIB Ct52 - эту библиотеку.
6. Далее скармливаем Valkyrie полученный exe. Кстати нашел версию Valkyrie 2( на сайте лежит версия 1.0f). Вот она
http://rghost.ru/53122683. Если на момент чтения эта ссылка уже померла
то гуглите по названию архива Valkyrie_CA-Clipper_Decompiler_(full).rar
7. На выходе получаем почти исходник. У меня он получился такой.
цитата: |
#include "common.ch" #include "inkey.ch" ******************************** function GET_PICTUR(Arg1, Arg2) local Local1, Local2, Local3 Local2:= &Arg1->(fielddeci(&Arg1->(fieldnum(Arg2)))) Local3:= &Arg1->(fieldsize(&Arg1->(fieldnum(Arg2)))) if (Local2 != 0) mypicture:= Replicate("9", Local3 - Local2 - 1) + "." + ; Replicate("9", Local2) else mypicture:= Replicate("9", Local3) endif return mypicture |
|
Красота. Потерялись название только локальных переменных (Local1, Local2, Local3). Восстановить их не составит труда.
Параметры Arg1 и Arg2 я знаю из анализа работы исходников.
Остальные функции получаем по аналогии.
Но не всегда все так красиво получается. Просто у меня было много исходных данных и сама Lib очень маленькая. Поэтому все легко восстановить.