У меня есть исходный код C для keygen для генерации «мастер-кодов» для заблокированных BIOS Dell.
Старался изо всех сил, трудно понять это, и получил много результатов после многих недель чтения и спрашивания.
Однако есть много вещей, которые я не знаю, как написать их в коде C #, что является моей целью для приключений и академических целей.
Например, я говорю unsigned char outData[16]
на C
В C # я переписал это следующим образом:
byte* outData = stackalloc byte[16];
Таким образом, байтовые значения, хранящиеся в C #, имеют тот же размер в ОЗУ, что и неподписанный символ в C (на основе http://bytes.com/topic/c-sharp/answers/658913-unsigned-char)
Тогда я могу сделать следующее в C #:
int* testPointer = (int*) outData;
*testPointer = 0x67452301;
Сделав это, я изменил позиции 0, 1, 2 и 3 outData (байт - это четверть целого числа на C # (8 бит против 32 бит), то же самое отношение, что и для unsigned char и int на C, если Я не ошибаюсь).
Все вышеперечисленное из вещей byte outData
и testPointer
может быть сделано таким образом на C:
unsigned char outData[16];
*(int *)(&outData[0]) = 0x67452301;
И затем снова меняются позиции 1, 2, 3 и 4 outData (в данном случае индексы начинаются с 1, потому что это C, а не C #).
Итак, сделано технически, изменить значения беззнакового символа с помощью 32-битного целочисленного указателя, портированного на C #, и это технически должно дать те же результаты, что и на C.
Теперь я хочу изменить значения outData из функции на C # через 32-битный указатель int, но я не буду давать его в качестве параметра. Итак, только одно решение, сделать outData глобальной переменной. Затем возникает большая проблема ... если я опубликую outData как глобальный, он должен содержаться в классе или структуре, если он отсутствует в методе (переменные в методах не являются и не могут быть глобальными, пока я знаю).
Если я делаю эту глобальную вещь outData через struct / class (только так, как я знаю), outData становится управляемым типом данных и перемещается отсюда туда в ОЗУ благодаря GC (GarbageCollector) и использует указатели на outData становится большей проблемой. Итак, здесь приведен фиксированный оператор, помогающий временно поместить OutData в фиксированное место в ОЗУ, но также возникает проблема: приведение типов к фиксированным операторам запрещено, и тогда я не могу этого сделать: int* testPointer = (int*) outData;
, где outData имеет необходим другой размер блока, чем testPointer и приведение.
Сказал все предыдущие вещи, приходит реальный вопрос. Как я могу изменить значения outData из функции на C # через 32-битный указатель int? ИЛИ ... Какой алгоритм я могу использовать для внесения этих изменений в outData whitout, используя указатели, и предположим, что outData станет стандартным типом значений, который не нуждается в небезопасных контекстах?
На самом деле очень хотелось бы получить гораздо больше ответов на второй вопрос, потому что реальная цель, которую я хочу достичь, это перенести код C на C # и использовать OO (объектно-ориентированную) парадигму.
Я схожу с ума, пытаясь понять алгоритм для внесения этих изменений значений, хранящихся в ОЗУ, с помощью указателей и с использованием блоков разных размеров, и просто имею метод, позволяющий это сделать, и быть свободным от указателей, чтобы быть готовым к использованию на C # и другие языки программирования OO.
Ожидаемое спасибо за любой ответ!
И, для справки, вот полный C-код программы, которую я хочу перенести:
http://pastebin.com/w8VQjVBu
Я сделал около 40% портирования, эти функции C идут на указатели, блоки разных размеров, и эти вещи действительно мучают% * & в течение нескольких недель!