2015-07-18 36 views
3

我有一些反編譯的C源代碼,看到這個奇怪的字符串賦值。C字符串賦值向後

char v1[21]; 
v1[0] = 0x75767778; 
"tsrqponmlkjihgfedcba" = v1; 

這是怎麼回事?這怎麼可能?

+2

它編譯? –

+0

這不應該編譯。作業的左側應該始終是一個變量。這可能是反編譯的問題。 –

+0

我從https://retdec.com/decompilation/ – user3376293

回答

6
char v1[21]; 

到目前爲止沒有問題;將v1定義爲包含21個char元素的數組。

v1[0] = 0x75767778; 

法律,但不正確。 v1[0]是一個char對象。除非CHAR_BIT >= 32(不太可能),否則它不能保存值0x75767778。如果普通的char是無符號的並且CHAR_BIT==8,它將分配值0x78;如果純char已簽名,它將可能做相同,但值是實現定義的。

這可能是相關的是,的0x75767778字節是字符'u''v''w''x'的ASCII碼。

"tsrqponmlkjihgfedcba" = v1; 

這是非法的。字符串文字不能是賦值的左側,C不支持數組賦值。

顯然你的「反編譯器」(你沒有發現)正在產生或多或少看起來像C的東西,但不是。

這可能是部分解釋如果左側和右側的任務被顛倒。即使是這樣,輸出似乎是某種僞代碼。 (難道代碼實際使用=而不是說,->=>?)

看到從這個被「反編譯」源代碼將是有益的 - 因爲會知道什麼是「反編譯」您正在使用和看到的其文檔。

猜測是源代碼有一個字符串象"xwvutsrqponmlkjihgfedcba",和產生的代碼中使用的整數分配給複製"xwvu"(表示爲0x75767778)和一個單獨的操作對於剩餘的20個字符,但是這只是一個猜測。或者它可能是"abcdefghijklmnopqrstuvwx",並且由於字節排序而被顛倒過來。