Сейчас на форуме: bezumchik, tyns777, Lohmaty (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Как дизассемблировать приложение .NET Core?
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 6.8 (гость), 6thx
Активность: 0.010
Статус: Участник

Создано: 16 мая 2019 09:42
· Личное сообщение · #1

Есть приложение, написанное с использованием .NET Core, можно ли его исследовать чем-то, как например, исследуются нет ассембли Reflectorом?

| Сообщение посчитали полезным: Medsft


Ранг: 55.9 (постоянный), 29thx
Активность: 0.120.22
Статус: Участник

Создано: 05 июня 2019 22:12 · Поправил: Adler
· Личное сообщение · #2

win32nipuh, в каком "том"?
Если речь о тех, что в корне postgrescompare, то ясен пень, что в dnSpy они не откроются, т.к. к .Net никакого отношения не имеют, как и .exe (кроме squirrel.exe).




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 06 июня 2019 15:45
· Личное сообщение · #3

Medsft

Да, это так. Тоест активность падает после инит, но при любом событие гуя всплеск активности. Смотри, выводится в лог два параметра - дельта времени(ms) и счётчик выборок за данное время.

Могу снять любую статистику, какую только хочешь. Не работает это говно как в рекламе.

e10a_06.06.2019_EXELAB.rU.tgz - guan.png

-----
vx




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 06 июня 2019 16:58 · Поправил: cppasm
· Личное сообщение · #4

difexacaw - открой для себя Ngen:
https://docs.microsoft.com/en-us/dotnet/framework/tools/ngen-exe-native-image-generator
https://ru.wikipedia.org/wiki/Ngen
Один раз MSIL компилируется в нативный образ и сохраняется в кэше сборок.
После этого при запуске приложения всегда автоматически запускается нативный образ - MSIL не используется вообще.

Насчёт JIT Medsft правильно написал.
При первом вызове функции она компилируется в натив (насчёт всей цепочки вызовов не уверен) - после этого обращений к MSIL коду функции нет.
Соответственно если речь не про хелло ворлд - чем сложнее приложение тем меньше разница с нативом (накладные расходы меньше, т.к. они есть только на первый вызов функции).

| Сообщение посчитали полезным: difexacaw


Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 06 июня 2019 20:20
· Личное сообщение · #5

cppasm

Судя по тестам это так. Тоесть повторно событие не наступает, хотя я не уверен. Если повторно некоторые действия с гуем например выполнить, то всё равно какие то события происходят по выборке, хоть их и не много.

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

-----
vx




Ранг: 44.8 (посетитель), 19thx
Активность: 0.040
Статус: Участник

Создано: 07 июня 2019 00:02
· Личное сообщение · #6

difexacaw
если ты покуришь еще этой вкусной матчасти то внезапно охереешь
ибо NET может работать быстрее нативного кода
натив может быть скомпелирован под один проц а стало быть оптимизации этого конкретного проца
а NET будет ngenом тем же скомпелирован для проца на котором запущен
внезапно да?




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 07 июня 2019 08:19
· Личное сообщение · #7

SegFault

Может это плюс для портабельности, но никак не для профайла. А есчо это платформа для использования уязвимостей, так как используются RWE-буфера.

-----
vx




Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

Создано: 07 июня 2019 11:25
· Личное сообщение · #8

difexacaw пишет:
так как в образе есть ресурсы
ты сам обо всем почти догадался(про ресурсы)). И если еще раз прочтешь то что я написал выше то сможешь там увидеть фразу что "компилятор не весь образ компилирует за раз а хер знает по какому алгоритму строит цепочки ввзаввисимости от графа выполнения " т.е. проведи экперимент: нажми на любую кнопочку в гуе, запротоколируй активность а потом нажми ее еще раз и уидишь падение активности. (При определенном шаманстве со сборкой(в студии так не сделать) можно заставить компилятор при инициализации откомпилировать всю сборку - это используется в системах защит NET приложений)
Еще: в NET сборке (ресурсы это не совсем ресурсы как в нативе: -> к ресурсам относятся также : strings, methodname, обьявленные структуры).Будет время если тебе интересно я создам тестовое приложение чтобы было веселей)Да прям щас))




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 07 июня 2019 11:35 · Поправил: difexacaw
· Личное сообщение · #9

