端口C代码到C#.指针出现问题

本文关键字:问题 指针 代码 端口 | 更新日期: 2023-09-27 18:29:31

我有一个keygen的C源代码,用于为Dell锁定的BIOS生成"主代码"。

努力尝试,难以理解,经过数周的阅读和询问,得到了各种各样的结果。

然而,有很多事情我不知道如何用C#代码编写,这是我的目标,用于冒险和学术目的。

例如,我在C 上说unsigned char outData[16]

在C#中,我重写如下:

byte* outData = stackalloc byte[16];

通过这种方式,存储在C#上的字节值在RAM上的大小与C上的无符号字符的大小相同(基于http://bytes.com/topic/c-sharp/answers/658913-unsigned-char)

然后我可以在C#中执行以下操作:

int* testPointer = (int*) outData;
*testPointer = 0x67452301;

通过这样做,我修改了outData的位置0、1、2和3(字节是C#上int的四分之一(8位对32位),如果我没有错的话,与C上的无符号字符和int的关系相同)。

CCD_ 2和CCD_

unsigned char outData[16];
*(int *)(&outData[0]) = 0x67452301;

然后,outData的位置1、2、3和4再次发生变化(在这种情况下,索引从1开始,因为它是C,而不是C#)。

因此,从技术上讲,用一个32位整数指针改变一个无符号字符的值,并将其移植到C#,而且从技术上来说,它必须给出与C.相同的结果

现在,我想通过32位int指针更改C#上函数的outData的值,但是,我不会将其作为参数。因此,只有一个解决方案,将outData作为全局变量。然后是大麻烦。。。如果我把outData作为global,那么如果它不在方法中,它必须包含在类或结构中(据我所知,方法上的变量不是也不可能是global)。

如果我通过struct/class(根据我所知的唯一方法)执行全局outData,outData将成为一种托管数据类型,并且由于GC(GarbageCollector),它在RAM上从这里移动到那里,使用指向outData的指针将成为更大的麻烦。因此,这里有一个固定语句来帮助将outData临时放在RAM的固定位置,但也有一个问题,固定语句上不允许强制转换,然后我就不能这样做了:int* testPointer = (int*) outData;,其中outData的块大小比testPointer大,需要强制转换。

说了之前的所有东西,才是真正的问题。如何通过32位int指针更改C#上函数的outData值?或者。。。我可以使用什么算法来使用指针对outData进行这些更改,并假设outData将成为一个不需要不安全上下文的标准值类型?

我真的很喜欢第二个问题的更多答案,因为我想要实现的真正目标是将C代码移植到C#,并使用OO(面向对象)范式。

我正疯狂地试图理解一种算法,通过指针和使用不同的块大小来改变存储在RAM上的值,并且只需要一种方法来做到这一点,并且可以在C#和其他OO编程语言上自由使用指针。

期待您的回答!

作为参考,这里是我想要移植的程序的完整C代码:

http://pastebin.com/w8VQjVBu

我已经完成了大约40%的移植,那些C函数到指针,不同的块大小,这些东西在%*&持续数周!

端口C代码到C#.指针出现问题

听起来像是在试图将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来写是个坏主意。

当您谈论读取和写入由整数组成的16字节块时,我相信您正在寻找BinaryReader和BinaryWriter类。谷歌将为您提供大量关于如何使用这些类的演示。