dnsspoof工作原理 編譯 原始碼分析

2021-05-28 01:05:17 字數 2796 閱讀 8202

dnsspoof 是乙個dns欺騙工具,只要給出將要重定向的網域名稱和網域名稱重定向到的ip,就可以實現dns欺騙。

dnsspoof是dsniff工具集中的乙個。

dnsspoof依賴2個三方庫:libpcap , libnet

我這裡使用的版本是:

dsniff-2.3.tar.gz

libnet-1.0.2a.tar.gz

libpcap-1.2.0rc1.tar.gz

【源**編譯】

首先編譯 libpcap

tar -zxvf libpcap-1.2.0rc1.tar.gz

mkdir /usr/local/libpcap-1.2.0

cd libpcap-1.2.0

./configure --prefix=/usr/local/libpcap-1.2.0/

make

make install

然後編譯 libnet

tar -zxvf libnet-1.0.2a.tar.gz

mkdir /usr/local/libnet-1.0.2a

cd libnet-1.0.2a

./configure --prefix=/usr/local/libnet-1.0.2a/

make

make install

dnsspoof 源**包括下面幾個檔案:

err.h

err.c

queue.h

pcaputil.h

pcaputil.c

version.h

strlcpy.h

strlcpy.c

dnsspoof.c

strlcpy.h是我新增的標頭檔案,為的是宣告strlcpy函式。

size_t strlcpy(char *dst, const char *src, size_t siz);

dnsspoof.c需要修改包含檔案路徑

#include "sys/queue.h"

#include "err.h"

#include "pcaputil.h"

#include "version.h"

#include "strlcpy.h"

巨集定義 in_addr_t

#define in_addr_t u_int32_t

編譯命令列是

gcc -g -wall -o dnsspoof dnsspoof.c pcaputil.c err.c strlcpy.c -i /usr/local/libpcap-1.2.0/include/ -i /usr/local/libnet-1.0.2a/include/ -l /usr/local/libpcap-1.2.0/lib -l /usr/local/libnet-1.0.2a/lib -lpcap -lnet -lresolv -dlibnet_lil_endian

編譯後生成可執行檔案 dnsspoof

【使用方法】

在本層目錄下建立乙個檔案,dnsspoof.hosts

檔案格式為

#[將要重定向到的ip] [空格或者tab] [將要重定向的網域名稱]

執行命令列是

dnsspoof -i 網路介面 -f 需要重定向的網域名稱-ip檔案 libpcap過濾表示式

./dnsspoof -i eth0 -f ./dnsspoof.hosts udp dst port 53 and src 192.168.61.109

如果想要欺騙本機,需要修改一下dnsspoof.c檔案中的**

snprintf(buf, sizeof(buf), "udp dst port 53 and not src %s",

libnet_host_lookup(lnet_ip, 0));

修改為snprintf(buf, sizeof(buf), "udp dst port 53 and src %s",

libnet_host_lookup(lnet_ip, 0));

執行dnsspoof的時候就可以不帶libpcap過濾表示式

./dnsspoof -i eth0 -f ./dnsspoof.hosts

【原始碼分析】

main函式首先根據傳入的引數 -f hosts 呼叫dns_init(dev, hosts);

dns_init解析檔案,將ip-網域名稱取出後儲存到鍊錶中 slist_insert_head (&dns_entries, de, next);

接著呼叫pcap_init,pcap_init做的事情就是使用libpcap開啟網絡卡,設定為混雜模式,按給定的過濾器表示式編譯、

設定過濾器

接著呼叫pcap_dloff,取得ip資料頭的偏移量

接著使用 libnet 介面函式 libnet_open_raw_sock 建立原始套接字。

接著進入大迴圈階段 pcap_loop(pcap_pd, -1, dns_spoof, null);

每當有乙個資料報被截獲,呼叫 dns_spoof

dns_spoof 函式分析乙個 dns 查詢報文,找到需要解析的網域名稱,呼叫 dns_lookup_a 或者 dns_lookup_ptr 查詢鍊錶中儲存的網域名稱

檢查是不是我們想要欺騙的網域名稱,

如果是,呼叫 libnet_build_ip,libnet_build_udp,memcpy,libnet_do_checksum,構造乙個dns響應報文,

呼叫 libnet_write_ip 傳送這個構造的報文。

如果不是直接返回。

當應用程式接收到這個響應報文後,gethostbyname 函式就已經返回了。

編譯原理 編譯器各階段工作

1.詞法分析 詞法分析器根據詞法規則識別出源程式中的各個記號 token 每個記號代表一類單詞 lexeme 源程式中常見的記號可以歸為幾大類 關鍵字 識別符號 字面量和特殊符號。詞法分析器的輸入是源程式,輸出是識別的記號流。詞法分析器的任務是把原始檔的字元流轉換成記號流。本質上它檢視連續的字元然後...

編譯原理 編譯器各階段工作

1.詞法分析 詞法分析器根據詞法規則識別出源程式中的各個記號 token 每個記號代表一類單詞 lexeme 源程式中常見的記號可以歸為幾大類 關鍵字 識別符號 字面量和特殊符號。詞法分析器的輸入是源程式,輸出是識別的記號流。詞法分析器的任務是把原始檔的字元流轉換成記號流。本質上它檢視連續的字元然後...

編譯器工作原理 GCC C C

原始碼要執行,必須先轉成二進位制的機器碼。這是編譯器的任務。比如,下面這段原始碼 假定檔名叫做test.c int main void 要先用編譯器處理一下,才能執行。gcc test.c a out hello world 對於複雜的專案,編譯過程還必須分成三步。configure make ma...