Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/76: Рейтинг темы: голосов - 76, средняя оценка - 4.62
Землянин
 Аватар для Pjeroo
34 / 34 / 16
Регистрация: 15.01.2013
Сообщений: 312

Защита программы от декомпилятора

01.02.2013, 19:27. Показов 16223. Ответов 99
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возможно ли это, если возможно, то как?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.02.2013, 19:27
Ответы с готовыми решениями:

Выбор декомпилятора для .NET
Подскажите декомпилятор C#. Скачал JetBrains но как им пользоватся я не знаю:-|

Защита программы от НСД. Защита путем шифрования части программы на флеш-диске или флешке
Написать программу на любом известном Вам языке программирования. Программа должна выполнять функцию защиты программы от НСД. Защита...

Использование flash-декомпилятора
Мне декомпилятор Flash Decompiler Trillix после разборки swf-файла выдает несколько папок: - Buttons - Fonts - Frames - Images -...

99
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.02.2013, 23:59
Студворк — интернет-сервис помощи студентам
ValeryS, ну, дебаг у меня декомпилировался с точностью до комментариев и имен переменных
0
62 / 62 / 5
Регистрация: 05.01.2013
Сообщений: 235
02.02.2013, 00:04
не скажу за шарп( декомпилировал очень мало)
а на плюсах
разделы не перепутал? :D я не о плюсах говорю, а за шарп. понятное дело, что на плюсах исходник после декомпиляции не получишь. другое дело - сишарп. после декомпиляции твой исходник как на ладоне.
все протекторы ( так скажем знаменитые а не самописные) обходятся на раз
один вопрос (потому что мы тут наверное о разном говорим) - цель обхода? взлом, или получение исходника из приложения?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
02.02.2013, 00:13
Цитата Сообщение от Psilon Посмотреть сообщение
ValeryS, ну, дебаг у меня декомпилировался с точностью до комментариев и имен переменных
повторюсь за шарп знаю мало
но это должно и должно быть все это есть отладочная информация
только вот с комментариями у меня подозрения
чем декомпилил?

Добавлено через 7 минут
Цитата Сообщение от Winhttp Посмотреть сообщение
а за шарп. понятное дело, что на плюсах исходник после декомпиляции не получишь. другое дело - сишарп.
т.е
если я напишу расчет пути зная время и скорость
C#
1
2
3
int v=5;
int t=2;
int s=t*v;
то оптимизатор так и оставит
а не напишет тупо
int s=10; ?????

Цитата Сообщение от Winhttp Посмотреть сообщение
цель обхода? взлом, или получение исходника из приложения?
вообще то получение исходника это одна из задач взлома

когда я вскрывал коммерческие программы
то у меня как то не было

Цитата Сообщение от Psilon Посмотреть сообщение
меня декомпилировался с точностью до комментариев и имен переменных
да и пускай ТС скажет чего он хотел
а то мы так договоримся
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.02.2013, 00:17
ValeryS, dotPeek. Причем и свои исходники и чужие.
Вот пример: код в студии



запускаю декомпилятор



nuff said
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.02.2013, 00:21
И да, это не дебаг, а релиз. Помимо мизерных замен и оптимизаций - чисто исходный код.
0
62 / 62 / 5
Регистрация: 05.01.2013
Сообщений: 235
02.02.2013, 00:23
до декомпиляции:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
 
namespace StrTest
{
    class Program
    {
       
        static void Main(string[] args)
        {
        int v=5;
        int t=2;
        int s=t*v;
                
        }
    }
}
после:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Namespace StrTest
 
    Friend Class Program
 
        Public Sub New()
        End Sub
 
        Public Shared Sub Main(ByVal args As String())
            Dim i1 As Integer = 5
            Dim i2 As Integer = 2
        End Sub
 
    End Class ' class Program
 
End Namespace
C#
1
2
3
4
public static void Main(string[] args)
{
    int i1 = 5, i2 = 2;
}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.02.2013, 00:31
Winhttp, ну у вас примитивный вариант с парой присваиваний, выше: чуть более реальный код с многопоточностью. И разницу с исходным кодом можно ставить в качестве дополнения к сканворду "найдите 10 отличий"
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
02.02.2013, 01:37
м-да... давненько я не брал в руки шашек
скачал DisSharp.v3.1.4
создал простейший проект на VS2008 и декомпилировал
и понял оптимизатор в шарпе как из шоколада пуля
ничего не сократил
даже имена оставил правда лежат они в отдельном файле ConsoleApplication1.pdb
и если его удалить то декомпилятор их не найдет и свои подставит

