极验验证码是一种常见的防爬虫机制,通过滑动拼图等方式验证用户的人机身份。本文将介绍如何使用Golang语言破解极验滑动验证码,模拟验证过程并绕过验证码。
准备工作
首先,确保你已经安装了Golang。如果没有,请从Golang官方网站下载安装。
分析验证码请求
在破解验证码之前,我们需要分析极验验证码在验证过程中发起的请求。通过观察,可以发现这些请求中的一些关键参数:
gt 和 challenge:用于标识验证码会话。
w:这是一个加密过的数据,破解的核心就在于解密并伪造这个参数。
获取核心JS文件链接
我们首先获取核心JS文件的链接,以便分析其中的加密逻辑。
go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"regexp"
)
func getJSLink() string {
resp, err := http.Get("https://example.com/gettype.php")
if err != nil {
fmt.Println("Error:", err)
return ""
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error:", err)
return ""
}
re := regexp.MustCompile(`https:\/\/.*?\.js`)
match := re.FindString(string(body))
return match
}
func main() {
jsLink := getJSLink()
fmt.Println("JS Link:", jsLink)
}
获取无感验证参数
通过请求get.php获取无感验证的参数,包括c和s。
go
func getNoSenseParams() (string, string) {
resp, err := http.Get("https://example.com/get.php")
if err != nil {
fmt.Println("Error:", err)
return "", ""
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error:", err)
return "", ""
}
reC := regexp.MustCompile(`"c":"(.*?)"`)
reS := regexp.MustCompile(`"s":"(.*?)"`)
c := reC.FindStringSubmatch(string(body))
s := reS.FindStringSubmatch(string(body))
return c[1], s[1]
}
func main() {
c, s := getNoSenseParams()
fmt.Println("c:", c, "s:", s)
}
执行无感验证
通过请求ajax.php执行无感验证,如果验证失败,会返回滑块验证等其他类型的验证。
go
func executeNoSenseVerification(c, s string) string {
resp, err := http.Get(fmt.Sprintf("https://example.com/ajax.php?c=%s&s=%s", c, s))
if err != nil {
fmt.Println("Error:", err)
return ""
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error:", err)
return ""
}
re := regexp.MustCompile(`"type":"(.*?)"`)
match := re.FindStringSubmatch(string(body))
return match[1]
}
func main() {
c, s := getNoSenseParams()
verificationType := executeNoSenseVerification(c, s)
fmt.Println("Verification Type:", verificationType)
}
进行滑动验证
当无感验证失败时,进行滑动验证。通过请求get.php获取滑动验证的基本数据,如bg、fullbg、slice等。
go
func getSlideParams() map[string]string {
resp, err := http.Get("https://example.com/get.php?slide=true")
if err != nil {
fmt.Println("Error:", err)
return nil
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error:", err)
return nil
}
params := make(map[string]string)
re := regexp.MustCompile(`"(\w+)":"(.*?)"`)
matches := re.FindAllStringSubmatch(string(body), -1)
for _, match := range matches {
params[match[1]] = match[2]
}
return params
}
func main() {
slideParams := getSlideParams()
for key, value := range slideParams {
fmt.Println(key, ":", value)
}
}
破解w参数
在Golang中实现w参数的破解过程,包括生成u和h参数。
生成u参数
u参数的生成涉及一个随机数和加密操作。
go
import (
"crypto/rand"
"encoding/hex"
"fmt"
)
func getU() string {
b := make([]byte, 16)
_, err := rand.Read(b)
if err != nil {
fmt.Println("Error:", err)
return ""
}
return hex.EncodeToString(b)
}
func main() {
fmt.Println("U:", getU())
}
生成h参数
h参数的生成过程复杂一些,需要依赖多个函数。
go
import (
"crypto/sha256"
"encoding/hex"
)
func getH(parameters map[string]string) string {
data := parameters["key1"] + parameters["key2"]
hash := sha256.Sum256([]byte(data))
return hex.EncodeToString(hash[:])
}
func main() {
parameters := map[string]string{"key1": "value1", "key2": "value2"}
fmt.Println("H:", getH(parameters))
}
合并u和h参数
最后,将u和h参数合并生成最终的w参数。
go
func generateW(parameters map[string]string) string {
u := getU()
h := getH(parameters)
return u + h
}
func main() {
parameters := map[string]string{"key1": "value1", "key2": "value2"}
w := generateW(parameters)
fmt.Println("W:", w)
}
发送滑动验证请求
有了w参数后,我们可以构造滑动验证的请求并发送。
go
func executeSlideVerification(w string) string {
resp, err := http.Get(fmt.Sprintf("https://example.com/ajax.php?w=%s", w))
if err != nil {
fmt.Println("Error:", err)
return ""
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error:", err)
return ""
}
re := regexp.MustCompile(`"result":"(.*?)"`)
match := re.FindStringSubmatch(string(body))
return match[1]
}
func main() {
parameters := map[string]string{"key1": "value1", "key2": "value2"}
w := generateW(parameters)
result := executeSlideVerification(w)
fmt.Println("Verification Result:", result)
}