Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 5
1

Как перевести byte[] или переменную типа IntPtr к типу byte[] (ассемблерные инструкции)?

04.03.2014, 21:14. Показов 1781. Ответов 9
Метки нет (Все метки)

Наткнулась на проблему, нужно перевести тип IntPtr в массив ассемблерной инструкции.
Вот пример кода, который нужно справить:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        public IntPtr MakeJump(IntPtr pOrigAddress, int iNopsNeeded, ref byte[] pCaveBytes, UIntPtr dwCaveSize)
        {
            IntPtr dwCaveAddress;
            dwCaveAddress = MakeCave(ref pCaveBytes, (dwCaveSize + 5));
 
            IntPtr dwReturnJmp = IntPtr.Add(IntPtr.Add(pOrigAddress, 5), iNopsNeeded); //(получаем адрес для возврата)
 
            byte[] dwReturnJmpTemp = new byte[4];
 
            dwReturnJmpTemp = BitConverter.GetBytes((int)dwReturnJmp); //(здесь нужно перевести массив в ассемблерные инструкции)
            
            
 
            byte[] bJmp = { 0xE9 };
            WriteMem(IntPtr.Add(dwCaveAddress, (int)dwCaveSize), ref bJmp, (UIntPtr)1); //Копируем байт прыжка E9
            WriteMem(IntPtr.Add(IntPtr.Add(dwCaveAddress, (int)dwCaveSize), 1), ref dwReturnJmpTemp, (UIntPtr)4); //тут пишем адрес
            //Проблема в том что в массиве адрес возвращается в hex в отладчике она выглядит как:  E9 21554200 - jmp 03D65530 
            //а должна быть такая: E9 1255AEFC - jmp 00425521
 
            return dwCaveAddress;
        }
P.S. Реализация обязательно нужна на C#
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2014, 21:14
Ответы с готовыми решениями:

преобразование ref byte в byte[] или в IntPtr без использования неуправляемого кода
есть COM интерфейс с методом: virtual /* */ HRESULT STDMETHODCALLTYPE OnReceivePacket( ...

Глупый человек ищет умную мысль при сравнения массива типа byte с маскй типа byte.
Прошу помощи в виде объяснения в следующем вопросе. на вход программы поступает array of byte....

как отослать переменную типа byte по сети
как отослать переменную типа byte по сети. Пробовал WriteSmallInt, но она посылает 2 байта

Как из потока передать в переменную типа Byte?
Вопрос такой: как можно из потока TStream данные занести в двумерный массив типа Array of Byte по...

9
Master of Orion
Эксперт .NET
6087 / 4943 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.03.2014, 22:16 2
Цитата Сообщение от Luminesa Посмотреть сообщение
перевести тип IntPtr в массив ассемблерной инструкции.
P.S. Реализация обязательно нужна на C#
вас кто-то обманул...
0
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 5
04.03.2014, 22:27  [ТС] 3
Цитата Сообщение от Psilon Посмотреть сообщение
вас кто-то обманул...
Портирую функции из проекта С++ на С# и проблема встала только с конвертацией 00425521 в 1255AEFC
Нужна хотя бы подсказка или пинок в нужную сторону, через какую функцию или как это перевести в нужный массив?
0
Master of Orion
Эксперт .NET
6087 / 4943 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.03.2014, 22:31 4
Luminesa, что-то не очень понимаю. А откуда эти цифры вообще получены?
0
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 5
04.03.2014, 22:41  [ТС] 5
Цитата Сообщение от Psilon Посмотреть сообщение
Luminesa, что-то не очень понимаю. А откуда эти цифры вообще получены?
Это адреса
Первый адрес 00425521 ( в обычном формате), второй 1255AEFC (это этот же адрес в формате байтов)
Нужно первый адрес привести к формату байтов и занести его в массив byte[]
0
Master of Orion
Эксперт .NET
6087 / 4943 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.03.2014, 23:39 6
Luminesa, я не понимаю, что значит "формат байтов"? Что имеется ввиду под "Обычным форматом"? Просто нужно определиться с понятиями, чтобы был предметный разговор.
0
349 / 328 / 49
Регистрация: 12.12.2011
Сообщений: 563
04.03.2014, 23:58 7
Luminesa, E9 это опкод относительного прыжка, то есть прыжок производится на n байт вперед/назад, по этому дизасемблер запись E9 1255AEFC трактует как jmp 00425521 потому что уже почитал смещение DESTINATION - CURRENT - 5
0
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 5
05.03.2014, 00:53  [ТС] 8
Yukikaze, насколько я помню, E9 - безусловный прыжок, EB - относительный, суть вопроса в том что, строка
C#
1
IntPtr dwReturnJmp = IntPtr.Add(IntPtr.Add(pOrigAddress, 5), iNopsNeeded);
возвращает готовый адрес т.е. 00425521. мне же нужно что бы он выдавал 1255AEFC в переменную (dwReturnJmp) или же готовый адрес (00425521) конвертировать в массив байт вида: 0x12, 0x55, 0xAE, 0xFC, что бы в последующем записать его через
C#
1
WriteMem(IntPtr.Add(IntPtr.Add(dwCaveAddress, (int)dwCaveSize), 1), ref dwReturnJmpTemp, (UIntPtr)4);
0
349 / 328 / 49
Регистрация: 12.12.2011
Сообщений: 563
05.03.2014, 01:51 9
Лучший ответ Сообщение было отмечено Luminesa как решение

Решение

Luminesa, EB - short jump (1 byte, -127..+127), E9 - near jump. EB, E9 - relative jump, EA, FF - absolute jump.
Если в dwReturnJmp лежит готовое смещение то нужно прибавить его к адресу откуда будет выполнен переход

Добавлено через 18 минут
так...кажется я понял. dwReturnJmp это место куда нужно перейти? Тогда мы берем dwReturnJmp(куда) и отнимаем от него pOrigAddress(откуда) получаем смещение, от этого смещения отнимаем еще 5 байт (sizeof(E9 XX XX XX XX))

Добавлено через 1 минуту
Обязательно ли использовать jmp, может проще использовать push ret?
1
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 5
05.03.2014, 11:00  [ТС] 10
Всем спасибо, разобралась.

Пример рабочей функции, если кому нужно будет.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        public IntPtr MakeJump(IntPtr pOrigAddress, int iNopsNeeded, ref byte[] pCaveBytes, UIntPtr dwCaveSize, IntPtr dwCaveSizeTemp)
        {
            IntPtr dwCaveAddress;
            byte[] bJmp = { 0xE9 };
            byte[] dwReturnJmpTemp = new byte[4];
            byte[] dwJmpAddrTemp = new byte[4];
            
            dwCaveAddress = MakeCave(ref pCaveBytes, (dwCaveSize + 5));
 
            IntPtr dwReturnJmp = IntPtr.Add(IntPtr.Add(pOrigAddress, 5), iNopsNeeded);
            dwReturnJmp = IntPtr.Subtract(dwReturnJmp, (int)IntPtr.Add(dwCaveAddress, (int)IntPtr.Add(dwCaveSizeTemp, 5)));
            dwReturnJmpTemp = BitConverter.GetBytes((int)dwReturnJmp);
 
 
            WriteMem(IntPtr.Add(dwCaveAddress, (int)dwCaveSize), ref bJmp, (UIntPtr)1);
            WriteMem(IntPtr.Add(IntPtr.Add(dwCaveAddress, (int)dwCaveSize), 1), ref dwReturnJmpTemp, (UIntPtr)4);
 
 
            IntPtr dwJmpAddr = IntPtr.Subtract(dwCaveAddress, (int)IntPtr.Add(pOrigAddress, 5));
            dwJmpAddrTemp = BitConverter.GetBytes((int)dwJmpAddr);
 
            if (iNopsNeeded != 0)
                WriteNops(IntPtr.Add(pOrigAddress, 5), iNopsNeeded);
 
            WriteMem(pOrigAddress, ref bJmp, (UIntPtr)1);
            WriteMem(IntPtr.Add(pOrigAddress, 1), ref dwJmpAddrTemp, (UIntPtr)4);
 
            return dwCaveAddress;
        }
Yukikaze, благодарности за пинок в нужную сторону

P.S.
Тему можно закрывать
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2014, 11:00

Перевести строку, содержащую данные массива байт (byte[]) в byte[]
Приветствую. Есть такая строка - "" Как её перевести в массив байт? 1. Допустим, что...

Как преобразовать IntPtr в изображение, а после в byte[]?
Суть в том, что я хочу выбирать PSD файл, преобразовывать его сразу в картинку и отправлять в...

Нельзя преобразовать тип function(a: byte;b: byte): byte к integer (Списки)
Создать список из целых чисел.Поменять в списке местами максимальный и минимальный элементы...

Переменную типа ushort разделить на 2 Byte
Здравствуйте, Господа. Раньше программировал на Делфи, перехожу на шарп. нужен код, который бы...

Вывести 2-битовые значения, упакованные в переменную типа Byte
В переменную типа Byte “упаковано” 4 маленьких неотрицательных целых значений, каждое из которых...

Как double word поделить на byte (dword/byte) ?
Здравствуйте. Помогите пожалуйста, как dword/byte. Вот пример как я делал, не понимаю в чем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.