Перейти к содержимому

De4dot как пользоваться

  • автор:

Идея — привязка к имени переменной (против de4dot и прочих деобфускаторов) — C# — Обсуждение 1006986

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

Кириллическое имя против латиницы и осмысленность имени
Добрый день, уважаемые форумчане! Есть ли какая-нибудь статистика, возможно, из личного опыта.

Нюансы синтаксиса: куда прижимать звёздочку при объявлении указателя — к имени типа или к имени переменной?
Скажите, пожалуйста, в чём отличие таких записей: int *px int* px int *px = new int int *px =.

Вывод на экран имени переменной(имени файла, и тд.)
Здрасти. Недалече столкнулся с проблемой: надо сравнить два файла по признаку количества.

Получить доступ к переменной класса при наличии такого же имени переменной в функции
Например, есть приватная переменная clientName в классе. Также есть точно такая же переменная в.

Часть имени переменной как значние другой переменной
Нужно чтобы имя переменной состояло как бы из двух частей к примеру переменную x1 надо записать.

Как по имени переменной вывести значение этой переменной?
К примеру: У нас есть заранее установленный переменные. Мы просим пользователя ввести имя.

Привязка доменного имени к apache
Здравствуйте. Настроил apache по вот этому мануальчику.

привязка к имени объекта не используя objectName()
Доброго! Суть такова, хочу сделать загрузку\сохранение параметров объектов, которые были переданы.

De4dot как пользоваться

Здравствуйте! Экспериментирую с различными обфускаторами, чтобы защитить свой код от повторного использования. Основная задача — сделать анализ с целью повторного использования настолько трудоемким, чтобы дешевле было написать свой код, а не использовать мой. Уточню — не преследую цель сделать анализ НЕвозможным,- просто, максимально усложнить! Пока остановился на SmartAssembly (версии 6). Деобфусцировал с помощью de4dot. Результат оценивал в Reflector. В связи с этим есть ряд вопросов. В вопросах подразумевается, что анализируемый exe или dll был ранее обфусцирован SmartAssembly.

Вопросы:
1. Можно ли с помощью какого либо метода (деобфускация, создание дампа процесса, отладка или что либо другое) без значительных трудозатрат восстановить исходный код (можно без имен переменных) internal и private функций с условием, что они не вызываются из public функций? Если можно, то как?
2. Аналогичный вопрос по поводу исходных имен параметров функций и локальных переменных, используемых в internal и private функциях.
3. Какой обфускатор посоветуете использовать вместо SmartAssembly (только чтобы лицензия была не дороже 150-200$)?

Несколько наблюдений (исходя из моих экспериментов):
1. De4dot не восстанавливает имена локальных переменных после SmartAssembly (только переименовывает исходя из их типов [Ссылки могут видеть только зарегистрированные и активированные пользователи] для облегчения анализа). А вот структуру кода нормально восстанавливает. Еще восстанавливает имена параметров публичных функций.
2. internal и private функций я не нашел [Ссылки могут видеть только зарегистрированные и активированные пользователи] в восстановленном с помощью De4dot файле. Причем, их код не находится даже если вызываешь прямо из него (из кода internal или private функции) public функцию [Ссылки могут видеть только зарегистрированные и активированные пользователи] (в то время как ее вызов из публик функции виден [Ссылки могут видеть только зарегистрированные и активированные пользователи] и [Ссылки могут видеть только зарегистрированные и активированные пользователи])
3. Однако если приватная функция вызывается публичной, то ее можно обнаружить [Ссылки могут видеть только зарегистрированные и активированные пользователи] и распознать структуру .

25.05.2015, 14:07

я использую Appfuscator, регаем каждые 14 дней новую почту и пользуемся пробной версией, которая никак не ограничивает конечный результат, или ILProtector, тоже не плохой обфускатор, Det4Dot не снимет его
Ну а для защиты можете сделать некий лаунчер, который будет воссоздавать саму программу, код которой будет у вас на сервере.

Вот гляньте работу AppFuscator
[Ссылки могут видеть только зарегистрированные и активированные пользователи] — обфусцированная программа(накляпал за 5 мин, показывает скорость работы циклов)

исходный код
using System;
using System.Threading;
using System.Diagnostics;

namespace ConsoleApplication1
internal class Program
static int Count = 100000000;