беру свои слова о необратимости компиляции обратно
0
 Аватар для Sp1tfire
76 / 66 / 1
Регистрация: 10.12.2011
Сообщений: 175
02.02.2013, 01:51
Цитата Сообщение от ValeryS Посмотреть сообщение
м-да... давненько я не брал в руки шашек
скачал DisSharp.v3.1.4
создал простейший проект на VS2008 и декомпилировал
и понял оптимизатор в шарпе как из шоколада пуля
ничего не сократил
даже имена оставил правда лежат они в отдельном файле ConsoleApplication1.pdb
и если его удалить то декомпилятор их не найдет и свои подставит

беру свои слова о необратимости компиляции обратно
это, вероятнее всего, вы декомпильнули дебаг-сборку с *.pdb, в которой ничего не оптимизуется, а в *.pdb почти исходный код лежит.
уверен, что в релиз сборке с включенным параметром optimize code код будет иначе.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
02.02.2013, 02:48
Цитата Сообщение от Sp1tfire Посмотреть сообщение
вы декомпильнули дебаг-сборку
именно релизную
содержимое
debug
ConsoleApplication1.exe
ConsoleApplication1.vshost.exe
ConsoleApplication1.pdb

release
ConsoleApplication1.exe
ConsoleApplication1.vshost.exe
ConsoleApplication1.vshost.exe.manifest
ConsoleApplication1.pdb

pdb-шка есть и там и там
Цитата Сообщение от Sp1tfire Посмотреть сообщение
включенным параметром optimize
включен
и вот что дал
C#
1
2
3
4
5
6
public static void Main(string[] args)
        {
            int myxz1 = 5, myxz2 = 10;
            int s = myxz1 * myxz2;
            Console.Write(s);
        }
вот оригинал
C#
1
2
3
4
5
6
7
8
9
static void Main(string[] args)
        {
            int myxz1 = 5;
            int myxz2 = 10;
            int s = myxz1 * myxz2;
            Console.Write(s);
        
        
        }
0
 Аватар для GOLD
124 / 37 / 6
Регистрация: 14.01.2012
Сообщений: 264
02.02.2013, 05:53
Слышал есть такая программа кодевиль, после нее код почти не вскрываем. В нете название на английском не нашел, что то на подобии Code Veil
0
Землянин
 Аватар для Pjeroo
34 / 34 / 16
Регистрация: 15.01.2013
Сообщений: 312
02.02.2013, 10:09  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Pjeroo, скиньте любой exe-файл, написанный вами.
И вы скажите, что мой код никому не интересен и взламывать его не будут?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.02.2013, 11:19
Pjeroo, да вообще любой, мне ваши "секреты" до фонаря, хоть хелловорд скиньте.
Sleepy_Master, да нету таких программ, успокойтесь. А те, что есть, просто меняют идентификаторы на удобоваримые. Конечно, в программе с a_1, a_2, a_3, i_4 трудно разобраться, но все равно особого труда не представляет.
ValeryS, мне кстати тоже интересно, где хваленая оптимизация
0
 Аватар для Sp1tfire
76 / 66 / 1
Регистрация: 10.12.2011
Сообщений: 175
02.02.2013, 15:43
Цитата Сообщение от ValeryS Посмотреть сообщение
именно релизную
содержимое
debug
ConsoleApplication1.exe
ConsoleApplication1.vshost.exe
ConsoleApplication1.pdb

release
ConsoleApplication1.exe
ConsoleApplication1.vshost.exe
ConsoleApplication1.vshost.exe.manifest
ConsoleApplication1.pdb

pdb-шка есть и там и там

включен
и вот что дал
C#
1
2
3
4
5
6
public static void Main(string[] args)
        {
            int myxz1 = 5, myxz2 = 10;
            int s = myxz1 * myxz2;
            Console.Write(s);
        }
вот оригинал
C#
1
2
3
4
5
6
7
8
9
static void Main(string[] args)
        {
            int myxz1 = 5;
            int myxz2 = 10;
            int s = myxz1 * myxz2;
            Console.Write(s);
        
        
        }
хм, действительно:

C#
1
2
3
4
private static void Main(string[] args)
    {
      Console.Write(5 * 10);
    }
