Сейчас на форуме: jinoweb (+5 невидимых)

 eXeL@B —› Программирование —› Поможет ли реверсинг?
Посл.ответ Сообщение

Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 ноября 2015 03:58 · Поправил: armaNd0
· Личное сообщение · #1

Уважаемые старожилы, мудрецы, гуру и "!!!!!!" форума!

Прошу Вас поделиться своими комментариями - каким путём и почему Вы пошли бы, решая следующую задачу:
• как включить в процесс импорта данных из бинарного файла процедуру "разбора" этих данных, а точнее - их структурирование (восстановление признаков разделения полей и концов строк). режим read-only.

Мои комментарии:
• есть стандартные (win/x86x/64) реализации импорта (oledb/odbc), работающие со структурированными источниками, и есть юзеры, импортирующие этими механизмами (прямыми запросами) сотни тысяч записей из баз SQL-server в сводные таблицы Excel для дальнейшей аналитики и прочих нужд с завидной скоростью и периодичностью
• поставщик некоторых данных переводит часть данных в формат бинарного файла, в котором по несложному алгоритму закодирована таблица. условный пример - представим файл *.csv, из которого удалены символы структуры (\t\r), а в начало файла записаны числа - количество полей и длины каждого. Почти та же таблица, только одной строкой.
• требуется внедрить в процесс импорта данных из бинарного файла процедуру их разбора (восстановления удалённых символов структуры), не потеряв юзабилити. то есть чтобы скорость такого импорта была сопоставима с oledb/odbc и чтобы юзер не заметил особой разницы между тем, с каким форматом данных приходится работать.
• какие могут быть варианты решения:
→ промежуточный файл-конвертер: нежелательно, предполагается 2 действия (импорт + импорт)
→ прописать на VBA: насколько я знаю, самое медленное, кустарное решение
→ надстройка Excel: менее желательный вариант
→ пропатчить одну из dll (если не ошибаюсь, kernel32 или ole32) - добавив в ReadFile условие если <формат бинарный> то <разбор бинарника> иначе <работа dll в обычном режиме>

Я не силён в реверсинге, поэтому и прошу совета. Работаю c IDA Pro 6.0, Procmon, apimonitor x64, Visual Studio.

Буду признателен любым комментариям. Также рассматриваются любые возмездные предложения о помощи - от платных консультаций (Вы говорите что делать - я делаю, показываю итоги, Вы корректируете и направляете, и т.д.) до помощи в работе по программированию. Или также буду благодарен, если Вы кого-то сможете порекомендовать.

Спасибо!




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 22 ноября 2015 04:13
· Личное сообщение · #2

че надо сделать так и не понял, что куда заче импортировать ?
начните сначала

winhex умеет разбирать любой бинарный формат на основе не сложного скрипт языка,
надо лишь описывать форматы разбора каждого отдельного разного бинарного формата файла

| Сообщение посчитали полезным: armaNd0


Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 22 ноября 2015 04:22
· Личное сообщение · #3

Надо ODBC драйвер писать.

-----
http://ntinfo.biz


| Сообщение посчитали полезным: armaNd0

Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 ноября 2015 04:24 · Поправил: armaNd0
· Личное сообщение · #4

нууу, если сам reversecode подключился к теме, дело уже не кажется таким безнадёжным!

было (упрощенно): открывает юзер Excel-->Данные-->Из текста-->Импорт текстового файла (*.csv)-->Открыть.... Готово! На лист Excel импортирована таблица. Все записи - с нужных столбцах и строках.

по-новому: открывает юзер Excel-->Данные-->Из текста-->Все файлы (*.*) [выбирает бинарный файл]-->Открыть.... Готово! На лист Excel импортирована таблица. Все записи - с нужных столбцах и строках. Но импорт был произведён из бинарного файла.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 22 ноября 2015 04:27
· Личное сообщение · #5

winhex что ли изобретать хотите?
сходите почитайте что он уже умеет, может то что вам надо



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 ноября 2015 04:29
· Личное сообщение · #6

hors пишет:
Надо ODBC драйвер писать.

да, верное предложение, такое решение тоже имеет право быть, но на мой взгляд весь огромный функционал odbc окажется просто не используемым. ведь требуется только чтение, create/delete/update не будет... хотя если можно написать light-версию odbc, то супер, слышал, что исходники 2010-го года имеются кажется у народа




Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 22 ноября 2015 04:47
· Личное сообщение · #7

Если необходимо только открывать файлы определенного типа в excel, то можно просто написать плагин, в Visual Studio кажется есть шаблоны.