Вот полный лог по выборке из образа exe. Там все события выборки в образ из UM(исключая сервисные - ядерные). По идеи после динамик компиляции выборок быть не должно, за исключением ресурсов, но ресурсы обычно выбираются гуем из KM(битмапы всякие), это не видит визор. Можно исключить ресурсы, ограничив предел образа, тк они в отдельной секции.

Счётчик не совсем линейный, тикает не по таймеру, а проверка на переполнение при выборке > 1s. Отсюда нелинейность - если небыло выборки за Ns, то дельта времени > N. Впрочем это не имеет значения. Ну и время конечно относительное, так как визор тормозит апп(оно слишком толстое) и консольный вывод, но это никак не влияет на измерения, те на число выборок.

В конце лога запуск апп завершён - активность упала. Затем я растянул окно и резкий всплеск выборки. Этого не должно быть, если всё компилится на лету.

1a58_07.06.2019_EXELAB.rU.tgz - nf.png

-----
vx




Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

Создано: 07 июня 2019 13:01 · Поправил: Medsft
· Личное сообщение · #10

Я сделал Вам тест. Все откроется Вам с ним.
Обратите внимание на тесты 3 и 4 в одном использованы структуры в другом нет.
1 тест простой бакграунд
2 тест разовые мат.вычисления
3 тест обращение к заранее обьявленному классу strings[]
4 тест обращение к динамически созданному (при запуске приложения) list<strings>.

ed67_07.06.2019_EXELAB.rU.tgz - ForDifeacaw.exe

