Обработка исключений в .Net Core 3.1

Issues related to VMProtect
Post Reply
hellicopter
Posts: 26
Joined: Sun Oct 18, 2020 2:10 am

Обработка исключений в .Net Core 3.1

Post by hellicopter »

.Net Core 3.1

Метод

Code: Select all

        [Obfuscation( Feature = "ultra", Exclude = false )]
        public static DeleteDirectory( string path ) {
            try {
                Directory.Delete( path, true );
            }
            // fix {
            catch( TargetInvocationException ex ) when( ex.InnerException is DirectoryNotFoundException ) {
            }
            // } fix
            catch( DirectoryNotFoundException ) {
            }
        }
Если директория "path" не существует:

- в режиме
Feature = "ultra"
или
Feature = "virtualization"
вместо DirectoryNotFoundException выбрасывается TargetInvocationException
с InnerException is DirectoryNotFoundException

- в режиме
Feature = "mutation"
работает корректно, т.е. выбрасывается DirectoryNotFoundException

Проблему обошёл добавлением обработчика
catch( TargetInvocationException ex ) when( ex.InnerException is DirectoryNotFoundException ) {
return new List<long>();
}

Однако, хотелось бы реализовать обработку более корректно.
Или я что-то делаю неверно?


Интересно, что, если реализовать метод так

Code: Select all

        [Obfuscation( Feature = "ultra", Exclude = false )]
        public static async Task DeleteDirectory( string path, CancellationToken token ) {
            try {
                Directory.Delete( path, true );
            }
            catch( DirectoryNotFoundException ) {
            }
            await Task.CompletedTask;
        }
(т.е. добавить async/await)
то эффект не проявляется.
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Обработка исключений в .Net Core 3.1

Post by Admin »

Если директория "path" не существует:

- в режиме
Feature = "ultra"
или
Feature = "virtualization"
вместо DirectoryNotFoundException выбрасывается TargetInvocationException
с InnerException is DirectoryNotFoundException
Присылайте простейший пример (оригинал бинарника +VMP проект).
hellicopter
Posts: 26
Joined: Sun Oct 18, 2020 2:10 am

Re: Обработка исключений в .Net Core 3.1

Post by hellicopter »

Пример во вложении.

Если запустить без обработки VMProtect, то вывод:
Start test
DirectoryNotFoundException
Finish test

Если запустить после обработки VMProtect (VMProtect2.vmp), то вывод:
Start test
TargetInvocationException
Finish test
Attachments
VMProtect2.7z
(82.45 KiB) Downloaded 210 times
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Обработка исключений в .Net Core 3.1

Post by Admin »

Проблема здесь заключается в том, что виртуальная машины VMProtect-а вызывает методы через MethodBase.Invoke и при любом возникновении исключения внутри Invoke нетовый рантайм обертывает исключение в TargetInvocationException. Хорошо, что в NETCore есть замечательный флаг "BindingFlags.DoNotWrapExceptions" и эту проблему можно решить довольно просто, а вот что делать для NETFramework (где такого флага тупо нет) - большой вопрос.
hellicopter
Posts: 26
Joined: Sun Oct 18, 2020 2:10 am

Re: Обработка исключений в .Net Core 3.1

Post by hellicopter »

Ну, поскольку можно рассчитывать, что новый софт будет писаться на .NET 5,
то, возможно, проблема не столь страшна.

Вопросы:
1. Можно ли рассчитывать, что в следующем билде флаг "BindingFlags.DoNotWrapExceptions" будет применяться?
2. Почему применение async/await убирает данную проблему?
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Обработка исключений в .Net Core 3.1

Post by Admin »

1. Можно ли рассчитывать, что в следующем билде флаг "BindingFlags.DoNotWrapExceptions" будет применяться?
Да.
2. Почему применение async/await убирает данную проблему?
Вопрос к авторам нетового рантайма.
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Обработка исключений в .Net Core 3.1

Post by Admin »

Проверяйте 1254.
hellicopter
Posts: 26
Joined: Sun Oct 18, 2020 2:10 am

Re: Обработка исключений в .Net Core 3.1

Post by hellicopter »

В 1254 исправлено.
Спасибо.
Post Reply