-----
http://ntinfo.biz


| Сообщение посчитали полезным: armaNd0


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 22 ноября 2015 07:57
· Личное сообщение · #8

hors пишет:
в Visual Studio кажется есть шаблоны.


Точно, есть такие, кажется начиная с VS 2008.
Сам использовал когда-то для подобных целей, правда давно это было.

-----
Give me a HANDLE and I will move the Earth.


| Сообщение посчитали полезным: armaNd0

Ранг: 58.3 (постоянный), 50thx
Активность: 0.040.08
Статус: Участник

Создано: 22 ноября 2015 10:28 · Поправил: DrVB_5_6
· Личное сообщение · #9

armaNd0 пишет:
→ прописать на VBA: насколько я знаю, самое медленное, кустарное решение

Ну да, для того, чтобы импортировать несколько килобайт данных, нужно изобрести такой велосипед, у которого будет привод 4х4, турбина от самолёта и ещё чуть-чуть прибамбасов!
Это самая примитивная задачка для VBA.
А чтобы заметить, что решение "медленное" Вам нужно подсунуть импорт близкий к Гб, только вот Excel его вряд ли прожуёт.
А десяток или пару десятков операторов на VBA сработают быстрее, чем Вы передвинете мышку на другое место, впрочем, можно и на asm нарисовать так, что часами будет работать даже на новых процессорах.
Вряд ли даже плагины нужны, хотя никто не запрещает. Можно при этом Haskell попробовать использовать - ещё интереснее будет!
А если ответить на вопрос, который звучит в названии темы, то реверсинг здесь нахрен не нужен.
Тема вообще к нему никакого отношения не имеет!

| Сообщение посчитали полезным: armaNd0


Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 22 ноября 2015 14:03
· Личное сообщение · #10

если нужен плагин для екзеля, то и реверсинг здесь не нужен, и тема не для этого форума,
можно смело закрывать и идти на фриланс искать исполнителя



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 ноября 2015 00:45 · Поправил: armaNd0
· Личное сообщение · #11

hors, plutos, reversecode - спасибо! прислушаюсь к Вашим советам, схожу к шаблонам add-ins

хотя я был более чем уверен, что перехватить в памяти переменную (в процессе kernel32.ReadFile) и заменить её на себя же преобразованную - самое доступное и правильное решение, чем создание *.xla

И мой вопрос как раз был именно в этом - оптимален ли реверсинг kernel32 как решение или нет?

неожиданно, что большинство отмечает колоссальную сложность такого решения

DrVB_5_6, спасибо за отклик, добавлю немного ясности:

реальные условия задачи таковы - из бинарного файла размером более 1Гб в pivot table (excel) требуется импортировать порядка 100Мб данных для аналитиков + есть вероятность того, что будет востребована масштабируемость решения

поэтому я предположил, что vba проиграет по скорости решению с пропатченной dll

версия про плагины принята; обязательно ознакомлюсь с тем, что есть haskell и, с Вашего позволения, задам вопросы и по этому варианту



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 23 ноября 2015 01:33 · Поправил: dosprog
· Личное сообщение · #12

armaNd0 пишет:
поэтому я предположил, что vba проиграет по скорости решению с пропатченной dll

Ок. Патчить будем функцию CreateFileMapping(..).
Самый нормальный вариант. Чем этот скушный бейсик.






Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 23 ноября 2015 17:17
· Личное сообщение · #13

armaNd0 пишет:
оптимален ли реверсинг kernel32 как решение или нет?

Для перехвата реверсинг и не нужен

armaNd0 пишет:
неожиданно, что большинство отмечает колоссальную сложность такого решения

Для неподготовленного человека, без специфических навыков, это будет проблемно, потому следом можно было бы скорей всего ждать топика "что я делаю не так с инжектом?"
Да, Вам верно посоветовали. Этот не тот случай для инжектов/перехватов/подмен.

hors пишет:
Надо ODBC драйвер писать.

да, верное предложение, такое решение тоже имеет право быть, но на мой взгляд весь огромный функционал odbc окажется просто не используемым. ведь требуется только чтение, create/delete/update не будет...
Да ну а Вам-то что, что не будет востребован? Весь функционал в dll лежит. В %SystemRoot/System32/% много разных dll и exe, функционал которых никогда не востребуется. Достаточно просто использовать, что надо

hors пишет:
Если необходимо только открывать файлы определенного типа в excel, то можно просто написать плагин, в Visual Studio кажется есть шаблоны.