static void DWhile()
int TestInt = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
do TestInt++; while (TestInt sw.Stop();
float DoWhileTick = sw.ElapsedTicks;
float DoWhileMs = sw.ElapsedMilliseconds;
Console.WriteLine(«Do_WhileTick = \tDo_WhileMs = «, DoWhileTick, DoWhileMs);
>

static void WhileD()
int TestInt = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
while (TestInt sw.Stop();
float WhileDoTick = sw.ElapsedTicks;
float WhileDoMs = sw.ElapsedMilliseconds;
Console.WriteLine(«While_DoTick = \tWhile_DoMs = «, WhileDoTick, WhileDoMs);
>

static void For()

Stopwatch sw = new Stopwatch();
int TestInt = 0;
sw.Start();
for (int i = 0; i TestInt++;
sw.Stop();
float ForTick = sw.ElapsedTicks;
float ForMs = sw.ElapsedMilliseconds;
Console.WriteLine(«ForTick = \tForMs = «, ForTick, ForMs);
>

static void Foreach()
Stopwatch sw = new Stopwatch();
int TestInt = 0;
sw.Start();
byte[] bt = new byte[Count];
foreach (byte b in bt)
TestInt++;
sw.Stop();
float ForeachTick = sw.ElapsedTicks;
float ForeachMs = sw.ElapsedMilliseconds;
Console.WriteLine(«ForeachTick = \tForeachMs = «, ForeachTick, ForeachMs);

static Thread[] threads;
public static void Main()
threads = new Thread[4];
threads[0] = new Thread(DWhile);
threads[1] = new Thread(WhileD);
threads[2] = new Thread(For);
threads[3] = new Thread(Foreach);
foreach (Thread t in threads)
t.Start();
Console.ReadLine();
>
>
>

31.05.2015, 00:20

Appfuscator, .Net Reactor, .SmartAssembly. всё это снимается, да, сложно, но, снимается.
Откуда я знаю? Опыт.
Вывод: писать что-то своё. Что? Ну сейчас видел реализации так называемого «облачного» кода.
Сериализируется функция, записывается в облако, из облака десериализируется и вызывается. Можно вытянуть код, но если прицепить к этому ещё пару проверок, то желание что-то крякать — отпадает.

31.05.2015, 20:07

Nickitee, ну все в этом мире, что можно собрать, то можно и разобрать. Вопрос лишь в ценности затраченного времени

31.05.2015, 23:17

Nickitee, ну все в этом мире, что можно собрать, то можно и разобрать. Вопрос лишь в ценности затраченного времениКонечно можно, но когда стоит вопрос о ценности, то эти защиты отходят на 2 план.

19.06.2015, 14:56
видел реализации так называемого «облачного» кода.
А можете ссылочки на примеры скинуть?
19.06.2015, 15:24

А можете ссылочки на примеры скинуть?
Сериализация/Десериализация пробейте в гугле, а облаком может быть любое хранилище данных

19.06.2015, 16:26

Сериализация/Десериализация пробейте в гугле
Аа понял) Была тут задумка сделать нечто такое:
Вин форм проект связывается с ASP MVC(сервер) и передает ему некоторые данные, на стороне сервера данные обрабатываются и возвращается некий Action. Вот только интересно на сколько будет хромать быстродействие и можно ли вообще так делать?) А если можно, то где можно покурить мануалы на эту тему?

21.06.2015, 14:24

Вин форм проект связывается с ASP MVC(сервер) и передает ему некоторые данные, на стороне сервера данные обрабатываются и возвращается некий Action. Вот только интересно на сколько будет хромать быстродействие и можно ли вообще так делать?)
да можно, по такому принципу у меня все работает, на быстродействии это никак не сказывается ибо время нужно затратить только при запуске программы, чтобы от сервера получить данные и достроить программу, в остальном же она работает как и всегда. Как все это передавать, спросите вы — смотрите темы в интернете по созданию чатов на уровне сокетов, а дальше уже от сервера сможете передавать клиенту любые данные.

21.06.2015, 16:48

да можно, по такому принципу у меня все работает, на быстродействии это никак не сказывается ибо время нужно затратить только при запуске программы, чтобы от сервера получить данные и достроить программу, в остальном же она работает как и всегда. Как все это передавать, спросите вы — смотрите темы в интернете по созданию чатов на уровне сокетов, а дальше уже от сервера сможете передавать клиенту любые данные.
Про сокеты я информацию нагуглю, но может вы посоветуете что то для новичков(никогда с ними не работал). И в каком виде хранить функции которые будут встраиваться в клиент на самом сервере?

22.06.2015, 14:56

И в каком виде хранить функции которые будут встраиваться в клиент на самом сервере?
смотря какая сериализация, если бинарная то в bin, если Xml-сериализация, то собственно в xml. В результате все равно передаете массив байт, а дальше уже с ним работаете

