long blogs

进一步有进一步惊喜


  • Home
  • Archive
  • Tags
  •  

© 2025 long

Theme Typography by Makito

Proudly published with Hexo

C-宏注入及其应用

Posted at 2020-09-04 C 

基础:GCC编译时注入宏

类型1 gcc控制宏的开关

源码main.c

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main() {
#ifdef MC
printf("===MC 宏开启 \n");
#ifdef DMC
printf("===DMC 宏开启\n");
#endif
#else
printf("===MC 宏未开启\n");
#endif
return 0;
}

说明

有宏MC控制代码的编译分支,MC宏可以由gcc编译的时候定义。使用 “-D宏名”,开启宏。

编译1-未开启宏

gcc main.c -o main.out

编译2-开启宏MC

gcc main.c -DMC -o main.out

编译3-开启宏MC和DMC

gcc main.c -DMC -DDMC -o main.out

类型2 gcc 注入宏值

源码main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
void printData(uint8_t *data,int32_t len){
int j = 1;
for (int i=0;i<len;i++){
printf("%2x ",(uint8_t)data[i]);
if(j % 16 == 0){
printf("\n");
}
j++;
}
}
int main() {
#ifdef MC_NUM
int i = 22;
int result = i + MC_NUM;
printf("%d = %d + %d ",result,i,MC_NUM);
#else
printf("MC_NUM 未开启");
#endif
#ifdef MC_STR
printf("MC_STR = %s\n",MC_STR);
#endif
#ifdef MC_BYTE
uint8_t data21[] = {MC_BYTE};
printf("\n=========字节宏==========\n");
printData(data21,sizeof(data21));
printf("\n==========================\n");
#endif
return 0;
}

编译1-设置宏MC_NUM值

gcc main.c -DMC_NUM=123 -o macro_demo.out

注意:”=”两边不能有空格。

输出:

1
145 = 22 + 123 

编译2-设置宏MC_STR值

gcc main.c -DMC_NUM=123 -DMC_STR=\"Hello\ World\\nWelcome\ c\" -o macro_demo.out

注意:字符需要使用转义字符,双引号和空格都要。

输出

1
2
3
4
===DMC 宏开启
145 = 22 + 123
MC_STR = Hello World
Welcome c

编译3-注入16进制数据

gcc main.c -DMC_BYTE=0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf,0xff

输出

1
2
3
4
5
=========字节宏==========
1 2 3 4 5 6 7 8 9 a b c d e f ff

==========================

应用:CMakeLists和makefile宏注入

CMakeLists.txt

1
add_compile_options(-DMC  -DMC_NUM=123 -DMC_STR=\"Hello\ World\\nWelcomffe\ c\" -DMC_BYTE=0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf,0xff)

makefile

1
2
CFLAGS += -DMC
CFLAGS += -DMC_NUM=123

字节类有如下方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 秘钥注入方式1 -成功
#CFLAGS += "-DBYTE1=0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf"
#CFLAGS += "-DBYTE2=0x02,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf"
#CFLAGS += "-DBYTE3=0x03,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf"
#CFLAGS += "-DBYTE4=0x04,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf"

# 秘钥注入方式2 -成功
#CFLAGS += -DBYTE1=0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf
#CFLAGS += -DBYTE2=0x02,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf
#CFLAGS += -DBYTE3=0x03,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf
#CFLAGS += -DBYTE4=0x04,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf

# 秘钥注入方式3 -成功
BYTE1 = -DBYTE1=0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf
BYTE2 = -DBYTE2=0x02,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf
BYTE3 = -DBYTE3=0x03,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf
BYTE4 = -DBYTE4=0x04,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xa,0xb,0xc,0xd,0xe,0xf
CFLAGS += ${BYTE1}
CFLAGS += ${BYTE2}
CFLAGS += ${BYTE3}
CFLAGS += ${BYTE4}

Share 

 Previous post: C-AES加解密 Next post: C-Base 

© 2025 long

Theme Typography by Makito

Proudly published with Hexo