Да, верно, в MSVS есть возможность создавать excel-приложения на C#, на vb#, чтобы сворганить свою обработку данных и распределить по листам, по ячейкам.

Но, ИМХО, мне для себя было бы проще подключить dll, с 3-4мя хуками, ибо уже набил руку тут. Просто на системах с включённым HIPS может не работать. И если это для кого-то, а не для себя, то всё зависит от уровня этого кого-то, а то и объяснять придётся, как правильно воспользоваться поделкой )

-----
IZ.RU


| Сообщение посчитали полезным: armaNd0

Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 23 ноября 2015 17:54 · Поправил: VodoleY
· Личное сообщение · #14

DenCoder пишет:
то всё зависит от уровня этого кого-то, а то и объяснять придётся, как правильно воспользоваться поделкой )

вот тут.. наверно самое важное. Надо использовать решение, которое ближе к телу.. Реализовывать его на том, в чем больше познаний. А идеал можно писать вечно.
З.Ы. ИМХО.. не выдержит екцел такого обьема данных.. ИМХО задача изначально не правильно поставлена. Конвертер можно делать на чем угодно и потом всовывать в ексцел.. перед тем как это все делать.. я б рекомендовал автору топика, сделать мусорный файл сходного обьема, для теста и попробовать подсунуть эксцелу.. ну не для этого он писался.. (споминаю студенческие годы, когда ВОРД документ с 30 страницами таблиц и формул умирал.)

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....


| Сообщение посчитали полезным: armaNd0


Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 23 ноября 2015 18:09 · Поправил: DenCoder
· Личное сообщение · #15

VodoleY пишет:
споминаю студенческие годы, когда ВОРД документ с 30 страницами таблиц и формул умирал.

Да да. В Excel было раньше(12 лет назад) ограничение - не больше 32768 строк. Как сейчас - не знаю, пока не могу посмотреть, но скорей всего так и осталось. Если элемент данных из 4х байт, объём файла данных 4 гб и по 2 элемента на строчку, то 16 листов понадобится.

-----
IZ.RU


| Сообщение посчитали полезным: TLN

Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 ноября 2015 00:59 · Поправил: armaNd0
· Личное сообщение · #16

DenCoder пишет:
"что я делаю не так с инжектом?"

Вы правы, я практически уже написал это

DenCoder пишет:
Этот не тот случай для инжектов/перехватов/подмен

И тем не менее Вы пишете Но, ИМХО, мне для себя было бы проще подключить dll, с 3-4мя хуками

DenCoder пишет:
Да ну а Вам-то что, что не будет востребован?

Если мы обсуждаем вариант написания odbc-драйвера, то заплатить попросят за весь функционал, в том числе за невостребованный. А если не писать драйвер с нуля и поправить существующий функционал - это уже другое дело)

p.s.
VodoleY пишет:
не выдержит екцел такого обьема данных..

DenCoder пишет:
В Excel было раньше(12 лет назад) ограничение - не больше 32768 строк. Как сейчас - не знаю, пока не могу посмотреть, но скорей всего так и осталось.

Всё кардинально изменилось. Новые xml-форматы файлов office (*.xlsx,*.docx и т.п.) существенно облегчили размеры файлов и скорость работы с ними и в них.

В Excel (до 2007) действительно было зашито ограничение на выделенную память под хранение адресов - 2^16 или 65'536 строк. В новом Excel 2^20 или 1'048'576 строк.

Могу сказать, что сейчас прямым запросом с SQL-servera в Excel закачивается порядка 100 Мб данных примерно за 5 минут (~600.000 записей). Стабильно работает (тьфу-тьфу) более 5 лет (финансовая аналитика). Пользователи в восторге - ведь они получают не просто таблицу данных, а pivot table со всем его функционалом, шикарно реализованным в Excel.

А исходная проблема топика собственно и возникла в связи с тем, что нужно подключиться к новой БД, представляющей собой бинарный файл с разструктурированными данными.




Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 25 ноября 2015 02:09 · Поправил: DenCoder
· Личное сообщение · #17

armaNd0 пишет:
И тем не менее Вы пишете

Пишу, ведь у меня нет проблем с этим. А Вы ещё только рассматриваете это как возможный вариант. Не всё так просто! Я когда начинал внедрять код в другие процессы, у меня вообще-то ещё была Win98(это был 2005 год), под которой не работает функа CreateRemoteThread(). И приходилось писать код под XP, носить на дискете скомпиленую прогу до места назначения, пробовать там, возвращаться, исправлять ошибки... полдня так побегал, надоело... Второй раз был уже в 2008 на XP и удачный. Но привыкнуть к указателям, к указателям на указатели, к приведению типов DWORD к указателям на BYTE и обратно, написанию кода на асме, который должен работать базонезависимо в адресном пространстве другого процесса, и т.п., пользуясь только информацией о потенциальных возможностях, взятых из MSDN... доставляло немало геморроя... Сейчас интернет стал более доступен, масса примеров в сети, но для некоторых это мало меняет дело...

