текст перекладу
Привіт, я 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 і знати, що він складається з простору імен, класу, назви методу, рівня доступу, модифікатора члена та аргументу методу.
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
tableschema As "Database Name",
Round(Sum(datalength + indexlength) / 1024 / 1024, 2) As "Database Size in MB"
From informationschema.Tables
Where tableschema = 'xxxxx'
Group By tableschema
Order By tableschema;_
текст перекладу
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