Виклик методів з .NET збірок за допомогою Powershell та Reflection API

текст перекладу
pic

Привіт, я W1C3 і сьогодні я представлю вам першу частину цієї серії, яка описує виклик методів .NET збірок за допомогою PowerShell і Reflection API.

Індекс
1.- Вступ
2.- Основні концепції
……..2.1.- Структура .NET
……..2.2.- Reflection API
……..2.3.- dnspy
3.- Публічний клас — Виклик публічного статичного методу — без конструктора
……..3.1.- Код
……..3.2.- Скрипт PowerShell
……..3.3.- Результат
4.- Публічний клас — Виклик приватного статичного методу — без конструктора
……..4.1.- Код
……..4.2.- Скрипт PowerShell
……..4.3.- Результат
5.- Публічний клас — Виклик публічного методу — без конструктора
……..5.1.- Код
……..5.2.- Скрипт PowerShell
……..5.3.- Результат
6.- Публічний клас — Виклик приватного методу — без конструктора
……..6.1.- Код
……..6.2.- Скрипт PowerShell
……..6.3.- Результат
7.- Повні джерела
……..7.1.- Код
……..7.2.- Скрипт PowerShell

1.- Вступ

Під час оцінки деяких додатків .NET я зіткнувся з випадком, коли потрібно викликати певну функцію безпосередньо з .NET збірки.

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

Тому я провів деякі дослідження і з'ясував, що можна використовувати PowerShell разом з Reflection API .NET для безпосереднього виклику методів з імпортованих збірок.

2.- Основні концепції

2.1.- Структура .NET

Важливо розуміти структуру класу .NET і знати, що він складається з простору імен, класу, назви методу, рівня доступу, модифікатора члена та аргументу методу.

pic

2.2.- Reflection API

Reflection дозволяє перевіряти, викликати та отримувати доступ до даних типів .NET, включаючи як публічні, так і приватні члени. За замовчуванням PowerShell надає доступ тільки до публічних властивостей і методів, але за допомогою Reflection API можна отримати доступ до внутрішніх типів у .NET.

2.3.- dnspy

dnSpy — це дебаггер і редактор .NET збірок.
текст перекладу
Ви також можете прочитати це на моєму блозі: https://prgexp.blogspot.com/2019/06/want-to-know-your-mysql-database-size.html

Отже, ви можете спробувати наступний скрипт:

Select
table
schema As "Database Name",
Round(Sum(datalength + indexlength) / 1024 / 1024, 2) As "Database Size in MB"
From informationschema.Tables
Where table
schema = 'xxxxx'
Group By tableschema
Order By table
schema;_
текст перекладу
pic

7.- Повні джерела

7.1.- Код

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  

namespace ReflectionAPI  
{  
 public class ReflectionUsage  
 {  
 private const string _key = "XOR_key";  
 // Публічний метод  
 public string encryptText(string plaintext)  
 {  
 return ToHexString(xorOperation(plaintext));  
 }  

 // Приватний метод  
 private string decryptText(string ciphertext)  
 {  
 return xorOperation(FromHexString(ciphertext));  
 }  

 // Публічний статичний метод  
 public static string staticEncryptText(string plaintext)  
 {  
 return ToHexString(staticXorOperation(plaintext));  
 }  

 // Приватний статичний метод  
 private static string staticDecryptText(string ciphertext)  
 {  
 return staticXorOperation(FromHexString(ciphertext));  
 }  

 // Допоміжний метод для операції XOR  
 private string xorOperation(string text)  
 {  
 var result = new StringBuilder();  
 for (int i = 0; i < text.Length; i++)  
 {  
 result.Append((char)(text[i] ^ _key[i % _key.Length]));  
 }  
 return result.ToString();  
 }  

 // Статичний допоміжний метод для операції XOR  
 private static string staticXorOperation(string text)  
 {  
 var result = new StringBuilder();  
 for (int i = 0; i < text.Length; i++)  
 {  
 result.Append((char)(text[i] ^ _key[i % _key.Length]));  
 }  
 return result.ToString();  
 }  

 // Перетворити рядок у шістнадцяткове значення  
 private static string ToHexString(string input)  
 {  
 var hex = new StringBuilder(input.Length * 2);  
 foreach (char c in input)  
 {  
 hex.AppendFormat("{0:x2}", (int)c);  
 }  
 return hex.ToString();  
 }  

 // Перетворити шістнадцяткове значення в рядок  
 private static string FromHexString(string hex)  
 {  
 var result = new StringBuilder(hex.Length / 2);  
 for (int i = 0; i < hex.Length; i += 2)  
 {  
 result.Append((char)Convert.ToByte(hex.Substring(i, 2), 16));  
 }  
 return result.ToString();  
 }  
 }  
}

7.2.- Скрипт Powershell

# Завантажити збірку (.exe або .dll)  
$AssemblyName = "C:\Users\wice\source\repos\ReflectionAPI\ReflectionAPI\bin\x64\Release\ReflectionAPI.exe"  
[Reflection.Assembly]::LoadFile($AssemblyName) | Out-Null  


# Отримати клас ReflectionUsage Формат: [namespace.class]  
$class = [ReflectionAPI.ReflectionUsage]  

# ------------------------ Публічний статичний метод ------------------------  

# Викликати статичний метод 'staticEncryptText' з вхідним значенням "Hola Mundo"  
$returnStaticEncryptText = $class::staticEncryptText("Hola Mundo")  

Write-Output "Повернений метод staticEncryptText:"  
Write-Output $returnStaticEncryptText  
Write-Output " "  

# ------------------------ Публічний статичний метод ------------------------  


# ------------------------ Приватний статичний метод ------------------------  

# Визначити параметри прив'язки для доступу до непрямих статичних методів  
$BindingFlagsStatic= [Reflection.BindingFlags] "NonPublic,Static"  

# Отримати приватний статичний метод 'staticDecryptText' за допомогою рефлексії  
$PrivateStaticMethod = $class.GetMethod("staticDecryptText",$bindingFlagsStatic)  

# Викликати метод 'staticDecryptText' з зашифрованим рядком  
$returnStaticDecryptText = $PrivateStaticMethod.Invoke($null,"10203e3e4b280c362b3d")  

Write-Output "Повернений метод staticDecryptText:"  
Write-Output $returnStaticDecryptText  
Write-Output " "  

# ------------------------ Приватний статичний метод ------------------------  

# ------------------------ Публічний метод ------------------------  

# Створити новий екземпляр класу ReflectionUsage  
$PublicMethod = New-Object "ReflectionAPI.ReflectionUsage"  

# Викликати публічний метод 'encryptText' з вхідним значенням "Hola Mundo"  
$returnEncryptText = $PublicMethod.encryptText("Hola Mundo")  

Write-Output "Повернений метод EncryptText:"  
Write-Output $returnEncryptText  
Write-Output " "  

текст перекладу
## ------------------------ Публічний метод ------------------------

## ------------------------ Приватний метод ------------------------

# Створити екземпляр класу ReflectionUsage за допомогою Activator  
$instance = [Activator]::CreateInstance($class)  

# Визначити параметри прив'язки для доступу до непрямих методів екземпляра  
$BindingFlags= [Reflection.BindingFlags] "NonPublic,Instance"  

# Отримати приватний метод екземпляра 'decryptText' за допомогою рефлексії  
$PrivateMethod = $class.GetMethod("decryptText", $BindingFlags)  

# Викликати метод 'decryptText' з зашифрованим текстом  
$returnDecryptText = $PrivateMethod.Invoke($instance, "10203e3e4b280c362b3d")  

Write-Output "Повернений метод DecryptText:"  
Write-Output $returnDecryptText  
Write-Output " "  

Дякую за прочитаний пост.
текст перекладу
Залишайтеся з нами для нових постів на блозі та не соромтесь підписатися на мене в соціальних мережах, щоб отримувати оновлення.

Github: J-W1C3

Twitter: Josewice7

Telegram: W1C3Posts

Перекладено з: Invoke methods from .NET Assemblies using Powershell and Reflection API

Leave a Reply

Your email address will not be published. Required fields are marked *