Если вы хотите защитить базу данных, которая используется в вашей программе, то эта информация окажется вам полезной. Возможно нужно улучшить защиту, например, шифруя значения базы данных и расшифровывая их при выводе.
Итак. Есть программа с папкой DATA, данные из которой очень хочется получить.
Есть несколько вариантов.
Для начала нужно узнать в каком формате хранятся данные в программе. Можно воспользоваться бесплатной программой TrID. Пробуем ...
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/7c0/c67/d86/7c0c67d869f328f3f04b1fdc6d15e92c.png)
Печаль. Что-то не известное. Похоже на какой-то собственный формат на основе ole datastore. Если это действительно так и разработчики решили заморачиваться и писать собсвенную СУБД то извлечь данные будет очень сложно и долго. Проще будет воспользоваться вариантом 1.
Но, все программисты ленивые и скорее всего это какой то известный формат. Например Access или Firebird. Я бы так сделал. Поискал в каталоге с программой, нет никаких библиотек.
Исследуем дальше. Скачиваем очень полезную бесплатную утилиту с Process explorer, которая показывает все обращения программы к реестру, файлам и всему что возможно.
Запускаем, настраиваем, чтобы моиторила только один процесс catalog.exe — главный исполняемый файл программы.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/c7f/43f/75f/c7f43f75f8dc885e1295a73bdf521bda.png)
Запускаем программу и смотрим, куда она обращается.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/4d2/d3d/464/4d2d3d46436d45a725113a04dae6080c.png)
О! Она использует ODBC источник данных. Скорее всего используемая бд это access! Ставим себе плюсик. Смотрим дальше. Есть интересный ключ в реестре TraceSQLMode. Погуглив выясняется, что все запросы можно писать в файл. Меняем ключик и ищем файл. Нашли:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/80e/ec3/1dd/80eec31dd8177fb18d0c546872da3741.png)
Смотрим запросы:
Табличка называется spare, что в переводе означает запасная часть. Значит это не вспомогательня БД и там действительно хранятся наименования деталей. Отлично. Смотрим дальше.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/77b/469/c6b/77b469c6b1e82d57466b0070ec6da409.png)
Идет обращение к файлу БД не в каталоге с программой. Значит он временно туда копируется. Пробуем открыть в access — без результата, не понимает.
Делаем действие в программе, переключаемся ну другую позицию в каталоге, смотрим более внимательно на лог:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/c23/e06/708/c23e06708d68207f81521ecad4d48acb.png)
Перед запросом происходят модификации файла, что-то в него пишется. Вероятно он или расшифровывается или меняется заголовок файла. Теперь это уже не важно, т.к понимаем, что если до запроса скопировать этот файл, то с большей долей вероятности он окажется рабочим.
Значит нужно как-то приостановить выполнение программы до запроса, пока файл рабочий. Правильно, трассировкой в дебаггере. Скачиваем дебаггер, например, бесплатный OllyDbg весом 1.3МБ.
Запускаем в режиме администратора, если у вас windows vista и выше.
Присоединяемся к запущенному процессу (attach)
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/4da/995/616/4da995616ca3f1207350c8a90209093e.png)
Выбираем наш процесс:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/db3/30c/9e8/db330c9e8cb74b4e85c2ac79dc32f814.png)
Возвращаемся в Process Explorer и смотрим стек вызова функции (в контекстном меню события):
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/00d/e2b/ddb/00de2bddbb6c8a6434ccccfeb469c98a.png)
Точку останова можно поставить на вызове закрытия файла CloseHandle в системном модуле kernel32.dll.
Переходим в этот модуль в дебаггере:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/65c/f9a/3d5/65cf9a3d5efd02f5c0c290c03cdef404.png)
Находим нужную функцию:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/2d1/bb4/2f4/2d1bb42f47b84997804f420bd662f92a.png)
Ставим точку остановки (Breakpoint) — F2.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/d91/1a3/20c/d911a320c30af3f215132d4db262c978.png)
Дальше запускаем выполнение программы, нажав F9. И делаем какое либо действие в подопытной программе. Программа остановится на брекпоинте.
Трассируем (F8) в дебаггрере, пока не появятся записи обращения к реестру перед выполнением запроса. Это будет означать, что файл БД модифицирован для подключения к нему и он пригоден для чтения.
После этого переходим к файлу и копируем его в другое место:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/c79/0d8/97b/c790d897b3eb325db7125c3c7b0ebd8c.png)
Смотрим, что за файл теперь:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/ba1/428/84c/ba142884c8602c84bf7def0b9061664d.png)
100% mdb! Это файл MS Access. Переименовываем, открываем, убеждаемся, что все хорошо.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/50f/ed4/e71/50fed4e71ac60921a07f149b4bacf03d.png)
Мы успешно получили БД, пригодную для дальнейших модификаций или конвертирования в другой формат.
Раз уж начал писать, то выложу скрипт на groovy для конвертирования данных из MS Access в PostgreSQL БД.
вот он:
Запускается интерпретатором:
Выводы: Чтобы защитить базу нужно либо (самое надежное) писать данные в собственном формате, либо шифровать значения в базе данных и разархивировать непосредственно при отображении, а так же использовать вспомогательные методы защиты, например шифровать сам файл, менять сигнатуру файла, использовать встроенные средства шифрования бд.
P.S. Автор этой статьи — Александр Суровцев. Если материал вам понравился, помогите ему пожалуйста получить инвайт на Хабр. Свои инвайты я, к сожалению, все раздал. Адрес его электронной почты — surovtsev.alex на gmail.com, твиттер — mobal1 Большое спасибо!
Итак. Есть программа с папкой DATA, данные из которой очень хочется получить.
Есть несколько вариантов.
- Превый вариант. Можно пойти сложным путем, снимая скриншоты и экспортируя заявки по одной в excel. Но это долгий способ и неинтересный.
- Второй вариант. Подумать и раскодировать данные.
Для начала нужно узнать в каком формате хранятся данные в программе. Можно воспользоваться бесплатной программой TrID. Пробуем ...
![image](https://habrastorage.org/getpro/habr/post_images/7c0/c67/d86/7c0c67d869f328f3f04b1fdc6d15e92c.png)
Печаль. Что-то не известное. Похоже на какой-то собственный формат на основе ole datastore. Если это действительно так и разработчики решили заморачиваться и писать собсвенную СУБД то извлечь данные будет очень сложно и долго. Проще будет воспользоваться вариантом 1.
Но, все программисты ленивые и скорее всего это какой то известный формат. Например Access или Firebird. Я бы так сделал. Поискал в каталоге с программой, нет никаких библиотек.
Исследуем дальше. Скачиваем очень полезную бесплатную утилиту с Process explorer, которая показывает все обращения программы к реестру, файлам и всему что возможно.
Запускаем, настраиваем, чтобы моиторила только один процесс catalog.exe — главный исполняемый файл программы.
![image](https://habrastorage.org/getpro/habr/post_images/c7f/43f/75f/c7f43f75f8dc885e1295a73bdf521bda.png)
Запускаем программу и смотрим, куда она обращается.
![image](https://habrastorage.org/getpro/habr/post_images/4d2/d3d/464/4d2d3d46436d45a725113a04dae6080c.png)
О! Она использует ODBC источник данных. Скорее всего используемая бд это access! Ставим себе плюсик. Смотрим дальше. Есть интересный ключ в реестре TraceSQLMode. Погуглив выясняется, что все запросы можно писать в файл. Меняем ключик и ищем файл. Нашли:
![image](https://habrastorage.org/getpro/habr/post_images/80e/ec3/1dd/80eec31dd8177fb18d0c546872da3741.png)
Смотрим запросы:
SELECT
…
FROM spare LEFT JOIN photo ON photo.serial = spare.serial
Табличка называется spare, что в переводе означает запасная часть. Значит это не вспомогательня БД и там действительно хранятся наименования деталей. Отлично. Смотрим дальше.
![image](https://habrastorage.org/getpro/habr/post_images/77b/469/c6b/77b469c6b1e82d57466b0070ec6da409.png)
Идет обращение к файлу БД не в каталоге с программой. Значит он временно туда копируется. Пробуем открыть в access — без результата, не понимает.
Делаем действие в программе, переключаемся ну другую позицию в каталоге, смотрим более внимательно на лог:
![image](https://habrastorage.org/getpro/habr/post_images/c23/e06/708/c23e06708d68207f81521ecad4d48acb.png)
Перед запросом происходят модификации файла, что-то в него пишется. Вероятно он или расшифровывается или меняется заголовок файла. Теперь это уже не важно, т.к понимаем, что если до запроса скопировать этот файл, то с большей долей вероятности он окажется рабочим.
Значит нужно как-то приостановить выполнение программы до запроса, пока файл рабочий. Правильно, трассировкой в дебаггере. Скачиваем дебаггер, например, бесплатный OllyDbg весом 1.3МБ.
Запускаем в режиме администратора, если у вас windows vista и выше.
Присоединяемся к запущенному процессу (attach)
![image](https://habrastorage.org/getpro/habr/post_images/4da/995/616/4da995616ca3f1207350c8a90209093e.png)
Выбираем наш процесс:
![image](https://habrastorage.org/getpro/habr/post_images/db3/30c/9e8/db330c9e8cb74b4e85c2ac79dc32f814.png)
Возвращаемся в Process Explorer и смотрим стек вызова функции (в контекстном меню события):
![image](https://habrastorage.org/getpro/habr/post_images/00d/e2b/ddb/00de2bddbb6c8a6434ccccfeb469c98a.png)
Точку останова можно поставить на вызове закрытия файла CloseHandle в системном модуле kernel32.dll.
Переходим в этот модуль в дебаггере:
![image](https://habrastorage.org/getpro/habr/post_images/65c/f9a/3d5/65cf9a3d5efd02f5c0c290c03cdef404.png)
Находим нужную функцию:
![image](https://habrastorage.org/getpro/habr/post_images/2d1/bb4/2f4/2d1bb42f47b84997804f420bd662f92a.png)
Ставим точку остановки (Breakpoint) — F2.
![image](https://habrastorage.org/getpro/habr/post_images/d91/1a3/20c/d911a320c30af3f215132d4db262c978.png)
Дальше запускаем выполнение программы, нажав F9. И делаем какое либо действие в подопытной программе. Программа остановится на брекпоинте.
Трассируем (F8) в дебаггрере, пока не появятся записи обращения к реестру перед выполнением запроса. Это будет означать, что файл БД модифицирован для подключения к нему и он пригоден для чтения.
После этого переходим к файлу и копируем его в другое место:
![image](https://habrastorage.org/getpro/habr/post_images/c79/0d8/97b/c790d897b3eb325db7125c3c7b0ebd8c.png)
Смотрим, что за файл теперь:
![image](https://habrastorage.org/getpro/habr/post_images/ba1/428/84c/ba142884c8602c84bf7def0b9061664d.png)
100% mdb! Это файл MS Access. Переименовываем, открываем, убеждаемся, что все хорошо.
![image](https://habrastorage.org/getpro/habr/post_images/50f/ed4/e71/50fed4e71ac60921a07f149b4bacf03d.png)
Мы успешно получили БД, пригодную для дальнейших модификаций или конвертирования в другой формат.
Раз уж начал писать, то выложу скрипт на groovy для конвертирования данных из MS Access в PostgreSQL БД.
вот он:
import groovy.sql.Sql
java.util.Properties prop = new java.util.Properties();
prop.put(“charSet”, “cp1251”);
sourceSql = Sql.newInstance(‘jdbc:odbc:catalog2’,prop)
targetSql = Sql.newInstance(“jdbc:postgresql://localhost:5432/catalog”,”catalog”,”catalog”, “org.postgresql.Driver”)
def images = targetSql.dataSet(“image”);
sourceSql.eachRow(‘select * from image’) {
def id = it.id
images.add(id:id,block:it.block);
def image=it.getProperty(“image”)
if (image) {
File f = new File(“D:/trid_w32/images/” + id + “.png”);
f.append(image);
}
}
def coords = targetSql.dataSet(“coord”);
sourceSql.eachRow(‘select * from coord’) {
coords.add(id:it.id,block:it.block,x:it.x,y:it.y,r:it.r);
}
def spares = targetSql.dataSet(“spare”);
sourceSql.eachRow(‘select * from spare’) {
spares.add(id:it.id,parent:it.parent,num:it.num,serial:it.serial,count:it.count,spec:it.spec,apply:it.apply,ru:it.ru,cn:it.cn);
}
Запускается интерпретатором:
groovy имя_скрипта.groovy
Выводы: Чтобы защитить базу нужно либо (самое надежное) писать данные в собственном формате, либо шифровать значения в базе данных и разархивировать непосредственно при отображении, а так же использовать вспомогательные методы защиты, например шифровать сам файл, менять сигнатуру файла, использовать встроенные средства шифрования бд.
P.S. Автор этой статьи — Александр Суровцев. Если материал вам понравился, помогите ему пожалуйста получить инвайт на Хабр. Свои инвайты я, к сожалению, все раздал. Адрес его электронной почты — surovtsev.alex на gmail.com, твиттер — mobal1 Большое спасибо!