armaNd0 пишет:
Если мы обсуждаем вариант написания odbc-драйвера, то заплатить попросят за весь функционал, в том числе за невостребованный.

То есть Вы определяетесь с вариантом тз исполнителю.
Совсем не факт, что вариант через odbc будет стоить дороже инжекта с подменой данных.

1. Читаем бинарный файл
2. Обрабатываем как надо
3. Через odbc-драйвер вставляем в xls-файл. Не по одной записи, а заполняем ими буфер на 32 -64 мб и пачками инсертим, если екселевская бд позволяет так. Это повысило бы скорость по сравнению с построчной вставкой.

План Б. Если не поддерживается xls-провайдером многострочная вставка или вставка из потока ввода, лучше разобрать формат для непосредственной вставки в xls, чем писать костыль для экселя.

Ниже пример, который 6.5 лет назад писал для преобразования текстового файла в файл Excel. Часть где-то взял, переправил и откомментировал подробно для студента. Конечно, его нужно переправить в соответствии с пп.1-3
Code:
  1. {        //Обработчик события нажатия на кнопку
  2.  
  3.          //Получаем пути файлов и имя листа из полей ввода
  4.          TxtFile.GetWindowTextA(sTxtFile);//Путь к текстовому файлу
  5.          XlsFile.GetWindowTextA(sXlsFile);//Путь к файлу Excel
  6.          SheetName.GetWindowTextA(sSheet);//Имя листа
  7.  
  8.          //Объявление переменных, * означает переменная - указатель на тип
  9.          CStringArray aRows, *aHeaders, *aFields;
  10.          CString sSql, stmp;
  11.  
  12.          //Пробуем открыть указанный текстовый файл только для чтения и без разделения доступа
  13.          // оператором new выделяем область памяти под переменную класса CFile
  14.          CFile* File = new CFile(sTxtFile, CFile::modeRead | CFile::shareDenyNone);
  15.          
  16.          if(File)//Если файл удалось открыть
  17.          {
  18.                  CArchive* Archive = new CArchive(File, CArchive::load);
  19.  
  20.                  //Удаляем все строки, которые могли там оказаться
  21.                  aRows.RemoveAll();
  22.                  while(Archive->ReadString(stmp)) aRows.Add(stmp);
  23.  
  24.                  //Освобождаем области памяти
  25.                  delete Archive;
  26.                  delete File;
  27.          }
  28.          else//Если файл не удалось открыть
  29.          {
  30.                  //Формируем строку сообщения об ошибке
  31.                  //в строке формата %s указывает где вставить имя файла sTxtFile
  32.                  stmp.Format("Убедитесь, что Файл %s существует", sTxtFile);
  33.                  //Вывод сообщения об ошибке на экран
  34.                  //NULL сообщает, что нет родительского окна и тогда окно сообщения не блокирует никакое окно
  35.                  //3-й параметр - заголовок окна сообщения об ошибке
  36.                  //MB_OK - окно сообщения с кнопкой OK
  37.                  //Оператор :: означает, что вызываем глобальную ф-цию
  38.                  ::MessageBox(NULL, stmp, "Ошибка чтения файла", MB_OK);
  39.          }
  40.  
  41.          //Читаем заголовки, заголовки - самая первая строка, в массиве CStringArray она с индексом 0
  42.          aHeaders = ReadHeaders(aRows);
  43.  
  44.          //Создаем переменную класса CDatabase для сохранения данных в формате Excel
  45.          CDatabase* db = new CDatabase;
  46.          CString sDSN, sPath;
  47.  
  48.          //Определяем папку файла Excel
  49.          int nSlashPos = sXlsFile.ReverseFind('');
  50.          if(nSlashPos == -1)nSlashPos = sXlsFile.ReverseFind('/');
  51.          if(nSlashPos != -1)sPath = sXlsFile.Left(nSlashPos + 1);
  52.          else sPath = "\.";
  53.  
  54.          //Формируем строку подключения к базе данных
  55.          //в строке формата 1-ый %s указывает где вставить имя Excel-файла sXlsFile, 2-ой - папку файла
  56.          sDSN.Format("dsn=файлы excel;dbq=%s;defaultDir=%s;DriverId=790;", sXlsFile, sPath);
  57.  
  58.          //Объявляем переменную, посредством которой будет заполняться таблица в нашем диалоге
  59.          CString sCSVData;
  60.  
  61.          //Пробуем подключиться через базу данных к файлу Excel
  62.          if(db->OpenEx(sDSN, CDatabase::noOdbcDialog))//Если получилось
  63.          {
  64.                  //Пробуем удалить лист, возможно указанный файл существует и есть такой лист
  65.                  DeleteTable(db, sSheet);
  66.                  //Заново создаем лист
  67.                  if(CreateTable(db, sSheet, *aHeaders))//Если лист создан
  68.                  {
  69.                         //Узнаем число строк и число столбцов (по числу заголовков)
  70.                         int RowCount = aRows.GetCount(), HeadersCount = aHeaders->GetCount();
  71.                         //Формируем первую строку для заполнения таблицы
  72.                         for(int i = 0; i < HeadersCount; i++)
  73.                         {
  74.                               sCSVData += aHeaders->GetAt(i);
  75.                               if(HeadersCount - i > 1) sCSVData += ",";
  76.                         }
  77.                         //Добавляем к строке символы конца строки
  78.                         sCSVData += "\r\n";
  79.  
  80.                         //0-ая строка - строка заголовков
  81.                         for(int i = 1; i < RowCount; i++)
  82.                         {//Получаем следующие строки, добавляем их через БД в файл Excel и продолжаем формировать данные для таблицы
  83.                               //Получаем следующую строку
  84.                               aFields = ReadFields(aRows, i);
  85.  
  86.                               //добавляем строку - значения столбцов через БД в файл Excel 
  87.                               AddRow(db, sSheet, *aHeaders, *aFields);
  88.  
  89.                               //продолжаем формировать данные для таблицы
  90.                               int FieldsCount = aFields->GetCount();
  91.                               for(int i = 0; i < FieldsCount; i++)
  92.                               {
  93.                                    sCSVData += aFields->GetAt(i);
  94.                                    if(FieldsCount - i > 1) sCSVData += ",";
  95.                               }
  96.                               sCSVData += "\r\n";
  97.  
  98.                               //так как у нас массив занчений столбцов создается динамически, то удаляем/освобождаем область памяти
  99.                               delete aFields;
  100.                         }
  101.  
  102.                         //Заполняем нашу таблицу в диалоге
  103.                         Spreadsheet.put_CSVData(sCSVData);
  104.                  }
  105.                  //Закрываем базу данных
  106.                  db->Close();
  107.          }
  108.          else//Не получилось открыть файл
  109.          {
  110.                  stmp.Format("Не удалось создать/открыть файл %s.");
  111.                  stmp += "Убедитесь, что вы обладаете достаточными правами и что файл не используется другим приложением";
  112.                  ::MessageBox(NULL, stmp, "Ошибка БД", MB_OK);
  113.          }
  114.  
  115.          //Освобождаем область памяти из-под массива заголовков
  116.          delete aHeaders;
  117.          //Освобождаем область памяти из-под БД
  118.          delete db;
  119. }
