2011-03-15 12 views
0

2つの関数を含むCで書かれたプログラムがあります。もう1つの関数はmain()で、もう1つはバイト配列として格納されている関数です(varFunc()としましょう)。配列へのポインタは、main関数で関数ポインタにキャストされ、main関数から呼び出されます。今実行関数が変数として定義されています

を(以下のコードを参照してください)、私は、データセクションからコードを実行できませんオペレーティングシステムおよび一部のプロセッサがあることを知っている、と私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は、この例では暗号化されて:)

おかげで、 Binyamin

答えて

5

をGCCでは、あなたはで何かを入れて__attribute__((section("text")))を使用することができます特定のセクション。詳細はhereを参照してください。 Visual C++には__declspec(allocate("section"))があります。ドキュメントについてはhereを参照してください。

3

Jeremiah Willcockのコンパイラ属性の使用方法の代わりに、mmapメモリと少しのメモリのアクセス権を要求してから、そこにデータをコピーしてから呼び出すことができます。

特定のコンパイラに依存するのではなく、標準のPosix関数に依存するので、コンパイラの移植性(gcc/...)のためにプラットフォームの移植性(Posix/Windows)を交換します。

関連する問題