Добавлено спустя 2 минуты
Code:
  1. private int tickTimer = 0;
  2.         private int viewTimer = 0;
  3.         private bool timerStatus = true;
  4.         private int slovo = -1;
  5.         private int dslovo = -1;
  6.         private List<string> dwords = new List<string>();
  7.  
  8.         private string[] words = new string[] {"Слово 1", "Слово 2", "Слово 3", "Слово 4", "Слово 5", "Слово 6", "Слово 7", "Слово 8", "Слово 9", "Слово 10", "Слово 11", "Слово 12", "Слово 13", "Слово 14", "Слово 15", "Слово 16" };
  9.         public Form1()
  10.         {
  11.             InitializeComponent();
  12.             this.timerSimple.Start();
  13.             for (int i = 1; i < 16; i++)
  14.             {
  15.                 dwords.Add("Слово " + i);
  16.             }
  17.         }
  18.  
  19.         private void TimerSimple_Tick(object sender, EventArgs e)
  20.         {
  21.             tickTimer++;
  22.             if (tickTimer == 5)
  23.             {
  24.                 viewTimer++;
  25.                 this.Ticklabel.Text = viewTimer.ToString();
  26.                 tickTimer = 0;
  27.             }
  28.         }
  29.  
  30.         private void Button1_Click(object sender, EventArgs e)
  31.         {
  32.             Environment.Exit(0);
  33.         }
  34.  
  35.         private void Button2_Click(object sender, EventArgs e)
  36.         {
  37.             if (timerStatus)
  38.             {
  39.                 this.timerSimple.Stop();
  40.                 this.timerSimple.Dispose();
  41.                 this.timerStatus = false;
  42.                 this.button2.Text = "Запустить тест";
  43.             }
  44.             else
  45.             {
  46.                 this.timerStatus = true;
  47.                 this.timerSimple.Start();
  48.                 this.button2.Text = "Остановить тест";
  49.             }
  50.         }
  51.  
  52.         static double FPiCalculation(double arg)
  53.         {
  54.             double Pi = 4;
  55.             double i = 1;
  56.             do
  57.             {
  58.                 Pi -= 8 / ((4 * i - 1) * (4 * i + 1));
  59.                 i++;
  60.                 Application.DoEvents();
  61.             } while (Math.Abs(Pi - Math.PI) < arg);
  62.             return Pi;
  63.         }
  64.  
  65.         private void Button3_Click(object sender, EventArgs e)
  66.         {
  67.  
  68.             double pid, s1, s2, s3, s4;
  69.             char[] chx = new char[16];
  70.             s1 = series(1, (int)this.numericUpDown1.Value);
  71.             s2 = series(4, (int)this.numericUpDown1.Value);
  72.             s3 = series(5, (int)this.numericUpDown1.Value);
  73.             s4 = series(6, (int)this.numericUpDown1.Value);
  74.             pid = 4 * s1 - 2 * s2 - s3 - s4;
  75.             pid = pid - (int)pid + 1;
  76.             ihex(pid, 16, chx);
  77.             StringBuilder sb = new StringBuilder();
  78.             for (int i = 0; i < 16; i++)
  79.             {
  80.                 sb.Append(chx[i]);
  81.             }
  82.             
  83.             this.label4.Text = sb.ToString();
  84.         }
  85.  
  86.         void ihex(double x, int nhx, char[] chx)
  87.  
  88.         /*  This returns, in chx, the first nhx hex digits of the fraction of x. */
  89.  
  90.         {
  91.             int i;
  92.             double y;
  93.             char[] hx = new char[] { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
  94.  
  95.             y = Math.Abs(x);
  96.  
  97.             for (= 0; i < nhx; i++)
  98.             {
  99.                 y = 16 * (- Math.Floor(y));
  100.                 chx[i] = hx[(int)y];
  101.             }
  102.         }
  103.         double series(int m, int id)
  104.         {
  105.             int k;
  106.             double ak, eps, p, s, t;
  107.             eps = 1e-17;
  108.  
  109.             s = 0;
  110.  
  111.             /*  Sum the series up to id. */
  112.  
  113.             for (= 0; k < id; k++)
  114.             {
  115.                 ak = 8 * k + m;
  116.                 p = id - k;
  117.                 t = expm(p, ak);
  118.                 s = s + t / ak;
  119.                 s = s - (int)s;
  120.             }
  121.  
  122.             /*  Compute a few terms where k >= id. */
  123.  
  124.             for (= id; k <= id + 100; k++)
  125.             {
  126.                 ak = 8 * k + m;
  127.                 t = Math.Pow(16, (double)(id - k)) / ak;
  128.                 if (< eps) break;
  129.                 s = s + t;
  130.                 s = s - (int)s;
  131.             }
  132.             return s;
  133.         }
  134.  
  135.         double expm(double p, double ak)
  136.         {
  137.             int i, j;
  138.             double p1, pt, r;
  139.             double[] tp = new double[25];
  140.             int tp1 = 0;
  141.  
  142.             /*  If this is the first call to expm, fill the power of two table tp. */
  143.  
  144.             if (tp1 == 0)
  145.             {
  146.                 tp1 = 1;
  147.                 tp[0] = 1;
  148.  
  149.                 for (= 1; i < 25; i++) tp[i] = 2 * tp[i - 1];
  150.             }
  151.  
  152.             if (ak == 1) return 0;
  153.  
  154.             /*  Find the greatest power of two less than or equal to p. */
  155.  
  156.             for (= 0; i < 25; i++) if (tp[i] > p) break;
  157.  
  158.             pt = tp[- 1];
  159.             p1 = p;
  160.             r = 1;
  161.  
  162.             /*  Perform binary exponentiation algorithm modulo ak. */
  163.  
  164.             for (= 1; j <= i; j++)
  165.             {
  166.                 if (p1 >= pt)
  167.                 {
  168.                     r = 16 * r;
  169.                     r = r - (int)(/ ak) * ak;
  170.                     p1 = p1 - pt;
  171.                 }
  172.                 pt = 0.5 * pt;
  173.                 if (pt >= 1)
  174.                 {
  175.                     r = r * r;
  176.                     r = r - (int)(/ ak) * ak;
  177.                 }
  178.             }
  179.  
  180.             return r;
  181.         }
  182.  
  183.         private void Button4_Click(object sender, EventArgs e)
  184.         {
  185.             if (slovo == 15)
  186.             {
  187.                 slovo = 0;
  188.             }
  189.             else
  190.             {
  191.                 slovo++;
  192.             }
  193.             this.label7.Text = words[slovo];
  194.         }
  195.  
  196.         private void Button5_Click(object sender, EventArgs e)
  197.         {
  198.             if (dslovo == 14)
  199.             {
  200.                 dslovo = 0;
  201.             }
  202.             else
  203.             {
  204.                 dslovo++;
  205.             }
  206.             this.label10.Text = dwords[dslovo];
  207.         }


Код приложения

Добавлено спустя 10 минут
difexacaw пишет:
Затем я растянул окно и резкий всплеск выборки
обращение к ресурсам maybe

Добавлено спустя 11 минут
В своем примере я ограничил Вам баловство с гуей

Добавлено спустя 19 минут
Самому интересно как поведет кривая активности при этих тестах (особенно при вызове их повторно!!!)




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 07 июня 2019 13:35 · Поправил: difexacaw
· Личное сообщение · #11

Medsft

Я посмотрю, думаю для наглядности лучше оформить активность в виде нескольких графиков, лог не наглядный.

> обращение к ресурсам maybe

Юзер код их обычно не трогает. Они выбираются ядром гуя.

-----
vx




Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

Создано: 07 июня 2019 14:14
· Личное сообщение · #12

difexacaw пишет:
обращение к ресурсам
я же писал ресурсы NET и ресурсы в нативном приложении это не одно и тоже




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 07 июня 2019 21:38
· Личное сообщение · #13

Medsft

Вот что получается.

[0 -- 0x20] события это запуск апп, счётчик в окне тикает.

21, 22, 23 - нажал Т2.расчитать.
24 нажал повторно.
25, 26, 27 есчо три нажатия повторно.
28 нажал Т3.получить
При повторных нажатиях Т3 выборок в образ из юм нет.
29 жму Т2.расчитать.
2A, 2B, 2C есчо три раза нажал.
2D, 2E жму Т3, Т4 далее выборки нет.
2F нажал Т2
30 снова нажал.
31 жму Т3 - Т4 несколько раз.
32, 33 опять Т2
34 остановить тест.
35 запустить тест.
36 остановить - запустить.
37 Т2
Т3 - Т4 выборки нет.
38 Т2
39 остановить - запустить.



2058_07.06.2019_EXELAB.rU.tgz - log.png

Добавлено спустя 17 минут
Когда выборка единичная, это копирование строки. Адрес реальной инструкции иной, это буфер визора. Этот блок в динамическом буфере.

43cb_07.06.2019_EXELAB.rU.tgz - log2.png

Добавлено спустя 18 минут
Вот.

f4ca_07.06.2019_EXELAB.rU.tgz - m.png

Добавлено спустя 24 минуты
0x662ADE mov esi,N

Этот код видимо скомпилен, раз адрес фиксирован.

-----
vx





Ранг: 71.9 (постоянный), 4thx
Активность: 0.040
Статус: Участник

Создано: 08 июня 2019 23:48
· Личное сообщение · #14

SegFault пишет:
если ты покуришь еще этой вкусной матчасти то внезапно охереешь
ибо NET может работать быстрее нативного кода


Работаю C# разработчиком с 2013 года, было много проектов. И никогда не видел, чтобы управляемый код был быстрее натива. Наоборот, каждый раз убеждался управляемый код проигрывает минимум 20-50% в производительности. И это еще в идеальной ситуации.
Был даже провальный проект, когда серверное телефонное приложение на плюсах пытались переписать на шарпе.
В итоге уперлись в то, что шарповый код не может в реалтайме распарсить 7000 пакетов в секунду. Это 60 аналоговых каналов в потоке E1.
Хотя нативное приложение на C++ с этим справлялось на отлично. Проблема не только что JIT генерирует неэффективный код.
Но еще и в GC. Который может тормознуть приложение в любой момент и заняться уборкой мусора. Что для "реалтаймового" приложения совершенно
недопустимо.

| Сообщение посчитали полезным: difexacaw

Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

Создано: 09 июня 2019 00:19
· Личное сообщение · #15

difexacaw пишет:
Вот что получается
сорри не могу посмотреть лог, нет компа поблизости, только в понедельник

jangle пишет:
Работаю C# разработчиком с
не буду мерится с вами...
jangle пишет:
Был даже провальный проект
их и у меня тоже было N - количество, сейчас веду всего один проект по защите NET кода в мега-обвязках корпоративных клиентов.
jangle пишет:
В итоге уперлись в то
итог один : специализация языка (поймёте молодец, не поймёте... Ещё пару провальный проектов и поймёте)))
jangle пишет:
Но еще и в GC
вот тут вы правы это большая замороченная жопа, НО спросите у нативщиков что для них означает, при написании кода, словосочетание "memory leaks" а Вы как NET разработчик об этом даже не заботитесь (только не надо понимать буквально) и все это благодаря GC.



