2012-03-31 75 views
0

我有一個keygen的C源代碼爲Dell鎖定的BIOS生成「主代碼」。。帶指針的問題

努力嘗試,很難理解它,經過數週的閱讀和詢問後獲得了各種結果。

但是,有很多事情我不知道如何在C#代碼中編寫它們,這是我的目標,用於冒險和學術目的。

例如,我說unsigned char outData[16]第C

在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位vs 32位),與C上的無符號char和int的關係相同,如果I我沒有錯)。

所有的byte outDatatestPointer事情上面的東西可以通過這種方式對C或者:

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

再然後,位置1,2,3和outData 4被改變(索引從1開始在這種情況下,因爲它是C,而不是C#)。

所以,做技術,一個unsigned char型的變化值與32位整數指針,移植到C#,並在技術上必須給出相同的結果,對C.

現在,我想改變的值通過一個32位int指針在C#上的函數outData,但是,我不會把它作爲參數。所以,只有一個解決方案,使outData成爲一個全局變量。然後來了大麻煩......如果我把數據放在全局,它必須包含在一個類或結構,如果它不是在一個方法(方法上的變量不是也不能是全局變量,只要我知道)。

如果我通過struct/class來完成全局outData事物(只有我知道的方式),outData變成了一個託管數據類型,並且由於GC(GarbageCollector)而從此處移動到RAM,並且使用指針outData成爲更大的麻煩。所以,這裏是固定的聲明,以幫助暫時將數據放在RAM上的固定位置,但也有麻煩,在固定語句上不允許進行轉換,然後我不能這樣做:int* testPointer = (int*) outData;,其中outData有另一個塊大小比testPointer和鑄造是需要的。

說過以前所有的東西,都是真正的問題。如何通過32位int指針在C#上的函數中更改outData的值?或者...我可以使用什麼算法來使用指針對outData whitout進行這些更改,並假定outData將成爲不需要不安全上下文的標準值類型?

對於第二個問題,真的會愛很多很多的答案,因爲我想要完成的真正目標是將C代碼移植到C#,並使用面向對象(OO)的範例。

我想瘋狂嘗試理解一種算法,通過指針和使用不同的塊大小對存儲在RAM中的值進行更改,並且只需要一個方法來做到這一點,並且無需指針就可以使用關於C#和其他OO編程語言。

預計感謝您的任何答案!

而且,僅供參考,這裏是程序的完整的C代碼,我想端口:

http://pastebin.com/w8VQjVBu

我已經做了約40%的移植,這些C函數去指針,不同的塊大小和這些東西幾周來一直非常痛苦!

+1

C#與C不是同一種編程語言。即使您可能能夠對代碼進行逐行翻譯,但這並不是一個好主意。 「移植」背後的全部理念是將代碼實際轉換爲目標語言的慣用代碼。你根本不需要在C#中使用指針。 – 2012-03-31 05:26:03

+0

對!你明白我的觀點,我想用OO範例重新制作這個keygen,並將所有想法和算法放在C#上。再次,我的真正答案是通過將此keygen移植到C#,我唯一需要的「但是」是C#上變量值變化的東西,就像C使用不同緩衝區大小的指針一樣 – mishamosher 2012-03-31 05:33:18

+0

只需修改對象的值即可。堆棧溢出並不是真的有人教你C#的地方。你真的需要得到一本書,並首先學習語言。 – 2012-03-31 05:34:14

回答

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一樣。

+0

真的很棒,很棒的方法!現在,如果我想讓我們說,不是將32位有符號整數轉換爲字節數組,而是將mmm ... 128位十進制數轉換爲無符號16位整數數組。我已經意識到有用於int,double,float,single等的BitConverter等等。有沒有像intnt,double,float,single等等的UInt16Converter的東西? – mishamosher 2012-03-31 05:58:43

+0

搜索所有的MSDN 轉換器結果,我意識到有每種類型的數字變量和組合的轉換器,但他們更像「Convert.To 」方法。沒有發現一些類似於每種類型的'GetBytes'的東西,這更多是我想要的(GetUInt32s,GetSBytes等) – mishamosher 2012-03-31 06:13:16

+0

您可能需要多個轉換步驟GetBytes - > Byte Array - > ToUint16。BitConverter類提供了一組用於將原語轉換爲字節數組和從中轉換字節數的方法。 – 2012-03-31 06:24:31

0

正如你在談論讀寫由整數組成的16字節塊,我相信你正在尋找BinaryReader和BinaryW riter類。谷歌會給你很多關於如何使用這些類的演示。

+0

感謝Brannon,它結束時的操作與GetBytes - > Byte Array - >到相同,但它有更有趣的事情來處理這些轉換,這就是爲什麼我會繼續使用它的原因,而不是BitConverter :)。重要的是要注意,他們更依賴於StreamWriters,但只是讓事情變得更大。 – mishamosher 2012-03-31 18:16:30