22.06.2015, 16:20

В результате все равно передаете массив байт, а дальше уже с ним работаете
Погуглил про сокеты, во всех материалах говорилось что для закрытия канала нужно указать сокету что данные переданы в полном объеме, например так. if (data.IndexOf(«») > -1)
Console.WriteLine(«Сервер завершил соединение с клиентом.»);
break;
>
handler.Shutdown(SocketShutdown.Both);
handler.Close();
>
Где передаем вручную или дописываем его автоматически к строке(в случае чата), а как быть с функцией?

22.06.2015, 19:09

если вы на TCP протоколе устанавливаете соединение, то он гарантирует, что пакет придет и в правильном порядке, так что просто вставить асинхронный прием данных и все. Ну а класс у вас есть, данные с него храните у себя на сервер, а после того как передадите все эти данные на клиента в переводите их в текст, а дальше десериализуете их в нужный класс

Powered by vBulletin
Copyright © 2023 vBulletin Solutions, Inc. Перевод: zCarot
G-gaMe! Team production

De4dot как пользоваться

Станция будет окончательно закрыта 31 декабря 2023 года!

de4dot.zip

Размер файла:950.26 KB
Дата загрузки:2018/8/9 9:49:50
MD5:b8c2536f90************774fb8a34b

Описание ресурса: De4dot — это инструмент для сглаживания .NET с открытым исходным кодом, основанный на протоколе GPLv3, написанный на C #. Это очень хороший инструмент для декомпиляции в .net. Поддерживаются следующие обфускаторы: Agile.NET (akaCliSecure), Babel.NET, CodeFort, CodeVeil, CodeWall, CryptoObfuscator, DeepSeaObfuscator, Dotfuscator, .NETReactor, Eazfuscator. , SmartAssembly, Spices.Net, Xenocode и др.

[Всего ресурсов] Папка: 0, файл: 30

# Имя файла Размер файла Время последнего изменения
1 bin\AssemblyData.dll 59.5 KB 2018/5/22 13:04:34
2 bin\AssemblyServer-CLR20-x64.exe 5 KB 2018/5/22 13:04:34
3 bin\AssemblyServer-CLR20-x64.exe.config 206 Bytes 2018/5/22 13:04:34
4 bin\AssemblyServer-CLR20.exe 5.5 KB 2018/5/22 13:04:34
5 bin\AssemblyServer-CLR20.exe.config 206 Bytes 2018/5/22 13:04:34
6 bin\AssemblyServer-CLR40-x64.exe 5 KB 2018/5/22 13:04:34
7 bin\AssemblyServer-CLR40-x64.exe.config 200 Bytes 2018/5/22 13:04:34
8 bin\AssemblyServer-CLR40.exe 5.5 KB 2018/5/22 13:04:34
9 bin\AssemblyServer-CLR40.exe.config 200 Bytes 2018/5/22 13:04:34
10 bin\AssemblyServer-x64.exe 5 KB 2018/5/22 13:04:34
11 bin\AssemblyServer-x64.exe.config 252 Bytes 2018/5/22 13:04:34
12 bin\AssemblyServer.exe 5.5 KB 2018/5/22 13:04:34
13 bin\AssemblyServer.exe.config 252 Bytes 2018/5/22 13:04:34
14 bin\de4dot.blocks.dll 142 KB 2018/5/22 13:04:34
15 bin\de4dot.code.dll 1.07 MB 2018/5/22 13:04:34
16 bin\de4dot.cui.dll 43 KB 2018/5/22 13:04:34
17 bin\de4dot.mdecrypt.dll 21.5 KB 2018/5/22 13:04:34
18 bin\dnlib.dll 1.09 MB 2018/5/22 13:04:34
19 de4dot-x64.exe 5 KB 2018/5/22 13:04:34
20 de4dot-x64.exe.config 369 Bytes 2018/5/22 13:04:34
21 de4dot.exe 5.5 KB 2018/5/22 13:04:34
22 de4dot.exe.config 369 Bytes 2018/5/22 13:04:34
23 LICENSES\COPYING 34.32 KB 2018/5/22 13:04:34
24 LICENSES\LICENSE.de4dot.txt 823 Bytes 2018/5/22 13:04:34
25 LICENSES\LICENSE.dnlib.txt 1.17 KB 2018/5/22 13:04:34
26 LICENSES\LICENSE.ICSharpCode.SharpZipLib.txt 1.74 KB 2018/5/22 13:04:34
27 LICENSES\LICENSE.lzma.txt 593 Bytes 2018/5/22 13:04:34
28 LICENSES\LICENSE.lzmat.txt 1.13 KB 2018/5/22 13:04:34
29 LICENSES\LICENSE.QuickLZ.txt 460 Bytes 2018/5/22 13:04:34
30 LICENSES\LICENSE.randomc.txt 239 Bytes 2018/5/22 13:04:34

