面白いC言語のプログラムで、誰がプログラマーがロマンを知らないと言っていますか?

2324 ワード

      ,           C    。 
  
 

:http://bbs.pediy.com/showthread.php?p=389887

, i O y( , )

#include <stdio.h>
int main()
{
    const short int c1 = 49920;
    const int c2 = 1073742008;

    int (*pf)() = (int (*)())&c2;
 
    printf("%c %c %c
", *((char*)pf()+1)-0x11,*(char*)pf()-0x4a, *((char*)pf()+1)-0x1); return 0; }

この2つのコード:
const short int c1 = 49920;
const int c2 = 1073742008;

2つのローカル が され、16 に されます.
const short int c1 = 0xc300;
const int c2 = 0x400000b8;

ここで、 c 1のアドレスは、0 x 001 FF 44であり、2バイトを め、c 2のアドレスは、0 x 001 FF 40であり、4バイトを める.
この2つの は した を めている. 、0 x 12 fff 40から まるメモリセルに されるバイトコードは、B 8 00 00 40 C 3である. するコードは のとおりです.
 mov         eax,400000h
 ret

ODで して、バイナリコードやアセンブリコードを すると えます
の :
int (*pf)() = (int (*)())&c2;

ポインタが され、パラメータはNULL、 り はintタイプです.この ポインタは、 の (メモリアドレスの に )を します.これにより、pf()が で され、この が される.
に、
printf("%c %c %c
", *((char*)pf()+1)-0x11,*(char*)pf()-0x4a, *((char*)pf()+1)-0x1);

まず*(char*)pf()-0 x 11という を て、pf のアセンブリコードを しました.アセンブリコードから ると、この び し の り は0 x 40000で、pf() のchar*は の り を1つのchar* ポインタに し、このポインタは0 x 40000を し、 に* を けて、0 x 40000アドレスを る を します.char* ポインタなので、したがって、このアドレスから1バイトを します.
*(char*)pf()-0 x 11は、0 x 400000から り したバイトの から0 x 11を することを す.
PEファイル を している は、exeファイル0 x 400000に してメモリロードのベースアドレスであることを っているに いない.すなわち、0 x 40000バイトのコンテンツが0 x 4 Dに する、0 x 40001バイトのコンテンツが0 x 5 Aに する.
これは たちがよく うpeファイルの の2バイト、「MZ」です.これにより、 *(char*)pf()-*を に できます.

にプレゼントをしましょう.
な にいくつかのフォーラムを ることができて、いつもいくつかの いものを することができて、 くの これらの ない 、 にして の しみを しました.この は に くて、 このプログラムを ても したくなくて、 を てやっと として るくて、もちろんこのコードは の で うことができなくて、しかし はとてもこれらの しい さいコードを めるのが きで、 の しみを えました.