面白いC言語のプログラムで、誰がプログラマーがロマンを知らないと言っていますか?
, 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()-*を に できます.
にプレゼントをしましょう.
な にいくつかのフォーラムを ることができて、いつもいくつかの いものを することができて、 くの これらの ない 、 にして の しみを しました.この は に くて、 このプログラムを ても したくなくて、 を てやっと として るくて、もちろんこのコードは の で うことができなくて、しかし はとてもこれらの しい さいコードを めるのが きで、 の しみを えました.