Сейчас на форуме: _MBK_, ut2004, vsv1 (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Выбор инструментов для задачи (+)
Посл.ответ Сообщение

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

Создано: 09 декабря 2006 09:22
· Личное сообщение · #1

Доброго, уважаемые форумчане. Мне нужна помощь по выбору инструментария в целом и в частности по OllyDbg.
Задача:
Возможно Вы слышали о таком математическом пакете как Mathcad, менее вероятно, что Вы знаете, что в версии 11-13,5 встроено ядро символьных вычислений от другой математической программы - MapleV R4. Вот с этими двумя программами мне нужно повозиться. Конкретно с Mathcad 11.0a и MapleV R4 (не демо). Что нужно: Mathcad 11.0a (далее MC11) является численной системой, т.е. в общем выполняет численные расчёты, но может обращаться к "встроенному" (отдельная OEM библиотека) символьному движку Maple. После нескольких лет изучения возможностей MC11 выяснилось, что кроме документированного использования символьных вычислений (из справки) в нём доступна вся функциональность символьного движка, НО есть проблема. Интерфейс MC не позволяет передавать команды maple-движку напрямую. Послдений имеет командный интерфейс, в отличие от MC, у которого, как известно, он графический. Был придуман (мною) извращённый подход к обходу этой проблемы. Я написал простую программку на языке MC для перевода текстовых строк в строки понятные maple-движку, которая передаёт потом эту строку на выполнение движку. К сожалению, возможности этой утилитки не идут ни в какое сравнение с оригинальным IDE интерфейсом MapleV R4 (хоть и устаревшим - заря MS Windows 95). В общем и целом, дела обстоят так. Мне нужно подцепить каким-либо образом "выдранный" IDE MapleV R4 к MC11 таким образом, чтобы, допустим, по нажатии кнопы он вызывался, а команды его передавались встроенному симольному движку и результаты отображались тоже в IDE.

Теоретически, думаю, что это можно как-то реализовать. Надо отметить, что обе среды - интерпретаторы, т.е. у них где-то есть главная интерпретирующая функция, причём у MC11 их 2, т.к. численные расчёты там выполняются отдельно от символьных. Нужно отыскать интерпретирующую функцию в MapleV R4 и такую же в MC11. Далее, MC11 поддерживает механизм "плагинов". Просто он может подключать dll-ки при запуске. Я хочу переделать запускающий файл MapleV R4, который содержит всю функциональность и является единственным исполняемым файлом (ни dll ничего более, только доп. файлы с данными), под вид dll-ки для MC11 (опыт есть по реализации интерфейса в dll для MC). Короче, суть ... нужно перенаправить текстовую строку введённую в IDE Maple внутреннему движку MC11 и отобразить результат тоже в IDE - Всё это будет в обход интерфейса MC11 - это нормально.

Задача со многими неизвестными. Дело в том, что если бы получилось совместить 2 интерфейса, то среда для математических расчётов была бы очень мощная, её уже прозвали Maplecad VR4/11. Можно обойтись и без интерфейса, но с ним всё-таки гораздо удобнее и лучше. Я остановился пота на под задаче отыскания кода интерпретатора в MapleV R4, для чего скачал OllyDbg, настроил по статье и теперь соображаю, что делать далее....

Вот ссылка по использованию недокументированных возможностей символьных вычислений в MC11:
forum.exponenta.ru/viewtopic.php?t=4132&start=0

Итак, первый ламерский вопрос:
1) В среде MapleV R4 поддерживается MDI интерфейс. В каждом дочернем окне - командный, свой собственный интерфейс. Сами вычисления выполняются в том же .exe файле (это уже я додумал, т.к. больше просто негде). Загрузил я exe'шник в Olly и теперь не знаю как бы мне начать. Хочу просто: ввести команду в MVR4 типа "?help" и отследить по какому адресу и функции начинается её обработка. Как правильней поставить BP на строку? И если не сработает стандартная команда, то как поступить далее?



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

Создано: 09 декабря 2006 10:25
· Личное сообщение · #2

Ещё есть такое соображение. Символьный движок maple использует специальные библиотеки на своём языке более высокого уровня. Так вот эти библиотеки от отдельного релиза MapleV R4 подходят к MC11, более того, они расширяют спектр доступных символьных функций, но важнее всего то, что ни от одного другого релиза (MVR2 или MVR5) такие библиотеки не подходят. Это говорит о возможной даже бинарной идентичности кода символьного движка. Только по-видимому в MVR4 он собран статической компоновкой, а в MC11 поставляется отдельной динамической библиотекой. Думаю, эти соображения возможно сделают более успешной мою задачу.



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

Создано: 09 декабря 2006 11:52 · Поправил: uni
· Личное сообщение · #3

Дополню ещё. На всякий случай. Я тему не с потолка взял и хоть и новичок в этом деле, но кое-что всё-таки умею. Вот немного картинок моего творчества:
Экспериментальный Peviewer, восстановленный после прочтения книжки Румянцева:
http://l.foto.radikal.ru/0612/f0ba52278f13.gif http://l.foto.radikal.ru/0612/f0ba52278f13.gif

Отладчик для документов Mathcad 11:
http://k.foto.radikal.ru/0612/05095c01e127.gif http://k.foto.radikal.ru/0612/05095c01e127.gif

А эта картинка результат использования dll-ки с функцией CallWin32Api(), с помощью которой я сделал из Mathcad'а транслятор Win32API функций - вещь сама по себе забавная. На картинке ниже я в Mathcad 11 написал классическу программу инициализирующую OpenGL (Hello world был до этого):
http://l.foto.radikal.ru/0612/0a1f775bcc12.jpg http://l.foto.radikal.ru/0612/0a1f775bcc12.jpg

Поскольку я не ломаю ничего, а исследую, то моя задача не совсем я бы сказал стандартная, потому "бряки" на функции окон Win32API, поиск неких строк под IDA и прочие типовые шалости пока применить не могу, т.к. не знаю вообще что искать.



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

Создано: 09 декабря 2006 16:43
· Личное сообщение · #4

По-маленьку начинаю разбираться. Открыл бинарик MVR4 в IDA и параллельно в OllyDbg, с параметром типа asciiz пошёл на хитрость. Сначала просканил память на предмет наличия будущей команды, получил нулевой результат. Далее ввёл команду в среде MVR4 и опять просканил память, получил 2 совпадения. На всякий случай убедился ещё, что искомая строка храниться там постоянно, т.е. адреса не меняются после выполнения команды. Поставил bp на доступ к памяти по этому адресу, выплыл хрен знает где... Посмотрел на другой экран с IDA прыгнул на тот же адрес ... IDA восстановила, что окружение по этому адресу является функцией _strlen(), т.е. стандартной функции из прилинкованной библиотеки ... да-а.... так я наверное далеко не уйду, если буду шариться по стандартным либам. Буду думать как поступить далее. Оказывается, что многим функциям такой параметр может достаться.



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

Создано: 12 декабря 2006 06:54
· Личное сообщение · #5

uni Я думаю, что ты в неправильном направлении ковыряешь. Пока ты еле-еле что-то сделал - в Инете давно уже есть MathCad 12 и Maple 9.5 и даже 10-й- я думаю что там есть такое, что проще их скачать, чем делать велосипед с квадратными колесами



Ранг: 214.1 (наставник)
Активность: 0.130
Статус: Участник

Создано: 13 декабря 2006 04:05
· Личное сообщение · #6

Мда, такого длинного вопроса еще не видел - чуть сам не подвис
картинки для понта не пойдут...
А вообще такое смотрят (на что ставить бряки) на деле. если одно не канает берешь другое и вперед.
в принципе ставь бряки на чтение из гл. окна. их название (на eng) должны говорить сами за себя.
попробуй поломать - хотя бы самое простое - разберись - 100% поможет это и здесь
ух, сюда больше не зайду - уж больно вопрос длиииинный.



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

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

uni Я думаю, что ты в неправильном направлении ковыряешь. Пока ты еле-еле что-то сделал - в Инете давно уже есть MathCad 12 и Maple 9.5 и даже 10-й- я думаю что там есть такое, что проще их скачать, чем делать велосипед с квадратными колесами
Неее, Вы просто не знаете ФИШКИ. У меня есть все эти пакеты и Maple 10, и Mathcad 13, но проблема в том, что к примеру MC13 хуже по функциональности чем MC11, как бы парадоксально это не звучало. А Maple слишком СИМВОЛЬНЫЙ, чтобы решать на нём чисто численные задачи, да и наворочен он. Мне нужно всего по-немножку - так, как это присутствует в MC11 - она скрывает в себе будущее интерфеса математических пакетов - полуграфических полу-в виде командной строки - ЭТО ТО, ЧТО Я ХОЧУ РЕАЛИЗОВАТЬ.

Окей, вопрос длинный - это да. Но и тема не простая. Я исследую в полном смысле слова и никакими бряками тут сильно не поможешь. С Olly я промашку дал, нифига мне не помог, цифры одни везде... трудновато в нём. Я в IDA сделал что нужно. ИТАК.

КРАТКО СУТЬ: Есть 2 файла. Один .EXE, второй .DLL (это 2 разных файла от разных пакетов, но один кое-что позаимствовал у другого). Экзешник содержит в себе код экспортируемых dll функций. Т.е. в dll'ке имеется 10 записей в таблице экспорта для функций + 3 записи экспортируемых переменных + 2 просто ординалы (не знаю пока что это). Всего получается 15.
Я дизассемблировал DLL и EXE по отдельности. Я сделал ПРЕДПОЛОЖЕНИЕ, что куски кода в DLL присутствуют в EXE. Я нашёл эти одинаковые куски. Точность примерно 99.9%, т.е. вплоть до инструкции. Этого и следовало ожидать. Дело в другом. EXE содержит ещё интерфейс, по простому IDE разработки.
Вот картинка (~100 Кб) чуть разрисовано MC11 + MapleV R4 http://l.foto.radikal.ru/0612/b9007a3f550c.jpg
Я всё сделаю сам, мне только нужны наводки по инструментарию. Крякеры Вы тут или всё-таки хакеры? Как я уже говорил я хочу эти 2 интерфейса объединить, т.е. чтобы они запускались от одного процесса - были в адресном пространстве одном. Главным считается Mathcad, т.к. это он подключает DLL с символьным движком. Мне нужно заменить эту DLL на другую, которая кроме самого символьного движка содержит ещё и интерфейс. Я думаю, что это возможно.

Поскольку я уже сам нашёл все экспортируемые функции, то можно двигаться дальше. А дальше уже труднее гораздо. Мне нужно создать в EXE файле DllEntryPoint() и типовой switch(). Код её у меня есть, нужно внедрить его в dll и изменить точку входа. Ещё нужно поменять аттрибуты EXE файла, чтобы он стал DLL, кроме этого ещё нужно создать секцию экспорта, в котором сделать ссылки на найденные мною функции, чтобы MC подгрузив эту dll-оборотень нашла нужные функции.

Я конечно понимаю, что читать такой текст трудно, но иначе вообще не въехать никак.
Вопросы:
1) Можно ли переделать EXE в DLL в принципе?
2) Если известны точки входа в функции внутри EXE, можно ли создать секцию экспорта со ссылками на эти функции? Как быть с public областями данных? Т.е. мне нужно ещё кроме функций экспортировать некоторые ячейки с данными... это похожим образом делается?

Пока хватит.



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

Создано: 15 декабря 2006 11:14 · Поправил: uni
· Личное сообщение · #8

Идём далее.
Хочу для начала изменить точку входа, вставить дополнительный код DllEntryPoint() и табличку экспорта, не важно пока с какими там значениями адресов. Работаем с .EXE. Для начала я просмотрел секцию кода на предмет свободного места. Не много оказалось. До следующей секции 288 байт (0x0120). Код на асме забить можно и секцию экспорта туда тоже поместиться. Секцию экспорта я нашёл в .DLL файле и просто скопировал структуру IMAGE_DIRECTORY_ENTRY_EXPORT (P.S. т.е. я хотел сказать IMAGE_EXPORT_DIRECTORY) прямо в конец секции .text в файле .EXE. Размер её составил 176 байт (0x00B0). Насколько мне помниться есть некоторая свобода в расположении секций и то, что я засунул секцию экспорта в .text - просто немного сейчас усложнит мне жизнь. Пока есть возможность я не хочу менять размера бинарика.
Теперь, нужно или не нужно менять NumberOfSections в IMAGE_FILE_HEADER? Вопрос на первый взгляд странный, но в .DLL файле, откуда я взял этот экспорт, найти стандартным путём смещение на таблицу экспорта мне не удалось. Я её поиском нашёл по известным мне именам экспортируемых функций.
Так вот... А...аа в IMAGE_DIRECTORY_ENTRY_EXPORT есть запись. Теперь понятно.
Тогда такой вопрос. Теперь мне нужно заполнить просто поля: VirtualAddress и Size. Если с последним понятно, то как правильно выбрать VirtualAddress? Просмотреть все записи массива IMAGE_DATA_DIRECTORY, найти самый большой адрес и что-то к нему прибавив записать в качестве VirtualAddress для секции экспорта, так? Как должен образ таблицы экспорта располагаться в памяти после загрузки? Также как в файле - в секции кода - или всё таки в своей собвстенной области какой?