Ранг: 44.8 (посетитель), 19thx
Активность: 0.040
Статус: Участник

Создано: 09 июня 2019 00:28
· Личное сообщение · #16

jangle
разработчик 2013го года, гугли про джит хоть википедию почитай для начала
и узри правду и истину jit компеляция бывает быстрее статической
ну а какието свои индус проекты в пример приводить ну я х его з




Ранг: 71.9 (постоянный), 4thx
Активность: 0.040
Статус: Участник

Создано: 09 июня 2019 00:35
· Личное сообщение · #17

Medsft пишет:
специализация языка


У дотнета сейчас по-сути одна специализация - WEB разработка. Там не требуется ни высокая производительность, ни миллисекундная отзывчивость приложения. Отсюда бешеная популярность и желание менеджмента пропихнуть шарпы во все сферы разработки.

Medsft пишет:
сейчас веду всего один проект по защите NET кода


Довольно странный проект. Учитывая что сейчас 99% дотнета это Web-сервисы ASP.NET и т.п. работающий на сервере разработчика.

Добавлено спустя 12 минут
SegFault пишет:
разработчик 2013го года, гугли про джит хоть википедию почитай для начала
и узри правду и истину jit компеляция бывает быстрее статической
ну а какието свои индус проекты в пример приводить ну я х его з


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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 09 июня 2019 00:50
· Личное сообщение · #18