.

-----
IZ.RU


| Сообщение посчитали полезным: armaNd0

Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 25 ноября 2015 14:59
· Личное сообщение · #18

Так вот кто пишет на MFC. Наконец-то я увидел этих динозавров "в живую"

| Сообщение посчитали полезным: MasterSoft, DenCoder


Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 25 ноября 2015 16:18 · Поправил: DenCoder
· Личное сообщение · #19



Комбинации \ \ в постах по-прежнему подвергаются преобразованиям
Code:
  1. Было (без лишних пробелов) " \ \ ",
  2. стало ""(тут должно быть 2 слеша в кавычках, а их нет)

Выглядит так, как будто в коде ошибка. Для изучающих Си очень мучительно будет искать

-----
IZ.RU




Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 ноября 2015 10:38
· Личное сообщение · #20

Резюме темы.

Я понял и авторов первых откликов, и DenCoder, VodoleY - решение кардинально зависит от параметров пользователей. 'Под себя', на 1 машину - оптимален инжект. Для 5-10 пользователей - создание Addin. Масштабируемое коммерческое решение - odbc-драйвер.

Спасибо ВСЕМ, кто нашёл время поделиться своими комментариями - благодаря Вам я нашёл ответ на свой вопрос.

Проект будет опубликован на фрилансе.


 eXeL@B —› Программирование —› Поможет ли реверсинг?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати