下面的六个程序片段主要完成这些事情:
输出Hello, World
(1)nb的宏替换
预处理后为:
(2)神一般的指针和数组操作...
(3)宏+goto @ @
输出Hello, World
(1)nb的宏替换
#define _________ }
#define ________ putchar
#define _______ main
#define _(a) ________(a);
#define ______ _______(){
#define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
#define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
#define ____ _(0x72)_(0x6C)_(0x64)_(0x21)
#define _____ __ ___ ____ _________
#include<stdio.h>
_____
预处理后为:
#include<stdio.h>
main()
{
putchar(0x48);
putchar(0x65);
putchar(0x6C);
putchar(0x6C);
putchar(0x6F);
putchar(0x2C);
putchar(0x20);
putchar(0x77);
putchar(0x6F);
putchar(0x72);
putchar(0x6C);
putchar(0x64);
putchar(0x21);
}
(2)神一般的指针和数组操作...
#include<stdio.h>
main()
{
int x=0,y[14],*z=&y;
*(z++)=0x48; //数组名y不能y++
*(z++)=y[x++]+0x1D;
*(z++)=y[x++]+0x07;
*(z++)=y[x++]+0x00;
*(z++)=y[x++]+0x03;
*(z++)=y[x++]-0x43;
*(z++)=y[x++]-0x0C;
*(z++)=y[x++]+0x57;
*(z++)=y[x++]-0x08;
*(z++)=y[x++]+0x03;
*(z++)=y[x++]-0x06;
*(z++)=y[x++]-0x08;
*(z++)=y[x++]-0x43;
*(z++)=y[x]-0x21;
x=*(--z);
while(y[x]!=NULL)
putchar(y[x++]);
}
(3)宏+goto @ @