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

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

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

Postby hellicopter » Thu Nov 12, 2020 8:57 pm

.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: 2007
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

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

Postby Admin » Mon Nov 16, 2020 6:13 am

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

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


Присылайте простейший пример (оригинал бинарника +VMP проект).

hellicopter
Posts: 22
Joined: Sun Oct 18, 2020 2:10 am

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

Postby hellicopter » Mon Nov 16, 2020 9:04 am

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

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

Если запустить после обработки VMProtect (VMProtect2.vmp), то вывод:
Start test
TargetInvocationException
Finish test
Attachments
VMProtect2.7z
(82.45 KiB) Downloaded 34 times

Admin
Site Admin
Posts: 2007
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

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

Postby Admin » Mon Nov 16, 2020 4:25 pm

Проблема здесь заключается в том, что виртуальная машины VMProtect-а вызывает методы через MethodBase.Invoke и при любом возникновении исключения внутри Invoke нетовый рантайм обертывает исключение в TargetInvocationException. Хорошо, что в NETCore есть замечательный флаг "BindingFlags.DoNotWrapExceptions" и эту проблему можно решить довольно просто, а вот что делать для NETFramework (где такого флага тупо нет) - большой вопрос.

hellicopter
Posts: 22
Joined: Sun Oct 18, 2020 2:10 am

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

Postby hellicopter » Mon Nov 16, 2020 5:07 pm

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

Вопросы:
1. Можно ли рассчитывать, что в следующем билде флаг "BindingFlags.DoNotWrapExceptions" будет применяться?
2. Почему применение async/await убирает данную проблему?

Admin
Site Admin
Posts: 2007
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

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

Postby Admin » Thu Nov 19, 2020 10:17 am

1. Можно ли рассчитывать, что в следующем билде флаг "BindingFlags.DoNotWrapExceptions" будет применяться?

Да.
2. Почему применение async/await убирает данную проблему?

Вопрос к авторам нетового рантайма.

Admin
Site Admin
Posts: 2007
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

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

Postby Admin » Thu Nov 19, 2020 11:13 am

Проверяйте 1254.

hellicopter
Posts: 22
Joined: Sun Oct 18, 2020 2:10 am

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

Postby hellicopter » Thu Nov 19, 2020 6:41 pm

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