Регистрация Главная Пользователи Все разделы прочитаны
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 08.06.2013, 21:14   #16
 Разведчик
Аватар для Ninazu
 
Ninazu никому не известный тип
Регистрация: 08.06.2013
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Исследование программ. Урок 0.

Вот решил попытать счастья и вытащить базу из справочника. Опыта особого нет, но механизм в целом понятен.

Собственно жертва!
[Ссылки могут видеть только зарегистрированные пользователи. ]

Увидев файлы базы, подумал что всё пройдёт гладко. Но после тщетных попыток понять с чем же мы имеем дело, оказалось что это не стандартная база, а какое-то извращение своё.
Прога написана на Делфи. Был скачан DeDe, но жизни он не облегчил особо. Запустив под Олькой обнаружил, что с базой работают три библиотеки

dread.dll
xfind.dll
udata.dll


С первой проще! Быстренько написал софтинку (PureBasic) для чтения .dat файлыов с её помощью, и получить даже количество записей в каждой из БД.
Но вот дошел до функции dreadrecord, а она возвращает два загадочных параметра. Которые как я подозреваю являются адресом и размером для чтения. Вот только адресом чего и откуда читать потом

Код:
EnableExplicit
;{ 

DataSection
  DB_KEY:
  Data.b $44,$65,$43,$35,$31,$36,$37,$35,$30,$33,$32,$37,$37,$64,$56,$66,$0B,$01,$00
EndDataSection

Prototype p_dloadfile(Fname$,*File)
Prototype p_drecordcount(File,*Count)
Prototype p_dreadrecord(File,Index,*Addr,*Count)
Prototype p_drcsetmasterkey(*Key)
Prototype p_dunloadfile(File)
Prototype p_xloadfile(Fname$)
Prototype p_xfind_cb(*FirstP,Flag,*EP,*NextP)

Define FLib=OpenLibrary(#PB_Any, "dread.dll")
If FLib
  Global dloadfile.p_dloadfile = GetFunction(FLib, "dloadfile")
  Global drecordcount.p_drecordcount = GetFunction(FLib, "drecordcount")
  Global dreadrecord.p_dreadrecord = GetFunction(FLib, "dreadrecord")
  Global drcsetmasterkey.p_drcsetmasterkey = GetFunction(FLib, "drcsetmasterkey")
  Global dunloadfile.p_dunloadfile = GetFunction(FLib, "dunloadfile")
EndIf

Define FLib=OpenLibrary(#PB_Any, "xfind.dll")
If FLib
  Global xloadfile.p_xloadfile = GetFunction(FLib, "xloadfile")
  Global xfind_cb.p_xfind_cb = GetFunction(FLib, "xfind_cb")
EndIf

Structure REC
  RID.i
  Count.i
EndStructure

Structure DBF
  File.i
  Count.i
  Array Record.REC(0)
EndStructure

;}

Global NewList DBF.DBF()

Procedure ReadFileDB(FName$)
  Protected File,Count,I,RID,RCount
  Protected *lBuff,*wBuff
  If dloadfile(FName$,@File)=#S_OK
    AddElement(DBF())
    DBF()\File=File
    If drecordcount(File,@Count)=#S_OK
      DBF()\Count=Count
      ReDim DBF()\Record(Count)
      For I= 1 To Count
        If dreadrecord(File,I,@RID,@RCount)=#S_OK
          With DBF()\Record(I-1)
            \RID=RID
            \Count=RCount
          EndWith
        EndIf
      Next
    EndIf
    ProcedureReturn File
  EndIf
EndProcedure

#FPath="C:\Program Files\Kontakt! 2012\Products\Kontakt! 2012\"

ReadFileDB(#FPath+"prod.dat")
ReadFileDB(#FPath+"prod.dat")
ReadFileDB(#FPath+"Kontakt\init.dat")
drcsetmasterkey(?DB_KEY)
ReadFileDB(#FPath+"Kontakt\comp1.dat")
ReadFileDB(#FPath+"Kontakt\comf1.dat")
ReadFileDB(#FPath+"Kontakt\head1.dat")
ReadFileDB(#FPath+"Kontakt\regi1.dat")
ReadFileDB(#FPath+"Kontakt\sadd1.dat")
ReadFileDB(#FPath+"Kontakt\banner1.dat")
ReadFileDB(#FPath+"Kontakt\reno1.dat")
ReadFileDB(#FPath+"Kontakt\ext01.dat")
ReadFileDB(#FPath+"Kontakt\ext11.dat")
ReadFileDB(#FPath+"Kontakt\ext21.dat")
Дальше веселее. По размеру файла idxs1.idx, понял что вся вкусность храниться в нём, а dat - это лишь заглавные файлы хранящие инфо о полях в нём. И для работы с ним есть либа xfind.dll, эта гадость линкуется в процессе уже.
На ней и застрял. Если правильно уловил параметры в ольке, то вызывается изначально

Код:
xloadfile(#FPath+"Kontakt\idxs1.idx")
Но что за щятафака? Возвращает она S_OK, если файл норм, и код ошибки если нет, а где же указатель на прочтённый файл или что-то в этом роде? Выделения памяти библиотекой тоже не заметил.

Поиск по БД если снова таки правильно понял, то осуществляется с помощью xfind_cb. Пока, это всё, что удалось нарыть.

Помогите совместить полезное с приятным. Решить проблему и за одно освоить сие направление, чтобы в дальнейшем я не задавал такие вопросы а смог сам пройти этот путь
  Ответить с цитированием
Ответ

Метки
исследование, программ., урок

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 03:47.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net