我有一个keygen的C源代码,可以为戴尔锁定的BIOS生成“主代码”。
努力学习,难以理解,经过数周的阅读和询问后得到了各种结果。
然而,有许多事情我不知道如何用C#代码编写它们,这是我的目标,用于冒险和学术目的。
例如,我在C
上说unsigned char outData[16]
在C#中,我重写如下:
byte* outData = stackalloc byte[16];
通过这种方式,存储在C#上的字节值在RAM上的大小与C上的unsigned char相同(基于http://bytes.com/topic/c-sharp/answers/658913-unsigned-char)
然后我可以在C#中执行以下操作:
int* testPointer = (int*) outData;
*testPointer = 0x67452301;
通过这样做,我已经修改了outData的位置0,1,2和3(字节是C#上的四分之一(8位对32位),与无符号字符相同的关系和C上的int我没错。)
byte outData
和testPointer
之上的所有内容都可以通过这种方式在C上完成:
unsigned char outData[16];
*(int *)(&outData[0]) = 0x67452301;
然后再次改变outData的1,2,3和4位(索引从1开始,因为它是C,而不是C#)。
因此,从技术上讲,用32位整数指针更改unsigned char的值,移植到C#,技术上必须给出与C相同的结果。
现在,我想通过32位int指针从C#上的函数更改outData的值,但是,我不会将其作为参数提供。因此,只有一个解决方案,使outData成为一个全局变量。然后是大麻烦...如果我把outData作为全局,它必须包含在类或结构中,如果它不在方法中(方法上的变量不是,并且不能是全局的,只要我知道)。
如果我通过struct / class执行全局outData事务(按照我所知的方式),outData变为托管数据类型,并且由于GC(GarbageCollector)而使用指针将它从此处移动到RAM上outData变得更大麻烦。所以,这里有一个固定语句,用于帮助暂时将outData放在RAM上的固定位置,但也有麻烦,在固定语句上不允许强制转换,然后我不能这样做:int* testPointer = (int*) outData;
,其中outData有另一个块大小而不是testPointer,需要进行转换。
说出以前的所有内容,都是真正的问题。如何通过32位int指针从C#上的函数更改outData的值?或者......我可以使用什么算法来使用指针对outData whitout进行这些更改,并假设outData将成为不需要不安全上下文的标准值类型?
真的会非常喜欢第二个问题的答案,因为我想要实现的真正目标是将C代码移植到C#,并使用OO(面向对象)范例。
我疯狂地试图理解一种算法,通过指针和使用不同的块大小来对存储在RAM中的值进行更改,并且只需要一种方法来执行此操作并且无需指针即可使用C#和其他OO编程语言。
对任何答案都有所期待!
并且,作为参考,这里是我想要移植的程序的完整C代码:
我已经做了大约40%的移植,那些C函数转向指针,不同的块大小,这些东西真的是%*&好几个星期!
答案 0 :(得分:1)
听起来你正试图将32位int的值复制到字节数组的前四个字节中。
为此,请使用BitConverter.GetBytes方法并将结果字节复制到另一个数组:
var n = 0xFAFBFCFD;
var a = new byte[16];
var temp = BitConverter.GetBytes(n);
temp.CopyTo(a, 0);
现在:
a[0] == 0xFD
a[1] == 0xFC
a[2] == 0xFB
a[3] == 0xFA
就像一些评论所说的那样,尝试编写C#是一个坏主意,好像它是C.
答案 1 :(得分:0)
当你在谈论读取和编写由整数组成的16字节块时,我相信你正在寻找BinaryReader和BinaryWriter类。 Google将为您提供有关如何使用这些课程的大量演示。