Как разрушить общеязыковую среду выполнения (CLR).NET в чистом .NET

В зависимости от того, во сколько средство сохранения значит для Вас...

Добавление TODO и FIXME в комментарии автоматически добавляют задачу к списку задач в Eclipse. Таким образом, если существует код, Вы хотите возвратиться к, сказать, что Вы отлаживали и потребность провести некоторое исследование, можно сделать...

FIXME означает, что это срочно, который помещает красный! в окне
задачи TODO нормальная безотлагательность

//FIXME: This accidentally deletes user accounts
user.account().delete();

//TODO: Add some validation before assigning everyone as admin
user.setPrivilege("Admin");

И затем существуют методы set/методы считывания, автоматически создаваемые. Здорово, если Вы создаете боб или что-то. Скажите объявление класса, такого как:

public class SomeBean {
    private static int FIRST_VALUE = 0;
    private static int SECOND_VALUE = 1;
    ...
    private static int THOUSANDTH_VALUE = 1000;
}

можно создать все переменные, затем щелкнуть правой кнопкой в редакторе, перейдите к Источнику и затем выберите, Генерируют Методы set & Методы считывания. Это автоматически создаст их для Вас.

13
задан Community 23 May 2017 в 12:13
поделиться

5 ответов

Well...how would you define "pure .NET"? I played with CLR2/delegate/GCHandle/array when I read the "how to crash JVM" post, and came up with something like this:

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace TestCLR2Crash {
        static void Main( string[ ] args ) {
            // declare a delegate that refers to a static method,
            // in this case it's a static method generated from the
            // anonymous delegate.
            Action action = delegate( ) { };

            // "generate" code into an array of uint
            var fakeDelegate = new uint[ ] {
                // dummy values
                0x00000000, 0x00000000,
                // fake _methodPtrAux
                0x00000000,
                // native code/string
                0x6AEC8B55, 0x2FD9B8F5, 0xD0FF7C81, 0x006A006A,
                0x00E81F6A, 0x83000000, 0x50102404, 0x81CC5DBA,
                0x8BD2FF7C, 0x47C35DE5, 0x74656572, 0x73676E69,
                0x6F726620, 0x6567206D, 0x6172656E, 0x20646574,
                0x65646F63, 0x00000A21
            };

            // fill in the fake _methodPtrAux,
            // make it point to the code region in fakeDelegate
            var handle = GCHandle.Alloc( fakeDelegate, GCHandleType.Pinned );
            var addr = handle.AddrOfPinnedObject( );
            const int sizeOfUInt32 = sizeof( uint ); // 4
            const int indexOfCode = 3;
            fakeDelegate[ 2 ] = Convert.ToUInt32( addr.ToInt32( ) + sizeOfUInt32 * indexOfCode );

            var targetInfo = typeof( Action )
                .GetField( "_target", BindingFlags.NonPublic | BindingFlags.Instance );
            targetInfo.SetValue( action, fakeDelegate );
            action( );       // Greetings from generated code!
            Console.WriteLine( "Greetings from managed code!" );

            handle.Free( );
        }
    }
}

It's only known to work on 32-bit Windows XP with CLR2 on x86; and also known not to work with Vista and Windows 7 and the like, where DEP+ASLR is on by default.

The point of fun about the code above is that it didn't explicitly use unsafe code (although GCHandle.Alloc(..., GCHandleType.Pinned) demands security privilege), yet it manages to fake an array into a delegate instance, and calls into the x86 machine code within the array. The code itself is pure C#, if you don't count the embedded x86 code as some "foreign language" ;-) В основном он использует внутреннюю реализацию делегатов CLR2 для статических методов, так что несколько частных членов Delegate фактически являются внутренними указателями. Я запихнул код x86 в массив, который размещен в управляемой куче. Итак, чтобы это работало, DEP не должен быть включен, иначе нам придется найти другой способ получить привилегию выполнения на этой странице памяти.

Код x86 выглядит следующим образом: (в синтаксисе псевдо-MASM)

55              push ebp
8BEC            mov  ebp,esp
6A F5           push -0B                         ; /DevType = STD_OUTPUT_HANDLE
B8 D92F817C     mov  eax,KERNEL32.GetStdHandle   ; |
FFD0            call eax                         ; \GetStdHandle
6A 00           push 0                           ; /pReserved = NULL
6A 00           push 0                           ; |pWritten = NULL
6A 1F           push 1F                          ; |CharsToWrite = 1F (31.)
E8 00000000     call <&next_instruction>         ; |
830424 10       add  dword ptr ss:[esp],10       ; |Buffer
50              push eax                         ; |hConsole
BA 5DCC817C     mov  edx,KERNEL32.WriteConsoleA  ; |
FFD2            call edx                         ; \WriteConsoleA
8BE5            mov  esp,ebp
5D              pop  ebp
C3              ret

Это НЕ поведение, определенное CLI, и оно не будет работать в других реализациях CLI, таких как Mono. Есть и другие способы заставить аналогичную логику работать в Mono, они уже пробовали это в Ubuntu 9.04 w / Mono 2.4 и работали.

Я написал об этом сообщение в блоге здесь: http: //rednaxelafx.javaeye. com / blog / 461787

Это на китайском языке, но есть ' Там много кода, который должен объяснить, что я сделал. Используя тот же прием, в конце сообщения в блоге я показал несколько примеров того, как можно настроить приведенный выше код, чтобы что-то пошло не так, например, получить SEHException.

16
ответ дан 1 December 2019 в 22:23
поделиться

Я сделал это только сегодня. Я тестировал установку более крупного проекта .net. Отсутствовала сборка, содержащая некоторые интерфейсы, и exe просто перестает работать. Среда выполнения не обнаружила никаких исключений.

Вы можете быть уверены, что в среде выполнения еще больше ошибок - просто посчитайте миллионы строк кода ...

3
ответ дан 1 December 2019 в 22:23
поделиться

Орен Эйни обнаружил ошибку в инфраструктуре .net, которая вызвала исключение ExecutionEngineException - в основном сбой среды выполнения.

Вы можете прочитать об этом здесь (Microsoft Connect):

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=384781

И, несмотря на «закрытое» состояние ошибки, она еще не исправлена.

2
ответ дан 1 December 2019 в 22:23
поделиться

Я видел, как Java-программы вылетали из JVM, загружая несуществующий класс и игнорируя ClassNotFoundError , а затем продолжая выполнение, как будто ничего не произошло. Возможно, вы могли бы сделать что-то подобное при динамической загрузке класса .NET.

1
ответ дан 1 December 2019 в 22:23
поделиться

Я знаю, что вы можете вывести из строя весь свой компьютер с помощью .NET. Но это включает в себя бесконечный цикл и приоритет процесса RealTime ...

-1
ответ дан 1 December 2019 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: