2011-03-15 38 views
0

我有C編寫的,它包括2個功能,一個功能是main(),另一個功能是存儲爲字節數組預編譯的功能的程序(讓我們稱之爲varFunc())。指向數組的指針在main函數中轉換爲函數指針,然後從main函數中調用它。 (見下面的代碼)Run函數定義爲可變

現在,我知道有操作系統和一些處理器,將不允許從數據部分執行代碼,而我varFunc應該就在那裏......

是否有辦法使用C語言使C編譯器向代碼/文本部分添加一些變量?如果沒有,是否有辦法在大多數編譯器中由編譯器強制執行?

char varFuncArr[] = { 0xDE, 0x67, 0x6F, 0x6F, 0xAC, 0x13, 0x05, 0x01, 0xDA, 0xF0, 0xBD, 0x79, 0xA9, 0x10, 0x00, 0x00, 0xB8, 0x74, 0x00, 0x00, 0x00, 0x3F, 0x58, 0x13, 0xEA, 0x0A, 0x2E, 0xEE, 0xC7, 0x01, 0x05, 0xD0, 0x6E, 0xB8, 0x9E}; 

    typedef unsigned long (*funcPtr)(void* d[]); 

    int main(int argc, char** argv) 
    { 
     unsigned int ra[8]; 
     funcPtr varFunc; 
     for (i=0; i<8; i++) 
      ra[i] = 0; 
     varFunc = (funcPtr)varFuncArr; 
     return varFunc(ra); 
    } 

注1:我知道,這是調用一個函數很笨拙的方式,它也使超級平臺和編譯器,但我告訴這個例子中,以使其更簡單,實際使用包括加密功能而不是varFuncArr()

注2:不要嘗試運行這段代碼,varFuncArr在這個例子:)加密

感謝, 本雅明

回答

5

在GCC,你可以使用__attribute__((section("text")))把東西在特定部分;有關文檔,請參閱here。 Visual C++有__declspec(allocate("section"));有關文檔,請參見here

3

除了Jeremiah Willcock提出的使用編譯器屬性的建議之外,您還可以在mmap之間存儲一些內存並請求它的執行權限,然後在調用它之前將數據複製到那裏。

由於編譯器不依賴於特定的編譯器,而是依賴於標準的Posix函數,所以您將交易平臺可移植性(Posix/Windows)以便編譯器可移植性(gcc/...)。