Страницы

Поиск по вопросам

Показаны сообщения с ярлыком декомпиляция. Показать все сообщения
Показаны сообщения с ярлыком декомпиляция. Показать все сообщения

суббота, 8 февраля 2020 г.

Как определить язык программирования?

#декомпиляция #обратная_разработка


Здравствуйте!
Меня очень интересует вопрос, как можно определить язык программы, если она уже откомпилирована?    


Ответы

Ответ 1



Это, на самом деле, дело не из легких, поверьте! С супер точностью определить ничего не получится, так как языки могут быть разные, поддерживаемые, скажем одной средой программирования( VS, например, в которой поддерживается разработка на свыше 10 языках), а та, в свою очередь, добавляет сходную последовательность asm-секций в машинный код любого приложения, написанного в этой среде. Поэтому, скажем, с точностью( и то не всегда 100%-ой! ) можно определить среду разработки. Делается это, естественно, под дезассемблером. Лучший на мой взгляд( и где я, кстати, чаше всего провожу отладку ) - это OllyDBG. Под ним очень легко и быстро можно разобрать почти любую софтину( за исключением упакованой, обфусцированной и т.д ). Так, VS, например, добавляет в ассемблерный код несколько секций, порядок которых специфичен для данной среды. Последовательность похожа на эту( только пример! ), насколько я помню: .686 .model flat, c option casemap :none ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« .data ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« .code MyFunc PROC uses ecx edi, X: DWORD, Y:DWORD ; TODO ret MyFunc ENDP

Ответ 2



Самое простое и быстрое для вас решение - взять PeID и проанализировать им исполняемый файл. Если программа без защит, есть шансы успешного определения.

пятница, 10 января 2020 г.

Чем смотреть исполняемый код .net приложения?

#net #декомпиляция #поиск_программ #jit


Хочу полазить по скомпилированному приложению, чтобы увидеть оптимизации, производимые
jit-компилятором.

Какие программы использовать, чтобы получить листинг нативного кода после прохода
jit и их меппинг на инструкции il-кода? В идеале бы ещё меппинг на C#-код.
    


Ответы

Ответ 1