Другие загрузки пользователя (рекомендуется)

de4dot-Reactor5.0-wuhensoft

De4dot — это инструмент для сглаживания .NET с открытым исходным кодом, основанный на протоколе GPLv3, написанный на C #. Это очень хороший инструмент для декомпиляции в .net. Поддерживаются следующие обфускаторы: Agile.NET (akaCliSecure), Babel.NET.

713.04 KB 2018-07-12

de4dot-netcoreapp2.1

De4dot-netcoreapp версии 2.1, de4dot — это средство сглаживания и распаковки .NET с открытым исходным кодом (GPLv3) .NET, написанное на C #. Он попытается восстановить упакованные и запутанные сборки почти до первоначальной сборки. Большая путаница м.

1.42 MB 2019-01-03

de4dot-net35

De4dot-net35 Новейший универсальный инструмент для обстрела c #, инструмент для декомпиляции de4dot — это универсальный артефакт .NET-декомпилятора, с очень сильной способностью к обстрелу, свежеиспеченный может быть идеальным.

948.64 KB 2019-01-03

De4dot180517

De4dot — это инструмент для сглаживания .NET с открытым исходным кодом, основанный на протоколе GPLv3, написанный на C #. Это очень хороший инструмент для декомпиляции в .net. Поддержка более 10 инструментов сглаживания, таких как Dotfuscator, .NET R.

986.78 KB 2019-01-04

de4dot-v3-1

De4dot может обрабатывать большую часть программы шифрования / обфускации, упрощая проверку исходного кода.Декомпилятор de4dot — это универсальный артефакт декомпиляции .net с очень сильной способностью к обстрелу, свежеиспеченный может быть идеальны.

982.39 KB 2019-01-06

de4dot-net35

В некоторых компьютерных программах инструмент для обстрелов De4dot .net содержит программу, предназначенную для защиты программного обеспечения от незаконной модификации или декомпиляции. Обычно они запускаются перед программой, получают контроль, а.

948.58 KB 2019-03-28

DE4DOT 3.1.41592.3405

C#анти -конфузия, анти -защелка инструмента и используйте DE4DOT Decryption, чтобы быть запутанным .NET Code, чтобы иметь очень мощную способность к обстрелу.

Разбираем обфусцированный CrackMe на C#

Имеется файл CrackMe, при запуске которого предлагается ввести ключ лицензии: Исходя из подсказок после неправильного ввода ключа, можно понять, что в пароле должно быть обязательно 8 цифр, то есть от 00000000 до 99999999, на данном этапе можно переходить к коду программы, точнее тому что получится достать из .exe

Если просто открыть программу в .net Reflector, мы увидим следующее: Это последствия обфускции, работать с таким кодом можно, но достаточно проблематично, поэтому воспользуемся небезызвестным de4dot, который имеет встроенные алгоритмы деобфускации (основанные на известных обфускаторах, от кастомных это дело не поможет)

Ну и сменим инструмент просмотра кода на бесплатный dotPeek, он несколько удобней чем Reflector, но не позволяет изменять код программы. Впрочем на данном этапе, мы хотим узнать алгоритм верификации пароля, а не обойти его, но в конце статьи я покажу, как можно изменить проверку, и входить с практически любым паролем.

Открываем почищенный de4dot файл CrackMe в dotPeek, и видим следующее Методы конечно не носят оригинальных названий, как и классы, но уже гораздо более читабельно, а главное можно увидеть строковые переменные, по которым быстро можно найти нужное место.
Как видно строка, «Nope. A license key consists of 8 numbers, e.g. 31628594 or 71439532!»
которую мы видели при первом запуске программы находится в открытом виде, по ней мы и нашли нужное место кода с проверками пароля.

Логика работы:

В бесконечном цикле while, консоль CrackMe принимает данные от пользователя, передает в функцию smethod_0, возвращаемым значением которой является bool, который равен true если пароль верен, и false если нет.