Medsft

Там картинка.



-----
vx


| Сообщение посчитали полезным: Medsft

Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

Создано: 09 июня 2019 19:02 · Поправил: Medsft
· Личное сообщение · #19

difexacaw пишет:
Там картинка
и какой ваш вывод?
jangle пишет:
Довольно странный проект.
какой есть уж . клиент северное приложение с толстым клиентом обслуживающее на сегодняшний день 15 тысяч рабочих мест (да я даже не знаю сколько на самом деле может больше в разы или 10 разов)
Есть быстрые операции есть повседневка, пока вроде разрабам спасибо говорят. А моё дело маленькое закрыть код и не допустить тормозов
А ещё проект есть)) ILSpector.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 09 июня 2019 19:30
· Личное сообщение · #20

Medsft

На простом апп после повторных действий выборка пропадает, но это в простейшем случае. Если посмотреть к примеру на выделение RWE блоков, то там куча идёт аллокаций, тоже при каждом действии и по таймеру. Если повторно клацать по кнопкам то со временем активность спадёт. Но фишка в том, что при каких то мелких событиях запускаются эти механизмы толстые. И таким образом апп становится дико тормозным.

-----
vx





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 10 июня 2019 00:30 · Поправил: ajax
· Личное сообщение · #21

Medsft пишет:
спросите у нативщиков что для них означает, при написании кода, словосочетание "memory leaks"

на днях встретился код на дотнете. heap alloc, выделенную вызовом функции внешней либы, не освобождает. это нормально? сам дотнет сие творит? в дебаг уже лень лезть, чтоб убедиться

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

Создано: 10 июня 2019 13:07
· Личное сообщение · #22

Фиг знает может у вас unsafe включен


<< . 1 . 2 .
 eXeL@B —› Вопросы новичков —› Как дизассемблировать приложение .NET Core?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати