![]() |
eXeL@B —› Вопросы новичков —› Выбор инструментов для задачи (+) |
Посл.ответ | Сообщение |
|
Создано: 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 на строку? И если не сработает стандартная команда, то как поступить далее? ![]() |
|
Создано: 09 декабря 2006 10:25 · Личное сообщение · #2 Ещё есть такое соображение. Символьный движок maple использует специальные библиотеки на своём языке более высокого уровня. Так вот эти библиотеки от отдельного релиза MapleV R4 подходят к MC11, более того, они расширяют спектр доступных символьных функций, но важнее всего то, что ни от одного другого релиза (MVR2 или MVR5) такие библиотеки не подходят. Это говорит о возможной даже бинарной идентичности кода символьного движка. Только по-видимому в MVR4 он собран статической компоновкой, а в MC11 поставляется отдельной динамической библиотекой. Думаю, эти соображения возможно сделают более успешной мою задачу. ![]() |
|
Создано: 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 и прочие типовые шалости пока применить не могу, т.к. не знаю вообще что искать. ![]() |
|
Создано: 09 декабря 2006 16:43 · Личное сообщение · #4 По-маленьку начинаю разбираться. Открыл бинарик MVR4 в IDA и параллельно в OllyDbg, с параметром типа asciiz пошёл на хитрость. Сначала просканил память на предмет наличия будущей команды, получил нулевой результат. Далее ввёл команду в среде MVR4 и опять просканил память, получил 2 совпадения. На всякий случай убедился ещё, что искомая строка храниться там постоянно, т.е. адреса не меняются после выполнения команды. Поставил bp на доступ к памяти по этому адресу, выплыл хрен знает где... Посмотрел на другой экран с IDA прыгнул на тот же адрес ... IDA восстановила, что окружение по этому адресу является функцией _strlen(), т.е. стандартной функции из прилинкованной библиотеки ... да-а.... так я наверное далеко не уйду, если буду шариться по стандартным либам. Буду думать как поступить далее. Оказывается, что многим функциям такой параметр может достаться. ![]() |
|
Создано: 12 декабря 2006 06:54 · Личное сообщение · #5 |
|
Создано: 13 декабря 2006 04:05 · Личное сообщение · #6 Мда, такого длинного вопроса еще не видел - чуть сам не подвис ![]() картинки для понта не пойдут... А вообще такое смотрят (на что ставить бряки) на деле. если одно не канает берешь другое и вперед. в принципе ставь бряки на чтение из гл. окна. их название (на eng) должны говорить сами за себя. попробуй поломать - хотя бы самое простое - разберись - 100% поможет это и здесь ух, сюда больше не зайду - уж больно вопрос длиииинный. ![]() |
|
Создано: 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 областями данных? Т.е. мне нужно ещё кроме функций экспортировать некоторые ячейки с данными... это похожим образом делается? Пока хватит. ![]() |
|
Создано: 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. Блин я ошибся с размером секции экспорта. Не правильно смещение вычислил. Она оказалась больше ... можно было и догадаться... там же три массива кроме шапки. Куда его засунуть теперь... ![]() |
|
Создано: 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()? Если может кого не затруднит показать простой код создания потока и запуска в нём своей функции. Или пошлите за примером. Только одно условие, желательно всё это в машинных кодах ![]() ![]() |
|
Создано: 21 декабря 2006 08:59 · Личное сообщение · #10 |
|
Создано: 23 декабря 2006 03:50 · Личное сообщение · #11 Эй, Чуп, в каком месте она бредовая? Уже всё работает. Мне сталось интерфейс только поднастроить чтобы вызывался. Для этого я вызову функцию CreateThread() и подставлю ей точку входа start(), т.к. по параметрам они совпадают, кроме того start() не использует указатель на PEB. Где тут бред-то? Моя интуиция меня не подвела, я попал в 10-ку с первой попытки. Сейчас правлю релоки, точнее добавляю. Не надо о людях по себе судить, вредно это. ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Выбор инструментов для задачи (+) |