// backupHostsFilePath 存储 hosts 文件的备份路径
var backupHostsFilePath = "C:\Windows\System32\drivers\etc\hosts.backup"
dnsFile, err := os.Open("dns.txt")
log.Fatalf("无法打开 DNS 文件:%v", err)
ips, err := ioutil.ReadAll(dnsFile)
log.Fatalf("无法读取 DNS 文件:%v", err)
logFile, err := os.OpenFile("dns.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
log.Fatalf("无法创建日志文件:%v", err)
log.Fatalf("备份 hosts 文件失败:%v", err)
ipList := strings.Split(string(ips), "n")
for _, ip := range ipList {
ip = strings.TrimSpace(ip)
if !checkHostIP("img.a8dog.com", ip) {
if err := modifyHosts("img.a8dog.com", ip); err != nil {
log.Printf("修改 host 文件失败:%v", err)
log.Printf("刷新 DNS 缓存失败:%v", err)
time.Sleep(5 * time.Second)
if !checkHostIP("img.a8dog.com", ip) {
log.Printf("域名未指向目标 IP:%s", ip)
err := deleteFile("downloaded_image.jpg")
log.Printf("删除旧的图片文件失败:%v", err)
_, err = downloadFile("https://img.a8dog.com/i/2024/04/30/loux3b.jpg", "downloaded_image.jpg")
log.Printf("下载图片失败:%v", err)
duration := time.Since(start)
speed := float64(fileSize("downloaded_image.jpg")) / duration.Seconds() / 1024 // KB/s
logMsg := fmt.Sprintf("IP: %s, 下载时间: %v, 下载速度: %.2f KB/s", ip, duration, speed)
if _, err := logFile.WriteString(logMsg + "n"); err != nil {
log.Printf("写入日志文件失败:%v", err)
log.Fatalf("恢复 hosts 文件失败:%v", err)
func modifyHosts(hostname, ip string) error {
hostsFilePath := "C:\Windows\System32\drivers\etc\hosts"
hostsFile, err := os.OpenFile(hostsFilePath, os.O_APPEND|os.O_WRONLY, 0644)
_, err = hostsFile.WriteString(fmt.Sprintf("%s %sn", ip, hostname))
func downloadFile(url, filename string) (int64, error) {
resp, err := http.Get(url)
file, err := os.Create(filename)
size, err := io.Copy(file, resp.Body)
func fileSize(filename string) int64 {
info, err := os.Stat(filename)
func backupHostsFile() error {
src, err := os.Open("C:\Windows\System32\drivers\etc\hosts")
dst, err := os.Create(backupHostsFilePath)
_, err = io.Copy(dst, src)
func restoreHostsFile() error {
src, err := os.Open(backupHostsFilePath)
dst, err := os.Create("C:\Windows\System32\drivers\etc\hosts")
_, err = io.Copy(dst, src)
func flushDNSCache() error {
cmd := exec.Command("ipconfig", "/flushdns")
func deleteFile(filename string) error {
err := os.Remove(filename)
func checkHostIP(hostname, expectedIP string) bool {
addrs, err := net.LookupIP(hostname)
log.Printf("无法解析域名:%s", err)
for _, addr := range addrs {
if addr.String() == expectedIP {