Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Преобразование .exe-файла в .cpp |
Автор: KaraKum 3.12.2007, 16:22 |
Такой вопрос: как можно (если вообще можно) преобразовать файл формата .exe в файл формата .cpp? |
Автор: zkv 3.12.2007, 16:24 |
можешь считать что никак. |
Автор: KaraKum 3.12.2007, 16:32 |
А можно сделать как-нибудь так, чтобы хоть как-то понятен код стал. В формате .obj понять код, по-моему, нет шансов ![]() |
Автор: zkv 3.12.2007, 16:35 | ||
а причем тут .obj ?
дизассемблируй и изучай (ехешник) |
Автор: KaraKum 3.12.2007, 16:45 | ||
Вот-вот. А разве после дизассемблирования получается не файл формата .obj? Я имею в виду из .exe файла можно сделать файл формата языка C++? |
Автор: JackYF 3.12.2007, 16:47 | ||
дизассемблирование даёт ассемблерный код. |
Автор: KaraKum 3.12.2007, 16:58 |
![]() |
Автор: zkv 3.12.2007, 17:13 |
![]() |
Автор: JackYF 3.12.2007, 17:19 |
а ты сначала головой и руками попробуй, а там увидишь, насколько легко переводить ассемблерный код в С++-ный. ![]() |
Автор: Alexeis 3.12.2007, 17:26 |
Современные дизассемблеры типа Ida кой в чем может помочь. Например, определить что там присвоение строки, построить дерево вызовов функций. Иногда можно определить фрагмент стандартной библиотеки. Прожка DeDe может неплохо экзешник билдера разобрать. Но все это лишь частично. |
Автор: KaraKum 3.12.2007, 17:31 |
5 минут назад дизассемблировал собственную программу размером в 2500 строк (160Кб) (на языке С++), а получилась программа на языке ассемблера, наверное, в миллиард строк, а что делать с прогами в десятки мегабайт? Стоит пытаться понять такие программы или жизни не хватит? |
Автор: SABROG 3.12.2007, 17:33 | ||||
Ассемблер - язык для творческих личностей, один и тот же алгоритм можно написать в большом количестве вариаций. Иногда эти вариации бывают такие, что точную логику программы ты понять не сможешь. Простой пример умножение на 2. На ассемблере для этого можно использовать mul/imul, а можно shl/sal. Если компилятор оптимизировал код, то твой exe2cpp дизассемблер может выдать что-то вроде этого:
А не
Возникнут сразу мысли о том, какие программисты были хитрые, что так зашифровали свой код ;) |
Автор: KaraKum 3.12.2007, 17:43 |
Мне понравилась фраза "exe2cpp дизассемблер". Она звучит как: "Существует программа, которая преобразует .exe файлы в .cpp файлы". Я прав? |
Автор: bsa 3.12.2007, 17:45 | ||
SABROG, ха. очень может быть, что в результате выйдет unsigned char a = 2; ![]() Добавлено через 49 секунд
речь идет о гипотетической программе. |
Автор: SABROG 3.12.2007, 17:47 | ||
Ну есть такая программа, сам не пробывал, возможно там есть вирус. Конвертит exe в Си и Asm: http://www.bbs.motion-bg.com/dl.php?file=19 Добавлено через 1 минуту и 34 секунды
Верно, как вариант может быть и такое. В зависимости от степени оптимизации ![]() |
Автор: KaraKum 3.12.2007, 17:58 | ||||
А, чёрт! ![]() В дизассемблерном файле даже не понятно где кончается стандартный набор Windows функций и начинается текст самой программы ![]() |
Автор: SABROG 3.12.2007, 18:03 | ||||||
![]() |
Автор: KaraKum 3.12.2007, 18:21 |
То есть всё? Пиши пропало? У меня есть такой пример: давным давно (ну поехали...) когда мне нравилась игра WarCraft3 и я в неё играл (и сейчас нравится) я встречал программу AMAI, сделанную поклонниками игры (как я слышал), которую нужно было устанавливать поверх игры и представляла она из себя противника который был гораздо сильнее компьютера от самого разроботчика игры "Blizzard". Так вот, это правда фанаты дизассемблировали игру и создали к ней приложение AMAI (ужас! игра весит около гигабайта!) или вероятнее это продукт от "Blizzard"? |
Автор: SABROG 3.12.2007, 18:34 |
Зависит от твоих задач. "Поклонники" и алгоритм запаковки определят и структуру файла и библиотеку напишут для распаковки и хуки расставят в нужных местах, чтобы найти адрес где вызывается искусственный интеллект и напишут свой интеллект, и напишут патчер памяти, чтобы приаттачиться к процессу и заменить 4 байта адреса оригинального AI на свой. Мало кто дизассемблирует программу, чтобы понять какой алгоритм защиты стоит и попробывать найти в нем уязвимости. Обычно все идут по пути меньшего сопротивления, ищут слабые места, такие как поиск условий при которых программа думает, что она зарегистрирована. |
Автор: MAKCim 3.12.2007, 18:45 |
нет конечно тут важны 3 составляющие: время, голова, желание ![]() |
Автор: KaraKum 3.12.2007, 18:46 |
В принципе моя задача по принципу как у "поклонников": создать приложение к уже существующей программе и получить возможность получать данные о некоторых внутренних для программы объектах. Получается мне остаётся до конца освоить ассемблер (немножко уже знаю! ![]() ![]() ![]() |
Автор: Dims 3.12.2007, 19:26 |
На современных технологиях, в автоматическом режиме, это невозможно. Дело в том, что когда компьютер переводит с языка Си++ на машинный язык (это называется "компилированием") он выполняет операцию, которую можно было бы называть "аналитической". Он берёт конструкции на языке высокого уровня (например, Си++) и разбивает их на элементарные составляющие (машинные команды). Такие задачи с самого своего рождения компьютеры решали хорошо. А вот обратную операцию, которую можно было бы назвать "синтетической", компьютеры решают плохо. Сюда относится и обратный перевод с машинного языка, и распознавание образов и речи. Многие из этих задач традиционно относятся к сфере так называемого "искусственного интеллекта". Эти задачи состоят в том, чтобы агрегировать множество частностей (например, машинных команд или пикселей) и распознать в них целостный образ (например, конструкцию языка Си++ или напечатанную букву). Интересно заметить, что люди характеризуются обратным свойством: даже самые бестолковые из нас легко распознают образы (например, узнают знакомые лица, картины, символы и другое), и с большим трудом раскладывают образ на составляющие (например, способны узнаваемо нарисовать своего приятеля или выразить в словах какое-то переживание или впечатление). |
Автор: KaraKum 3.12.2007, 20:20 |
Мда. Не обнадёживающий прогноз. Можете посоветовать какую-нибудь литературу, что поможет в данном вопросе? Я вроде освоил ассемблер по учебнику В Юров. Assembler, но слова библиотека распаковки, жуки, приаттачиваться и патчер памяти для меня новые ![]() |
Автор: bsa 3.12.2007, 20:23 | ||||
Если бы все было именно так, то давно бы были написаны декомпиляторы для всех компиляторов (конечно, шаблоны они бы не восстанавливали). Компиляторы не просто раскладывают на "элементарные составляющие", но еще и оптимизируют. Так вот иногда после оптимизации код становится совершенно непохожим на оригинал. Кому интересно, соберите какой-нибудь проект на C++ с помощью GCC указав опции -O2 -g3 (оптимизация + отладка) и попробуйте пройтись отладчиком. Будете сильно удивлены поведению отладчика. Я, например, как-то пол дня потратил на то, чтобы понять, почему у меня не входит в тело оператора if, хотя судя по переменным должно было. Добавлено через 2 минуты и 16 секунд
не "жуки", а "хуки". Читай "перехватчики". "Патчер памяти" - это программа, способная изменять память любого процесса. |
Автор: KaraKum 3.12.2007, 20:34 |
Вот-вот. Я имею в виду где об этом можно узнать не понаслышке Есть какая-нибудь подходящая для такого дела литература? |
Автор: MAKCim 3.12.2007, 22:06 |
KaraKum, ссылки на другие форумы - это конечно не хорошо, но все-таки советую заглянуть http://wasm.ru |
Автор: Dims 4.12.2007, 00:12 | ||
Давным давно я что-то такое встречал. Когда ещё оптимизаторов было мало. |
Автор: SABROG 4.12.2007, 12:54 | ||
Подумай лишний раз надо это тебе или нет. Многим геймерам хватает ArtMoney. Я как-то в эти дебри лазил, использовал SoftIce, IDA Pro, программы для снятия дампа памяти процесса, чтобы на винт сбросить ту же программу в exe файл, но уже полностью распакованную. Писал патчеры/тренеры на fasme, изучал алгоритмы шифрования, чтобы редактировать save файлы и т.п. Просто занимался кряком программ, кейгенами. Но, чтобы серьезно этим заниматься жизни не хватит и надо иметь математический склад ума. Разработчики защит тоже на месте не стоят, один gameguard чего стоит, пока драйвер клавиатуры и мышки не напишешь ничего не сделать, они ведь ко всему прочему еще под каждую игру свою версию выпускают, поэтому универсальных патчей нету. Неблагодарное это дело ковырять чужие программы, если за это не планируется получать хороший доход. |
Автор: KaraKum 7.12.2007, 10:30 |
С помощью какой программы можно дизассемблировать .exe файлы? |
Автор: regis 7.12.2007, 13:09 | ||
Ну вот, например, стандартная U*X-овская утилита "objdump" умеет (в числе прочего) и дисассемблировать машинный код. Поищите порт под Win -- он работает и с объектными файлами, и с EXE формата PE. Подробнее об этом: http://en.wikipedia.org/wiki/Objdump А по поводу восстановления объектных файлов до исходников на языке высокого уровня, есть старая аналогия: "Это примерно так же просто, как восстановить живую корову из кучи говяжих котлет ." ;) |
Автор: KaraKum 7.12.2007, 13:12 | ||
сложновато... |
Автор: Loony 7.12.2007, 13:25 | ||
А какого рода приложение и с какой целью это делается? Возможно уже есть SDK от разработчиков! |
Автор: W4FhLF 7.12.2007, 13:41 |
Ну вот буквально недельку назад небеизвестная в определённых кругах группа YAG зарелизила http://www.hex-rays.com/ от Ильфака(автор IDA) стоимостью 2k$. Вот примерчик: ![]() А вот результата работы над той же функцией шестнадцатиричныхлучей: ![]() Так, что можешь найти сие творение гениальных рук без проблем и облегчить себе жизнь, если совесть позволит конечно ![]() |
Автор: Loony 7.12.2007, 13:47 | ||
Помоему ему это не очень подходит! Получит он кучу ассемблерных листингов и что делать будет с ними!? Тут должны помочь либо IDA, либо Olly, т.е. дабагер. Только все равно тут работы, в зависимости от сложности защиты программы и наличия необходимых знаний, от нескольких дней до бесконечности! Имхо, не простая это задача в наше время! |
Автор: Puoar 7.12.2007, 15:23 |
А я видел bat2asm от китайских вундеркиндов |
Автор: SABROG 7.12.2007, 15:49 | ||
Скажем так, сейчас все языки программирования это HLL2ASM, а вот обратное фиг. Только Hex Rays, да и то из того что я увидел врятли он сильно поможет. |
Автор: W4FhLF 7.12.2007, 16:10 | ||
exe2compilable_source - это сказка. В любом случае надо обтачивать результат руками и тут у HexRays проблемы, ибо интерактивность листинга с Pseudocode фактически нулевая. В любом случае сначала надо поработать над asm-листингом, а далее уже и псевдокод можно до ума довести. Т.е. без знания ассемблера и процесса дизассемблирования опять же никуда. Но плагин очень хороший, тем более пока только первая версия, если такие вот сливы на паблик не снизят инициативы в его развитии, со стороны автора, то продукт обещает быть очень полезным. |
Автор: KaraKum 9.12.2007, 07:51 | ||||
Основы ассемблера я знаю, но если будет нужно, то освою и весь - дело того стоит, но проблема в том, что я, например, скомпилировав такое консольное приложение :
после его дизассемблирования получил текстовый файл размером почти 2 мегабайта! Это же роман "Война и мир"! Я понимаю, что и на ассемблере этот фрагмент состоит из нескольких строк, а остальное занимает код стандартных функций Windows, но всё же... |
Автор: JackYF 9.12.2007, 11:17 | ||
оо... ты чем компилировал и с какими настройками?.. |
Автор: MAKCim 9.12.2007, 12:00 | ||||
что все же? ![]()
кроме ассемблера обязательно нужно знание формата исполняемых файлов (или библиотек) тогда можно быстро отметать ненужную тебе информацию |
Автор: KaraKum 9.12.2007, 13:22 | ||
Visual C++ 7. Никакие настройки не менял. Есть возможность сократить размер конечного файла? |
Автор: JackYF 9.12.2007, 14:25 |
Да. Раз у тебя визуалка, просмотри настройки компилятора, там их не мало и скомпиль в релиз-варианте. |
Автор: KaraKum 11.12.2007, 17:29 | ||
Вобщем, всё что нужно - это возможность получать информацию о динамическом изменении уже созданной программы и способность отправлять этой программе сообщения, подобно пользователю. Проблема заключается в получении информации из работающей программы. Декомпилированный .exe файл этой программы весит 7Mb в текстовом формате ![]() |
Автор: Lycifer 6.5.2008, 14:13 | ||
Конечно, так как С++ тянет всё что ему пожелается(то и есть заголовочные файлы, стандартные функции...) Дизассемблер тебе не поможет понять логику. Можеш использовать отладчики(sowt-ice, с его установкой помочь не могу), ну или встроеный в Windows Debug(то и есть (отладчик==дзенщик)=true) ![]() |
Автор: dumb 6.5.2008, 14:26 |
серьезно? - а для чего тогда, как ты думаешь, дизассемблер вообще нужен? soft-ice. "встроенный" отладчик(debug.exe) не предназначен для отладки win32-приложений. |
Автор: Solomon 6.5.2008, 14:44 |
... |
Автор: Lycifer 6.5.2008, 15:02 | ||
Не ну конечно когда программа в несколько сотен тысяч строк(так как они ассемблерские, то их еще больше) то понять логику программы раз плюнуть(правда это не возможно) но вот Dump - может. Так что с этих пор будем его называть сверх способный программист. Вообщето Дизасемблер нужен для программного кода, ну а логику понять из него(без отладчика) невозможно. |
Автор: dumb 6.5.2008, 15:32 |
Lycifer, задавая в одной ветке вопрос "как читать и изменять байты в .exe", не стоит здесь пытаться выдавать свое мнение за непреложную истину, да еще и в таких категоричных выражениях. по поводу же твоего неуместного сарказма на тему моих возможностей я высказываться не буду. формат общения не тот. |
Автор: d06osipov 6.5.2008, 18:35 |
Это сделать в точности невозможно, хотя бы потому, что в exe файле не хранятся никакие символы (если он не скомпилирован для отладки). То есть компилятор не сохраняет имена переменных, классов, функций и т. п., они просто не нужны в выходном файле. А у меня есть ещё пример. Была такая игра --- TTD, Transport Tycoon Delux. Фанаты (а именно, Ludvig Strigeus, автор известной программы uTorrent, см. http://en.wikipedia.org/wiki/Ludvig_Strigeus) дизассемблировали её и переписали полностью на чистый С, получилось продолжение, Open TTD (кстати, Open Source). Я сомневаюсь что это возможно было всё переписать вручную, скорее всего, хоть какая-то автоматизация была. Но при желании, думаю, можно найти больше информации по этой теме. |
Автор: bsa 6.5.2008, 23:06 |
d06osipov, если честно, я не очень понимаю смысла дизассемблирования кода игры - в ней нет, по моему, каких-то очень серьезных алгоритмов, требующих такого подхода, хотя про OpenTTD http://en.wikipedia.org/wiki/OpenTTD, что он был именно дизассемблирован с помощью IDA, но надо иметь в виду, что это Wiki. Хотя, возможно, что дизассемблированию подвергался код, ответственный за чтение файлов данных. Lycifer, анализу подвергаются только определенные участки кода (остальные проглядываются "по диагонали" с целью определения точек входа в нужную процедуру). Поверь мне, например, сделать из shareware программы обычную можно минут за 30, если, конечно, сложных защит не понаставлено. И все это делается с помощью дизассемблера и hex-редактора. Никто никогда не будет разбираться в коде отрисовки окошек и пр., так как это можно сделать посвоему с тем же результатом. |
Автор: Любитель 7.5.2008, 14:53 | ||
Прикольно ![]() Чо правда? ![]() Эээ, а эт легально? Ну почему - не всегда ![]() |
Автор: Lycifer 7.5.2008, 16:48 |
bsa, я с тобой согласен, конечно если нет защиты не какой(защита типа в файле лежит пароль), то nop забить легко, ну вот когда идёт речь например о подписи, то там не так всё просто, логику будеш понимать годами.(Это не считая что если программеры, не придумали защиты что-то вроде xml, а для получения которого требуется подключится к SQL - и сколько времени у тебя уйдёт? - года) Добавлено через 2 минуты и 30 секунд Dump, если ты не понял я создал тему в которой речь идёт для получение программно инфу про исполняемый файлы(к примеру: контрольная сумма или изменить exe файл) |
Автор: Любитель 7.5.2008, 17:27 | ||
При таком подходе - чем он отличается от любого файла? ![]() Добавлено через 17 секунд Звучит ![]() |
Автор: bsa 7.5.2008, 22:33 | ||
Ты хоть сам понял, что написал? Я, например, один раз снимал защиту с одной библиотеки, которая хотела серийник. Делов было на 10-20 минут... просто отключил проверку ключа на валидность. Логику понимать годами вообще не нужно. Алгоритмы цифровых подписей можно по пальцам пересчитать. Поэтому нужно определить какой из них и добыть ключ - остально дело техники. Если у тебя "что-то вроде xml, а для получения которого требуется подключится к SQL" ![]() Кстати, XML - это открытый текстовый файл, который взламывать смысла нет никакого. |
Автор: d06osipov 8.5.2008, 14:24 | ||||
Ну, например, чтобы не перерисовывать графику. OpenTTD действительно использует графические файлы GRF из старого TTD. А как понять их формат? Кроме того, TTD уже была сделана очень добротно и очень хорошо продумана, ведь кроме алгоритмов интерес могут представлять ещё и проектные решения (правда, меня бы очень удивило, если бы их можно было бы выкопать из готовой программы). Кстати, у меня давно зреет вопрос по этой теме. Я сказал, что в exe файле нет никаких символов. Но RTTI позволяет получить по ходу выполнения программы строковое название типа! Откуда он их берёт? Неужели, действительно, названия всех классов лежат в исполняемом файле, если включён RTTI.
А что, Microsoft уже добилась принятия закона о запрете бесплатного и Open Source ПО? Добавлено через 8 минут и 10 секунд Бал ещё забавный случай связанный с первыми версиями коммерческой программы FineReader. Разработчики тогда заявили об использовании новейших алгоритмов --- имеющие опыт чтения машинного кода могли убедиться в этом, отыскав их признаки в дизассемблированном коде. Однако, позже выяснилось, что никаких алгоритмов нет, а разработчики специально запутывали код. |
Автор: Любитель 8.5.2008, 14:57 | ||||
А где же ещё? Читаем матчасть по typeinfo.
Во-первых, причём тут МС? Во-вторых, речь, конечно, про дизассемблирование какого-то продукта для осздания его аналога. |
Автор: Lycifer 8.5.2008, 17:15 |
bsa, не выдумывай глупасти. ТО что ты проставил "nop" вместо проверки значения(а то и просто сделал переход к метке) - это все на энтуитивном уровне понятно. Так вот на счет подпись - почитай прежде чем писать(алгоритмы там не причем). Так что бы забить "nop", лучше отладчиком чем дизассемблером. Насчет xml: Защиту строят так что бы "ХАКЕРАМ" было менее понятно(Например в .xml сохраняется класс и после чего требуется большое время что бы что-то из этого понять, так как его писал не человек, а машина) - так что дизассемблер это чисто так, что бы умнее казатся. Добавлено через 1 минуту и 20 секунд Любитель - ну я думаю тебе к дяди Билу |
Автор: Любитель 8.5.2008, 17:30 | ||
Не, ну вообще и отладчик, и дизасм для редактирования непосредественно не преданзначены (хот ьи обычно поддерживают его как расширение).
При чём тут XML? XML наоброт упрощает разбор ![]() ![]() Ещё раз - ты это к чему сказал? ? |
Автор: Lycifer 8.5.2008, 17:50 | ||||||||
На счет .xml туда стока всего можно заполнить что бкз отладчика разобраться не реально(бывает что просто не реально = человеческой жизни просто не хватит) Всякие придуманные бинарные данные, если их будет сотен пять(строк) то что бы понять какой какой действительный.... Да, а еще прикольно когда выставляют последовательное сравнение этих строк в хаотическом порядки при чем можно очень долго улучшать защиту= большой логике что поломать в принципе не возможно.
Я имел ввиду что забить нупами операцию, просто так что бы перед кемнибудь повепендриватся (например перед друзьями) |
Автор: bsa 8.5.2008, 18:00 | ||||||||||
Кстати, когда содержимое класса куда-то сохраняется, то это, по моему, зовется сериализацией. Думаю, эта процедура не заслуживает, чтобы ей занимались через дизассемблер. Ладно. Все это был оффтопик. А по теме могу сказать, что существуют два типа действий: обратимые и необратимые. Так вот, компиляция - это необратимое действие, так как исходный текст программы получить невозможно в принципе, а при очень большом везении (компилятор в принципе не знает, что такое оптимизация) можно получить исходный текст похожий на оригинал только с относительно низкоуровневых языков (С, Pascal). А программу написанную на С++ еще сложнее преобразовать к исходному тексту, так как там используются шаблоны и пространства имен... |
Автор: Lycifer 8.5.2008, 18:19 | ||
С этим я стобой согласен xml: у меня сейчас в проекте их тысячи(проект пишу понятное дело не сам), как раз в этом проекте используется xml файл для защиты(правда не только он), Сначала программа была написана для сериализации ключа, в проекте xml дисиализуется и проверка происходит со сравнениями(при этом всем проверка в нескольких файлах), также идет в набор к этом key.snk(если ты знаеш что это, если не знаеш то почитай) Добавлено через 47 секунд Насчет key.snk - товзлом отладчиком здесь ой как нужен |
Автор: dumb 8.5.2008, 18:55 | ||
на воре шапка горит (с) народ но ты выбрал не лучшее место для своего пальцо-загибательства. |
Автор: Любитель 9.5.2008, 00:23 | ||
При чём тут именно XML? ;) Короче весь разговор об XML реально ни о чём ![]() ЗЫ Предлагаю закончить обсуждение ![]() Добавлено через 2 минуты и 18 секунд Сам понял, что сказал? Понятия не имею, что за key.snk, знаю, что *.snk в .Net используются для цифровой подписи (strong name key). При чём отладчик и что значит "взлом key.snk"? |
Автор: Lycifer 12.5.2008, 10:28 |
Если когото редактирования exe файла не повергает в шок - значит он совсем не знает что такое серьезная программа. Я не хочу больше с вами спорить - это бесполезно |
Автор: KaraKum 16.5.2008, 10:31 |
Именно. Приблизительно можно посчитать время, которое потратится на перевод .exe-файла в .cpp: время её создания умноженное на количество людей, которые её делали + сложность, связанная с непониманием того как именно разроботчики реализовывали те или иные вещи. Вообщем на переделку какой-нибудь среднестатистической игры может уйти с десяток лет - проще самому написать новую. |
Автор: bsa 16.5.2008, 12:38 |
KaraKum, а никто не пытается восстанавливать исходный код программы - это бессмысленно. Дизассемблирование нужно исключительно с целью "понять, как же они это сделали" и не более того. Большинство функций можно восстановить просто зная входные и выходные данные. |
Автор: klfd 18.5.2008, 11:22 |
... |
Автор: 500mhz 18.5.2008, 11:40 |
http://boomerang.sourceforge.net/ вот вам "преобразователь" |