чтобы компилятор оптимизировал умножение, надо значения обьявлять константами:

C#
1
2
3
4
5
6
7
static void Main(string[] args)
        {
            const int myxz1 = 5;
            const int myxz2 = 10;
            int s = myxz1 * myxz2;
            Console.Write(s);
        }
C#
1
2
3
4
private static void Main(string[] args)
    {
      Console.Write(50);
    }
0
62 / 62 / 5
Регистрация: 05.01.2013
Сообщений: 235
02.02.2013, 17:03
Решил новичкам показать работу обфускатора
Вот такой код обфусцировать будем:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
 
namespace StrTest
{
    class Program
    {
       
        static void Main(string[] args)
        {
            HttpWebRequest GET=(HttpWebRequest)HttpWebRequest.Create(@"http://steamcommunity.com/id/Yanisduneufkat/games?tab=all");
            WebResponse resp=GET.GetResponse();
            string str=new StreamReader(resp.GetResponseStream()).ReadToEnd();
            MatchCollection matc=Regex.Matches(str,@"""name"":""(?<gamename>.*?)"".*?""hours_forever"":""?(?<hours>[\d\.]*)""?\}");
            Console.WriteLine(matc.Count);
            foreach (Match elem in matc) {
            Console.WriteLine("Игра - {0} , время игры - {1}",
                                  elem.Groups["gamename"].Value,
                                  elem.Groups["hours"].Value);
            }
     
            Console.ReadKey();
        }
    }
}
итак, программа скомпилирована, сборка релиз, оптимизация вкл. декомпилируем ее, получаем такой же исходник-
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
 
namespace StrTest
{
 
    internal class Program
    {
 
        public Program()
        {
        }
 
        public static void Main(string[] args)
        {
            System.Net.HttpWebRequest httpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("http://steamcommunity.com/id/Yanisduneufkat/games?tab=all");
            System.Net.WebResponse webResponse = httpWebRequest.GetResponse();
            string s = (new System.IO.StreamReader(webResponse.GetResponseStream())).ReadToEnd();
            System.Text.RegularExpressions.MatchCollection matchCollection = System.Text.RegularExpressions.Regex.Matches(s, "\"name\":\"(?<gamename>.*?)\".*?\"hours_forever\":\"?(?<hours>[\\d\\.]*)\"?\\}");
            System.Console.WriteLine(matchCollection.Count);
            foreach (System.Text.RegularExpressions.Match match in matchCollection)
            {
                System.Console.WriteLine("Игра - {0} , время игры - {1}", match.Groups["gamename"].Value, match.Groups["hours"].Value);
            }
            System.Console.ReadKey();
        }
 
    } // class Program
 
}

теперь берем обфускатор и обфусцируем. потом декомпилируем, что получается:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
 
namespace StrTest
{
 
    internal class ᪗
    {
 
        public ᪗()
        {
        }
 
        private static string ᪖(string ᪕)
        {
            bool flag;
 
            int i1 = ᪕.Length;
            char[] chArr = new char[i1];
            int i2 = 0;
            while (flag)
            {
                char ch = ᪕[i2];
                byte b1 = (byte)(ch ^ (i1 - i2));
                byte b2 = (byte)((ch >> 8) ^ i2);
                chArr[i2] = (ushort)((b2 << 8) | b1);
                i2++;
                flag = i2 < chArr.Length;
            }
            return System.String.Intern(new System.String(chArr));
        }
 
        public static void ᪔(string[] ᪓)
        {
            System.Net.HttpWebRequest httpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(StrTest.᪗.᪖("QŌɃ͆Џԛ؜݁ࡅॕ੎ୃ౎ൃๆཇၜᅆ቎ፒᑜᔊᙀᝍᡌᤏ᩶᭺ᰲᵅṺὴ⁰Ⅻ≳⍣⑻╱♦❴⡺⥱⩻⬡ⱪ⵭⹦⽯ぺㄷ㉳㍧㑧㔹㙢㝮㡭"));
            System.Net.WebResponse webResponse = httpWebRequest.GetResponse();
            string s = (new System.IO.StreamReader(webResponse.GetResponseStream())).ReadToEnd();
            System.Text.RegularExpressions.MatchCollection matchCollection = System.Text.RegularExpressions.Regex.Matches(s, StrTest.᪗.᪖("aĬȠ̭њԜ؇ܞࠓअਅୟౖ൛๐ཚၒᅟቔጎᐁᔄᘒᜅ᠉ᤄᨃᬗᰅᵎṊὑ⁑⅑≾⍆⑰╬♸❪⡾⥨⨻⬢ⰵ⴩⸽⼫〯ㅺ㉾㍥㑽㕽㘳㝗㡗㥮㩕㬦㱚㴬㸬㼦䀼䅞䉼"));
            System.Console.WriteLine(matchCollection.Count);
            foreach (System.Text.RegularExpressions.Match match in matchCollection)
            {
                System.Console.WriteLine(StrTest.᪗.᪖("ЅԯٛܪйԵطݭࠥ३ਲ਼ାఱढ੏଻ᐱᕃራᜲ်ᅈቌᜦᠨᤤ᩸ᬳᱼ"), match.Groups[StrTest.᪗.᪖("oŦɫ͠Ѫբٯݤ")].Value, match.Groups[StrTest.᪗.᪖("mūɶͰѲ")].Value);
            }
            System.Console.ReadKey();
        }
 
    } // class ᪗
 
}
чтож, неплохо уже исходник изменили чуть. для еще лучшей защиты пройдемся протектором, потом снова декомпильнем, и посмотрим, что же вышло:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using Root;
 
namespace StrTest
{
 
    internal class ᪗
    {
 
        private delegate string ᪖(string ᪕);
        private delegate void ᪔(string[] ᪓);
 
        public ᪗()
        {
        }
 
        private static string ᪖(string ᪕)
        {
            return ((StrTest.᪗.᪖)Root.<Module>.Invoke(1))(᪕);
        }
 
        public static void ᪔(string[] ᪓)
        {
            ((StrTest.᪗.᪔)Root.<Module>.Invoke(0))(᪓);
        }
 
    } // class ᪗
 
}

это не 100% защита, но от 50 % юзеров, разбирающихся в net думаю сгодится
хотелось конечно бы узнать, какая это степень защиты. обфускатор и протектор фришные. если есть тут спецы по "доставанию исходников" , то я им с удовольствием скину файл, просто самому интересно как быстро исходник достанут и достанут ли вообще
0
 Аватар для GOLD
124 / 37 / 6
Регистрация: 14.01.2012
Сообщений: 264
04.02.2013, 10:17
Цитата Сообщение от Psilon Посмотреть сообщение
да нету таких программ, успокойтесь.
Да что б моей чашке с кофе под землю провалиться, была такая программа и прекрасно скрывала код от таких деобфускаторов как de4dot и т.п. Идеальной защиты не бывает, но от школьника и рядового программиста такая прога защитит.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.02.2013, 11:41
Sleepy_Master, школьника и формат .exe испугает, когда он его "Декомпилировать" через блокнот станет
Я проверял не один обфускатор. Не все, но достаточно. И все они фигня.
0
28 / 28 / 6
Регистрация: 25.12.2008
Сообщений: 186
04.02.2013, 12:01
Цитата Сообщение от Psilon Посмотреть сообщение
ValeryS, мне кстати тоже интересно, где хваленая оптимизация
Может во время JIT компиляции?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.02.2013, 12:05
Sinys, возможно
0
 Аватар для GOLD
124 / 37 / 6
Регистрация: 14.01.2012
Сообщений: 264
04.02.2013, 12:05
Цитата Сообщение от Psilon Посмотреть сообщение
Я проверял не один обфускатор. Не все, но достаточно. И все они фигня.
Я тоже достаточно много проверял, согласен что 90% фигня.
Code Veil пробовали ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2013, 12:05

Простейшая защита программы: где хранить число срабатываний программы?
День добрый! Написал одну небольшую программу, которая может быть интересна специализированной тусовке. Хочу распространять ее бесплатно,...

Защита программы
Здравствуйте! Как можно защитить свою программу от взлома? Я пытался использовать обфускатор NET Reactor но все равно мою программу смогли...

Защита программы
Вот такой вопрос: Написал программу, хочу передать её в безвозмездное пользование приятелю. Условие только одно - чтобы ей пользовался...

Защита программы
Есть программа на С++. Как поставить на нее защиту на 10 дней? Есть ли у кого пример готового кода.

Защита программы
Здравствуйте. Мне никогда не приходлось заниматься защитой программы и вот понадобилось. Подскажите как можно защитить ехе-шник от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru