![]() |
eXeL@B —› Вопросы новичков —› Помогите влезть в шифрованную базу данных через DLL |
Посл.ответ | Сообщение |
|
Создано: 25 декабря 2008 20:52 · Поправил: [Oleg] · Личное сообщение · #1 У меня есть виндовая программа (специфичная в моей отрасли), которая является каталогом-справочником и на диске лежит как куча шифрованных файлов. Рядом лежит небольшое число нешифрованных DBF файлов. Если "походить" в программе (мышкой), то в памяти возникают небольшие расшифрованные куски базы. Сами таблицы крайне примитивны - тот же DBF или иной формат с простой фиксированной длиной строк. За работу с данными отвечает отдельный bhdb.dll. Список его функций и назначение очевидны: Code:
Суть в том, как утащить эти шифрованные данные? Понимаю (в меру своих способностей) следующие варианты: 1. Как бы написать свою DLL, подсунуть вместо оригинала, а bhdb.dll подгрузить и вызывать функции прозрачно для самой проги. Тогда бы моя DLL, как прокси, все бы скинула в текстовые файлы на диске и готово. Писать в Borland C++ свои DLL и в коде загружать чужие, используя их функции (если иметь документацию по параметрам) - умею. 2. Я иду в Олю, руками смотрю адреса функций (либо прога сама вычислит адрес, поискав код DLL функций) и далее из своей проги вызываю у чужой программы функции bhdb.dll. Определять ID процесса и читать чужую память - умею. Вызывать чужие функции и получать результат - нет. Дописывать сложный код в чужие программы - не умею (если только пяток простых строк в пустых местах, забитых нулями). Внедрять в чужие запущенные процессы свои потоки - не умею. 3. Из своей софтины на С++ подгрузить bhdb.dll и прочитать базу. Затрудняет отсутствие документации по параметрам и не ясный до конца алгоритм оригинальной программы, как она сама вызывает функции. 4. Узнать алгоритм функцию чтения шифрованного файла базы данных и воспроизвести его на любом языке программирования. Слишком сложно для меня, много кода. Элементарно не отделить полезный код, когда библиотека ищет нужные строки по базе, от собственно алгоритма расшифровки. Как-то трейсил все подряд от момента открытия по CreateFile до выдачи текста - ничего не понял. По поводу пунктов 1-2. Например, есть функция SELECT (bhdb.dll), которая по условиям основной программы читает и ищет нужные строки. Code:
Она вызывается из базовой программы кода с 6-ю параметрами: Code:
Подскажите, что делать, в каком направлении изучать тему? Как внедриться в софт, чтобы заставить чужую DLL выдать данные? ![]() |
|
Создано: 26 декабря 2008 10:16 · Личное сообщение · #2 Я правильно понимаю, что в приведенном примере функция Select лезет в шифрованую базу и в каком-то одном параметре на выходе получается расшифрованная строка? Или же строка зашифрована? Я бы делал так: нашел бы интересующий параметр (если он визуально определяется) и дальше такой код в своей дллке: func DbSelect { call DbSelect_Original mov EAX, DWORD PTR [EBP-X] //где X увидели на предыдущем шаге перед передачей управления оригинальной функе sprintf("%s", EAX) return } Очень сорри за комбинацию языков =) смысл надеюсь понятен. ----- Blame the victim! ![]() |
|
Создано: 26 декабря 2008 11:40 · Личное сообщение · #3 DbSelect - это аналог SQL запроса. Функция записыват в выделенный кусок памяти блок строк из базы. Строки из базы выбираются на основе самого запроса поиска. Кусок в памяти расшифрован и ищется в памяти программы. Расшифка базы происходит на этапе чтения файла из bhdb.dll, иначе поиска по параметрам не сделать. Основная программа получает чистые данные по запросу. sprintf - это хорошо, но куда его писать? Если в свою сишную прогу, то нужно подключить bhdb.dll. С этим сложности. Ведь чтобы вызвать DbSelect, нужно правильно инициализировать систему: DbInit_W(), DbSetContext_W(), только потом DbSelect(). И самое главное - нужно же в функции передавать правильные указатели на какие-то блоки памяти! Просто так отловить параметры одного запроса и посмотреть их в Оле не составляет никакого труда - бряк на функцию и в стеке (или в окне вызова функций) все видно. Допустим, я знаю один типичный запрос, чтения одной заданной таблицы, по одной строке по порядковому номеру. Как мне автоматизированно вызвывать DbSelect() и сохранять в своем файле очередной считанный кусок? Наиболее простой для меня вариант в данной ситуации. Запустили Олю, поставили бряк на функцию и далее нужно а) последовательно вызвать функцию со всем перечнем строк (от 0 до 999999) б) сохранить результат в файл после отработки функции (указатель на нужный блок останется в стеке по фиксированному месту) ![]() |
|
Создано: 29 декабря 2008 14:09 · Личное сообщение · #4 граждане, неужели никто не умеет из своего процесса вызывать процедуры чужого процесса? или метода, как написать свою DLL-прокси для замена оригинальной и сброса в лог всех передаваемых данных? кто может обучить сему процессу в Питере на платной основе? В детстве, когда ходил на курсы асма, такому увы не учили ![]() ![]() |
|
Создано: 29 декабря 2008 18:02 · Личное сообщение · #5 счас думаю у народа сессия, поэтому мало кто отвечает. ИМХО я бы сделал так: 1) написал длл-фильтр, т.е. пишешь свою длл bhdb.dll оригинал переименовываешь в bhdb_.dll 2) в своей длл создаешь точно такие же экспортируемые функции как и в оригинале bhdb.dll. 3) все функции работают как фильтр. т.е. имеют след. вид: int MydbSelect(....// параметры которые передаются ) { typedef int (WINAPI *OrignFunSelet)(... ); dll = LoadLibrary( "bhdb_.dll" ); Fun = GetProcAddress( dll , "DbSelect ); return Fun(...); } это грубый пример, но думаю будет понятно. 4) делаешь подмену и проверяешь что прога нормально работает, не глючит не и падает. 5) в код нужных функции добавляешь логику прохода по всем индексам таблицы или т.п. в общем делаешь что захочешь. инициализацию и раскриптовку базы сделает сама прога!!!! ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Помогите влезть в шифрованную базу данных через DLL |