上一篇提到ZMap是为64位环境设计编写的,但是32位机也能编译使用。
首先下载代码,进入目录,make,遇到三四个error就结束了,error中有一句关键的:
cc1: warnings being treated as errors
这是由于Makefile里面指定让编译器将warning当成error,所以编译中止了。
我们只要将src/Makefile修改一下就好了:
WERROR_CFLAGS = -Werror
#EXTRACFLAGS=-g -O2 $(EXTRA_CFLAGS) $(GCCHARDENING) $(GCCWARNINGS) -Werror
EXTRACFLAGS=-g -O2 $(EXTRA_CFLAGS) $(GCCHARDENING) $(GCCWARNINGS)
编译成功,运行上一篇提到的测试命令:
sudo zmap -p 80 -N 10 -B 1M -o -
结果冒出这么一句:
[FATAL] zmap: could not detect GW MAC address for 192.168.1.1 on eth0. Try setting default gateway mac address (-G).
arp后发现没有网关的IP和MAC地址映射,这里可以手工添加网关的IP和mac地址,也可以直接ping一下网关就OK了。
这样zmap就可以使用了,但是会不会出问题就不清楚了,毕竟我们将64位转32位可能出现的warning给屏蔽了。
下面试着去解决这些warning,首先将Makefile恢复成原样。
第一个error是:
lib/blacklist.c
../lib/blacklist.c:127: error: left shift count >= width of type
../lib/blacklist.c:127: error: division by zero
这是一个移位的问题,可以做如下修改:
int m=32;
//log_debug("blacklist", "%llu addresses allowed to be scanned (%0.0f%% of address space)",
// allowed, allowed*100./(1L << 32));
log_debug("blacklist", "%llu addresses allowed to be scanned (%0.0f%% of address space)",
allowed, allowed*100./(1L << m));
第二个问题:
zmap.c:112: warning: format ‘%lu’ expects type ‘long unsigned int’, but argument 4 has type ‘uint64_t’
这是一个printf格式化相关的问题,可以这样改(先在86行左右加一个宏定义)
#define SLL(w,x,y) printf("%s\t%s\t%llu\n", w, x, y);
//SLU("cnf", "bandwidth", zconf.bandwidth);
SLL("cnf", "bandwidth", zconf.bandwidth);
第三个问题:
zmap.c: In function ‘main’:
zmap.c:461: error: left shift count >= width of type
zmap.c:470: error: left shift count >= width of type
改法和第一个一样:
int m=32;
//Line 461
v = v * (1L << m) / 100.;
//Line 470
else if (v >= (1L << m)) {
改完了,再重新make,就OK啦。