Я не слишком замудрил? Потом перейду к написанию DllEntryPoint() и возможно модификации таблицы перемещений.

P.S. Блин я ошибся с размером секции экспорта. Не правильно смещение вычислил. Она оказалась больше ... можно было и догадаться... там же три массива кроме шапки. Куда его засунуть теперь...



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

Создано: 20 декабря 2006 11:20
· Личное сообщение · #9

Итак, вроде бы заработало. После многочисленных телодвижений exe превратился в dll, но пока я не стал интерфейс запускать. Надо сказать, что я не всё подчистить как надо, но Mathcad пока не ругается, решает как полагается. Для этого потребовалось совсем не много:
1) Я создал секцию экспорта, нашёл все функции (кроме одной) и прописал их адреса в секции
2) Одну функцию пришлось прямо в машинных кодах дописывать к секции кода. Благо она небольшая, но 2 релокейшна придётся делеать для неё, т.к. две инструкции обращаются по абсолютным адресам. Хорошо, что эта функция предназначена только для небольшого мониторинга.
3) Также к секции кода дописал заглушку DllMain и поменял точку входа на неё
4) Добавил флаг IMAGE_FILE_DLL ([0x96]: 0x210e) , ну и конечно поменял имя на mkernel.dll

Для пущей уверенности дизассемблил заново в IDA - всё тип топ. Релоки в экзешнике были, кроме того, пришлось отдельно проверять работают они или нет - это отдельная история. Самое трудное оказалось правильно таблицу экспорта разрисовать, тут dumbbin помог, каждый раз его просил посмотреть всё ли в порядке.

Наконец решил подсунуть это дело Mathcad'у (была маленькая вероятность, что сразу заработает). Заработало. Тестирую. Но это ещё не всё.

ВОПРОС. В dll содержится код MDI приложения, там обычный код, начинающийся со start и т.д. Мне нужно, чтобы при инициализации dll этот код получил управление и отобразил (создал) интерфейс, причём потом вернул управление обратно для загрузки остального кода и непосредственно приложения-родителя. Как это делается? Организовать отдельный поток и функцию start() выполнять в нём? Функция эта ведь зациклится наверное, если так, то я не смогу основного приложения загрузить. Как тут быть? Я знаю что это возможно, есть пример, но разбираться долго. Подскажите кто что знает. Спасибо за внимание.

P.S. Ещё. Стартап коду какие параметры от системы передаются при запуске приложения? Если я хочу сам выполнить вызов по call, то какие переменные и в каком количестве нужно передовать библиотечной функции start()?
Если может кого не затруднит показать простой код создания потока и запуска в нём своей функции. Или пошлите за примером. Только одно условие, желательно всё это в машинных кодах Ну если нету в кодах, то хотя бы на masm'е, чтобы лишнего кода было как можно меньше.



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

Создано: 21 декабря 2006 08:59
· Личное сообщение · #10

UNI, не нужно драть и усложнять и без того
нелегкую жизнь. ПРОСТО откажись от Этой
БРЕДОВОЙ идеи.
Секономишь кучу нервов, волос на попе, времени
и кучу ресурсов - овчинка вряд ли ВЫДЕЛКИ стоит.



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

Создано: 23 декабря 2006 03:50
· Личное сообщение · #11

Эй, Чуп, в каком месте она бредовая? Уже всё работает. Мне сталось интерфейс только поднастроить чтобы вызывался. Для этого я вызову функцию CreateThread() и подставлю ей точку входа start(), т.к. по параметрам они совпадают, кроме того start() не использует указатель на PEB. Где тут бред-то? Моя интуиция меня не подвела, я попал в 10-ку с первой попытки. Сейчас правлю релоки, точнее добавляю. Не надо о людях по себе судить, вредно это.


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


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