При этом if(! инвертирует это значение, и в случае с возвращенным false мы получаем вывод о неверном пароле,
Console.WriteLine(«Nope. A license key consists of 8 numbers, e.g. 31628594 or 71439532!»);
А в случае true переходим в else, где посредствам оператора break выходим из бесконечного цикла, и переходим к удивленному вопросу автора CrackMe
Осталось разобраться, что же происходит в функции smethod_0, для последующего воссоздания алгоритма и получения списка возможных паролей (KeyGen)
В целом никакой сложной математики тут нет, пробежимся по коду:

В функцию передается строковое значение полученное из пользовательского ввода консоли, проверяется на длину, и если она не равна 8 символам, то сразу же возвращает false, ибо такой пароль точно не подходит вне зависимости от его содержания.

Далее, в try выполняется преобразование строки в числовое значение int, а если же оно содержит любые символы кроме цифр, то выполняются действия в операторе catch, которые так же возвращают false, честно сказать не знаю, зачем использовался goto, вместо return false, может автор так хотел запутать пользователя, либо как-то так код деобфусцируется, но имеем, то что имеем.

Далее если это число, и оно длинной в 8 цифр, переходим к основным проверкам, которые выглядят так: Всего нашему паролю предстоит пройти 4 проверки, каждая из них использует smethod_1, в котором происходит выборка подстроки из строки, со сдвигом указанным в int_0, и возвращается из этого метода, всегда одна цифра, так как вторым аргументом Substring, всегда будет 1. Теперь, понимая как это работает, можно составить условия на все 4 проверки:

Все число должно делится на первую цифру числа без остатка
✦ Сумма значений 3 цифры и 6 цифры числа = значению 2 цифры
4 цифра * на 8 цифру должна делится на 2 без остатка
7 цифра — 6 цифра = 1 цифре версии установленного .net framework (В нашем случае это будет 4) Ну а теперь надо лишь заставить эти методы работать в нашу пользу.
Немного модифицируем изначальные методы, для работы с Paraller.For, ибо предстоит 90 миллионов комбинаций паролей перебрать, и это будет в разы быстрее, на многоядерном компьютере. (13 секунд, против 89 при использовании обычного For, на моем ноутбуке)

И я намеренно упускаю, первые 10 миллионов паролей от 00000000 до 09999999, дабы не подставлять нули вперед значения строки, нашу задачу это никоим образом не обесценит, просто полученное количество возможных паролей, будет немного меньше возможного. Но нам то нужен всего 1, не так ли?

Вот код, который у меня получился, он запишет все возможные пароли в txt файл.
Я не профессиональный программист, это просто мое хобби, так же как и реверс инжиниринг, так что за реализацию сразу прощу прощения, если есть что добавить, прошу об этом написать, мне и самому будет интересно узнать.

using System; using System.Diagnostics; using System.IO; using System.Threading.Tasks; namespace ConsoleApp10 < internal class Program < internal static int nfmV; internal static string allPwd; private static void Main(string[] args) < nfmW = smethod_1(Environment.Version.ToString(), 0); Console.WriteLine("Начат парсинг подходящих паролей"); Stopwatch stw = new Stopwatch(); stw.Start(); Parallel.For(10000000, 99999999, smethod_0); stw.Stop(); Console.WriteLine($"Закончено за: сек."); using (StreamWriter sw = new StreamWriter("paswds.txt")) < sw.Write(allPwd); >Console.ReadLine(); > private static void smethod_0(int x, ParallelLoopState pls) < string string_0 = Convert.ToString(x); bool flag = false; int num = -1; try < num = int.Parse(string_0); >catch < flag = false; >try < flag = num % smethod_1(string_0, 0) == 0 && (smethod_1(string_0, 2) + smethod_1(string_0, 5) == smethod_1(string_0, 1) && (smethod_1(string_0, 3) * smethod_1(string_0, 7) % 2 == 0 && smethod_1(string_0, 6) - smethod_1(string_0, 5) == nfmW)); >catch < flag = false; >if (flag) < allPwd += $"\n"; > > private static int smethod_1(string string_0, int int_0) => int.Parse(string_0.Substring(int_0, 1)); > > 

В результате получаем долгожданный результат, и удивление автора, как же мы все таки это сделали?!
Ну и напоследок покажу, как можно без всяких «сложных» преобразований получить доступ к этой программе, но в этом случае нам понадобиться вводить неправильные пароли.

Для этого мы будем использовать уже знакомый нам .net Reflector с плагином Reflexil, который позволяет делать изменения в IL коде, с последующей пересборокой .exe

Нужно найти в коде строку How did you got that?! и идущий перед ней опкод изменить с brtrue.s на brfalse.s Тем самым изменить поведения оператора IF, теперь он будет считать все неправильные пароли верными и наоборот На этом у меня все, спасибо, что дочитали.

P.S.: Сайт с CrackMe, если решите попрактиковаться: линк

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *