Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Инъекция Кода С C#
Можете ли вы использовать windows крючки или другие методы, чтобы сделать инъекцию кода с c#? я видел много вещей о инъекции кода, но все они сделаны в C/C++. я не знаю ни одного из этих языков и очень трудно переводить. У кого-нибудь есть идеи, как это сделать?
Кевин, это вполне возможно. Вы можете создать библиотеку с помощью window hook proc, используя управляемый C++. Все, что вам нужно сделать, это ввести этот крюк в какое-то приложение, используя стандартный WinAPI (SetWindowsHookEx и т. д.). Внутри этого крючка вы можете вызвать метод System::AppDomain::CurrentDomain - >Load, чтобы загрузить ваш assembly в AppDomain целевого приложения. Затем вы можете вызвать методы, определенные в вашем assembly, используя отражение. Например, Snoop использует этот метод.
У Майка Столла есть этот образец, который использует CreateRemoteThread. Он имеет то преимущество, что не требует никакого C++.
- Похоже , я неверно истолковал этот вопрос .... У меня сложилось впечатление, что речь идет о внедрении кода в текущий процесс.
Я вступаю в партию довольно поздно, но я только что использовал именно это несколько недель назад:
Делегат содержит закрытые поля IntPtr _methodPtr и IntPtr _methodPtrAux , которые представляют адрес памяти тела. Установив в поле (через отражение) определенные значения, можно изменить адрес памяти, на который будет указывать EIP.
Используя эту информацию, можно сделать следующее:
- Создайте массив с assembly байтами, которые должны быть выполнены
- Переместите указатель метода делегата на соответствующие байты
- Вызов делегата
- Прибыль ???
(Конечно, вы можете изменить значение _methodPtr на любой адрес памяти - даже в пространстве kernel, но для этого могут потребоваться соответствующие привилегии выполнения).
У меня есть рабочий пример кода здесь, Если вы хотите:
public static unsafe int? InjectAndRunX86ASM(this Func<int> del, byte[] asm)
{
if (del != null)
fixed (byte* ptr = &asm[0])
{
FieldInfo _methodPtr = typeof(Delegate).GetField("_methodPtr", BindingFlags.NonPublic | BindingFlags.Instance);
FieldInfo _methodPtrAux = typeof(Delegate).GetField("_methodPtrAux", BindingFlags.NonPublic | BindingFlags.Instance);
_methodPtr.SetValue(del, ptr);
_methodPtrAux.SetValue(del, ptr);
return del();
}
else
return null;
}
Которые можно использовать следующим образом:
Func<int> del = () => 0;
byte[] asm_bytes = new byte[] { 0xb8, 0x15, 0x03, 0x00, 0x00, 0xbb, 0x42, 0x00, 0x00, 0x00, 0x03, 0xc3 };
// mov eax, 315h
// mov ebx, 42h
// add eax, ebx
// ret
int res = del.InjectAndRunX86ASM(asm_bytes); // should be 789 + 66 = 855
Конечно, он также мог бы написать следующий метод:
public static unsafe int RunX86ASM(byte[] asm)
{
Func<int> del = () => 0; // create a delegate variable
Array.Resize(ref asm, asm.Length + 1);
// add a return instruction at the end to prevent any memory leaks
asm[asm.Length - 1] = 0xC3;
fixed (byte* ptr = &asm[0])
{
FieldInfo _methodPtr = typeof(Delegate).GetField("_methodPtr", BindingFlags.NonPublic | BindingFlags.Instance);
FieldInfo _methodPtrAux = typeof(Delegate).GetField("_methodPtrAux", BindingFlags.NonPublic | BindingFlags.Instance);
_methodPtr.SetValue(del, ptr);
_methodPtrAux.SetValue(del, ptr);
return del();
}
}
То же самое, вероятно, можно было бы сделать с существующими методами (не делегатами) через отражение:
// UNTESTED //
Action new_method_body = () => { };
MethodInfo nfo = typeof(MyType).GetMethod( ..... );
IntPtr ptr = nfo.MethodHandle.Value; // ptr is a pointer to the method in question
InjectX86ASM(new_method_body, new byte[] { ......., 0xC3 }); // assembly bytes to be injected
int target = new_method_body.Method.MethodHandle.Value.ToInt32();
byte[] redirector = new byte[] {
0xE8, // CALL INSTRUCTION + TARGET ADDRESS IN LITTLE ENDIAN
(byte)(target & 0xff),
(byte)((target >> 8) & 0xff),
(byte)((target >> 16) & 0xff),
(byte)((target >> 24) & 0xff),
0xC3, // RETURN INSTRUCTION
};
Marshal.Copy(redirector, 0, ptr, redirector.Length);
Используйте любой код на свой страх и риск. Примеры кода должны быть скомпилированы с помощью параметра
/unsafe-compiler .
Вы можете проверить CInject для инъекции кода в сборки .NET на сайте CodePlex http://codeinject.codeplex.com/ . Вам не нужно иметь никаких знаний об инъекции кода, чтобы ввести любой код, когда вы используете CInject.