Запустите или присоединитесь к своему приложению отладчиком Visual Studio, установите брекпойнт в интересующем месте, и когда он сработает - выберите пункт меню "Debug/Windows/Disassembly". Опции для показа IL там нет. Можно только установить галочку "Show source code", и тогда будет показан маппинг машинного и исходного кода(на C#, VB.NET, или на другом языке, на котором вы программируете).

вторник, 31 декабря 2019 г.

Как отладить обфусцированную программу, декомпилированную fernflower'ом или приключения джуниора?

#java #декомпиляция #обратная_разработка


Честно говоря ни чем таким раньше не занимался, однако передо мной стоит задача разобрать
писанину предыдущего разраба, который психанув, ушёл из проекта, и скажем так восстановить
программу из последнего релиза, т.к. он забрал с собой сорцы. Я же совсем новенький
в яве, мало чего ещё понимаю, но задачу эту повесили на меня.
Но чтож. Немного погуглив, нашёл наиболее хорошо оцениваемый декомпилятор/деобфускатор
fernflower. Написал простенькую прогу, скомпилил, а потом декомпильнул ффом. Вроде
годный, компилируемый сорц получился.
Потом принялся за работу над задачей: Программа в целом состояла из двух частей:
стартер/апдейтер и собственно сама программа. Стартер апдейтит прогу при необходимости,
после чего запускает её через SwingUtils.InvokeLater runnable ProccessBuilder. Я декомпильнул
стартер, получившийся код впряг в новый проджект в моей любомой NetBeans IDE, определил
и вынес либы, но код не стал декомпилиться: проблема оказалась в том, что где-то запрашивался
класс, не присутствующий в жарнике стартера (крэшрепортер), также заметил что в этом
же жарнике лежат "лишние" классы, т.е. те классы, которые вообще не из мира сего. И
я сначала свалил всё на фф, но заглянув в папку, куда распаковал собственно жарник
стартера (с компилированными классами), я обнаружил что действительно не хватает нужных
классов. Тогда я решил, что стоит попробовать декомпильнуть второй жарник, и к моему
величайшему удивлению, в нём оказался тот самый класс крэшрепортера, а пошарив по классам
второго жарника, нашёл импорты "лишних" классов из первого o_0. Тут я понял, что если
не решу это говнище, то меня наверняка выпрут с работы, я впаду в депрессию и сопьюсь,
и с такой нехилой мотивацией начал искать и сравнивать с декомпиленными сорцами, в
поисках используемой версии, кучу либ... Сейчас добавил больше половины, но при просмотре
классов во втором жарнике, обнаружил, что они были обфусцированны, т.к. в большинстве
случаев, названия переменных были аля var151 и так далее, но ещё больше меня поразило
обилие классов вида a.class, aa.class, ab.class в основном пакете. Также во втором
жарнике в классах нередко встречались конструкции аля:
        try {
           a = b();
        } catch (Exception var7) {
           ;
        }

И самое ужасное, что обфусцированный код второго жарника теперь кишит ошибками CannotFindSymbol...
Я знаю, что спрашивать несколько вопросов в одном - нехорошо, но разносить описание
на кучу вопросов - тоже будет неправильно.
И как вы поняли дорогие друзья, я прошу вашей помощи:
 1. Как объяснить несказанно раскиданные классы (моё предположение, что стартер и
основное приложение было одним проектом, а при сборке распихивалось по разным ярникам,
т.к. иначе присутствие классов с ошибками импорта в скомпиленном проекте нельзя объяснить)
 2. Как быстро распутать белиберду в основном пакете. Может есть какой-то способ
автоматом восстановить названия классов, свойств и методов, или всё придётся делать
вручную?
 3. Как быстро определить версию используемой библиотеки, если нигде про неё не написано.
Может есть какая-нибудь программа?
 4. Как легче всего отладить программу и убрать все эти непонятные конструкции и
cannotfindsymbol'ы?
Спасибо, друзья!    


Ответы

Ответ 1



Для начала, задание по восстановлению сорцов (то есть, логики) из декомпилята — задача не для джуниора, а для профи-специалиста. Если вам платят джуниорскую зарплату при этом — немедленно психуйте, убегайте и ищите себе нормальную работу. (Можете забрать с собой деобфусцированные исходники тоже.) ЗЫ: из хорошей конторы ваш предшественник сломя голову не побежал бы. Если вы и восстановите компилируемость, вам придётся разобраться в логике. Если вы всё же хотите набраться опыта — считайте декомпилированный код «намёком» на правильный, и раскидывайте куски по проектам вручную. Насколько я понимаю, автоматически восстановить обфусцированные названия классов невозможно, если только обфускатор не сохранил где-то информацию о первоначальных именах. Пичалько. Версия использованной библиотеки вполне может быть в метаданных (тут я не спец), поищите информацию. Если нет — придётся подбирать вручную. По поводу непонятных конструкций — присмотритесь к ним, скорее всего, вы найдёте в них какую-то логику, и сможете быстро понять, где оригинальный код, а где добавка от обфускатора. И ещё раз, помните, что это очень сложная и высококвалифицированная работа. Возможно, переписать проект с нуля будет более простым решением! И потребуйте хорошую премию, задание вам досталось крайне сложное.

Ответ 2



декомпилируйте оба джарника совместно. Если декомпилятор не позволяет задавать 2 джарника, объедините их в один. Джарник это zip файл, просто по другому называется, так что объединять можно и ручками.

среда, 25 декабря 2019 г.

Редактирование .class файлов

#java #jar #декомпиляция


Есть JAR файл. Необходимо декомпилировать один из его классов, отредактировать одно
значение и закомпилировать обратно.
    


Ответы

Ответ 1



Если хотите сделать это одноразово, то попробуйте JAD. Но учтите, что декомпиляторы не всегда могут получить исходник из .class-файла. Предположим, вы сумели его декомпилировать верно. После этого, его надо собрать обратно. Чтобы это сделать, надо воспользоваться компилятором. javac -cp исходный.jar:библиотеки.jar исправленный.класс.java (если под виндой, то библиотеки надо разделять точкой с запятой вместо двоеточия) Ну а потом запаковать с помощью утилиты jar или какого-нибудь winrar Если JAD не выдаёт плохой исходник, то можно попробовать другие варианты декомпиляторов. В худшем случае, вам придётся после декомпиляции разбираться в байткоде и руками править неверно декомпилированный код. UPD Также есть возможность вскрыть .class-файл и править его с помощью Apache BCEL. С его помощь можно подгрузить класс, модифицировать его, а потом обратно записать. Правда Apache BCEL - программное средство, а не тула, так что вам придётся написать программу, которая бы патчила класс нужным образом.

воскресенье, 15 декабря 2019 г.

Что произойдет с переменной после return value++?

#java #декомпиляция


Пример:

int foo() {
    int value = 0;
    return value++;
}


Метод вернет 0, но что произойдет с переменной value? Будет ли компилятор генерировать
код для ++? Или оптимизирует? И как это проверить?
    


Ответы

Ответ 1



Метод вернет 0, но что произойдет с переменной value? Будет ли компилятор генерировать код для ++? Или оптимизирует? И как это проверить? Вот что я обнаружил когда открыл откомпилированный файл (с расширением .class) в Intellij IDEA. После декомпиляции код будет выглядеть так (в Java 8): int foo() { int value = 0; byte var10000 = value; int var2 = value + 1; return var10000; } Компилятор создаст новую переменную var10000 как вы видите в виде byte так как переменная value равна нулю и byte будет вполне достаточно и сэкономит нам памяти. Потом почему то создает новую переменную var2 типа int и добавляет единичку и возвращает результат. Если хотите проверить в других компиляторах, то в IDE выберете нужную Вам версию JDK, или даже можно пользоваться jd декомпилятором без IDE.

вторник, 10 декабря 2019 г.

Есть ли защита от декомпиляции андроид-приложения?

#android #apk #декомпиляция


Существует множество прогамм-декомпиляторов, которые моментально из апк создают папки
с исходным джава-кодом. Но есть приложения, которые не декомпилируются,
значит защита есть.
Как можно реализовать защиту от декомпиляции андроид-приложения?
Нигде не дано нормального ответа!Только ссылки на общую документацию.
    


Ответы

Ответ 1



Первое и самое главное что необходимо понять, говоря о защите программ,это то, что 100% защиты не существует. Как говорится, "если захотят и бронированные двери не помогут". Можно использовать сторонние решения в виде, например, различных обфускаторов. Можно написать свою защиту, как, например, это сделал один из авторов на хабре. Но в любом случае, ничто не даст гарантии, что код Вашего приложения рано или поздно не восстановят.

воскресенье, 14 апреля 2019 г.

Как определить язык программирования?

Здравствуйте! Меня очень интересует вопрос, как можно определить язык программы, если она уже откомпилирована?


Ответ

Это, на самом деле, дело не из легких, поверьте! С супер точностью определить ничего не получится, так как языки могут быть разные, поддерживаемые, скажем одной средой программирования( VS, например, в которой поддерживается разработка на свыше 10 языках), а та, в свою очередь, добавляет сходную последовательность asm-секций в машинный код любого приложения, написанного в этой среде. Поэтому, скажем, с точностью( и то не всегда 100%-ой! ) можно определить среду разработки. Делается это, естественно, под дезассемблером. Лучший на мой взгляд( и где я, кстати, чаше всего провожу отладку ) - это OllyDBG. Под ним очень легко и быстро можно разобрать почти любую софтину( за исключением упакованой, обфусцированной и т.д ). Так, VS, например, добавляет в ассемблерный код несколько секций, порядок которых специфичен для данной среды. Последовательность похожа на эту( только пример! ), насколько я помню: .686 .model flat, c option casemap :none
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
.data
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
.code
MyFunc PROC uses ecx edi, X: DWORD, Y:DWORD ; TODO
ret MyFunc ENDP

среда, 27 февраля 2019 г.

Чем смотреть исполняемый код .net приложения?

Хочу полазить по скомпилированному приложению, чтобы увидеть оптимизации, производимые jit-компилятором.
Какие программы использовать, чтобы получить листинг нативного кода после прохода jit и их меппинг на инструкции il-кода? В идеале бы ещё меппинг на C#-код.


Ответ

Запустите или присоединитесь к своему приложению отладчиком Visual Studio, установите брекпойнт в интересующем месте, и когда он сработает - выберите пункт меню "Debug/Windows/Disassembly".
Опции для показа IL там нет. Можно только установить галочку "Show source code", и тогда будет показан маппинг машинного и исходного кода(на C#, VB.NET, или на другом языке, на котором вы программируете).

понедельник, 18 февраля 2019 г.

Что произойдет с переменной после return value++?

Пример:
int foo() { int value = 0; return value++; }
Метод вернет 0, но что произойдет с переменной value? Будет ли компилятор генерировать код для ++? Или оптимизирует? И как это проверить?


Ответ

Метод вернет 0, но что произойдет с переменной value? Будет ли компилятор генерировать код для ++? Или оптимизирует? И как это проверить?
Вот что я обнаружил когда открыл откомпилированный файл (с расширением .class) в Intellij IDEA. После декомпиляции код будет выглядеть так (в Java 8):
int foo() { int value = 0; byte var10000 = value; int var2 = value + 1; return var10000; }
Компилятор создаст новую переменную var10000 как вы видите в виде byte так как переменная value равна нулю и byte будет вполне достаточно и сэкономит нам памяти. Потом почему то создает новую переменную var2 типа int и добавляет единичку и возвращает результат.
Если хотите проверить в других компиляторах, то в IDE выберете нужную Вам версию JDK, или даже можно пользоваться jd декомпилятором без IDE.

четверг, 20 декабря 2018 г.

Как отладить обфусцированную программу, декомпилированную fernflower'ом или приключения джуниора?

Честно говоря ни чем таким раньше не занимался, однако передо мной стоит задача разобрать писанину предыдущего разраба, который психанув, ушёл из проекта, и скажем так восстановить программу из последнего релиза, т.к. он забрал с собой сорцы. Я же совсем новенький в яве, мало чего ещё понимаю, но задачу эту повесили на меня. Но чтож. Немного погуглив, нашёл наиболее хорошо оцениваемый декомпилятор/деобфускатор fernflower. Написал простенькую прогу, скомпилил, а потом декомпильнул ффом. Вроде годный, компилируемый сорц получился. Потом принялся за работу над задачей: Программа в целом состояла из двух частей: стартер/апдейтер и собственно сама программа. Стартер апдейтит прогу при необходимости, после чего запускает её через SwingUtils.InvokeLater runnable ProccessBuilder. Я декомпильнул стартер, получившийся код впряг в новый проджект в моей любомой NetBeans IDE, определил и вынес либы, но код не стал декомпилиться: проблема оказалась в том, что где-то запрашивался класс, не присутствующий в жарнике стартера (крэшрепортер), также заметил что в этом же жарнике лежат "лишние" классы, т.е. те классы, которые вообще не из мира сего. И я сначала свалил всё на фф, но заглянув в папку, куда распаковал собственно жарник стартера (с компилированными классами), я обнаружил что действительно не хватает нужных классов. Тогда я решил, что стоит попробовать декомпильнуть второй жарник, и к моему величайшему удивлению, в нём оказался тот самый класс крэшрепортера, а пошарив по классам второго жарника, нашёл импорты "лишних" классов из первого o_0. Тут я понял, что если не решу это говнище, то меня наверняка выпрут с работы, я впаду в депрессию и сопьюсь, и с такой нехилой мотивацией начал искать и сравнивать с декомпиленными сорцами, в поисках используемой версии, кучу либ... Сейчас добавил больше половины, но при просмотре классов во втором жарнике, обнаружил, что они были обфусцированны, т.к. в большинстве случаев, названия переменных были аля var151 и так далее, но ещё больше меня поразило обилие классов вида a.class, aa.class, ab.class в основном пакете. Также во втором жарнике в классах нередко встречались конструкции аля: try { a = b(); } catch (Exception var7) { ; } И самое ужасное, что обфусцированный код второго жарника теперь кишит ошибками CannotFindSymbol... Я знаю, что спрашивать несколько вопросов в одном - нехорошо, но разносить описание на кучу вопросов - тоже будет неправильно. И как вы поняли дорогие друзья, я прошу вашей помощи: 1. Как объяснить несказанно раскиданные классы (моё предположение, что стартер и основное приложение было одним проектом, а при сборке распихивалось по разным ярникам, т.к. иначе присутствие классов с ошибками импорта в скомпиленном проекте нельзя объяснить) 2. Как быстро распутать белиберду в основном пакете. Может есть какой-то способ автоматом восстановить названия классов, свойств и методов, или всё придётся делать вручную? 3. Как быстро определить версию используемой библиотеки, если нигде про неё не написано. Может есть какая-нибудь программа? 4. Как легче всего отладить программу и убрать все эти непонятные конструкции и cannotfindsymbol'ы? Спасибо, друзья!


Ответ

Для начала, задание по восстановлению сорцов (то есть, логики) из декомпилята — задача не для джуниора, а для профи-специалиста. Если вам платят джуниорскую зарплату при этом — немедленно психуйте, убегайте и ищите себе нормальную работу. (Можете забрать с собой деобфусцированные исходники тоже.) ЗЫ: из хорошей конторы ваш предшественник сломя голову не побежал бы. Если вы и восстановите компилируемость, вам придётся разобраться в логике. Если вы всё же хотите набраться опыта — считайте декомпилированный код «намёком» на правильный, и раскидывайте куски по проектам вручную. Насколько я понимаю, автоматически восстановить обфусцированные названия классов невозможно, если только обфускатор не сохранил где-то информацию о первоначальных именах. Пичалько. Версия использованной библиотеки вполне может быть в метаданных (тут я не спец), поищите информацию. Если нет — придётся подбирать вручную. По поводу непонятных конструкций — присмотритесь к ним, скорее всего, вы найдёте в них какую-то логику, и сможете быстро понять, где оригинальный код, а где добавка от обфускатора. И ещё раз, помните, что это очень сложная и высококвалифицированная работа. Возможно, переписать проект с нуля будет более простым решением! И потребуйте хорошую премию, задание вам досталось крайне сложное.

вторник, 27 ноября 2018 г.

Редактирование .class файлов

Есть JAR файл. Необходимо декомпилировать один из его классов, отредактировать одно значение и закомпилировать обратно.


Ответ

Если хотите сделать это одноразово, то попробуйте JAD. Но учтите, что декомпиляторы не всегда могут получить исходник из .class-файла. Предположим, вы сумели его декомпилировать верно. После этого, его надо собрать обратно. Чтобы это сделать, надо воспользоваться компилятором.
javac -cp исходный.jar:библиотеки.jar исправленный.класс.java
(если под виндой, то библиотеки надо разделять точкой с запятой вместо двоеточия)
Ну а потом запаковать с помощью утилиты jar или какого-нибудь winrar
Если JAD не выдаёт плохой исходник, то можно попробовать другие варианты декомпиляторов. В худшем случае, вам придётся после декомпиляции разбираться в байткоде и руками править неверно декомпилированный код.
UPD
Также есть возможность вскрыть .class-файл и править его с помощью Apache BCEL. С его помощь можно подгрузить класс, модифицировать его, а потом обратно записать. Правда Apache BCEL - программное средство, а не тула, так что вам придётся написать программу, которая бы патчила класс нужным образом.

понедельник, 15 октября 2018 г.

Есть ли защита от декомпиляции андроид-приложения?

Существует множество прогамм-декомпиляторов, которые моментально из апк создают папки с исходным джава-кодом. Но есть приложения, которые не декомпилируются, значит защита есть. Как можно реализовать защиту от декомпиляции андроид-приложения? Нигде не дано нормального ответа!Только ссылки на общую документацию.


Ответ

Первое и самое главное что необходимо понять, говоря о защите программ,это то, что 100% защиты не существует. Как говорится, "если захотят и бронированные двери не помогут".
Можно использовать сторонние решения в виде, например, различных обфускаторов. Можно написать свою защиту, как, например, это сделал один из авторов на хабре. Но в любом случае, ничто не даст гарантии, что код Вашего приложения рано или поздно не восстановят.