Golang安全工具开发系列——解密小工具
2023-2-9 10:30:34 Author: 每天一个入狱小技巧(查看原文) 阅读量:16 收藏

本次是笔者在学习golang开发语言中自行编写的一个小工具,由于笔者本人目前还未学会golang的图形化界面打造,若使用图形化界面进行打造,可以增加更多的功能,本文章包含golang的http请求、flag包获取命令行输入、base64加密、base64解密、简单的逻辑运算等知识。

笔者本人目前还在golang学习的初级阶段,望大佬多多指点。

flag包

获取命令行参数输入,并进行输入

package main
import ( "flag" "fmt")
func main() { act := flag.String("act", "", "") flag.Parse() fmt.Println("act:", *act)}

使用go run xx.go -act qwe执行看看效果。

解析一下这个flag包的用法,flag.String()包默认是*String的类型。flag.Parse()主要是把用户传递的命令行参数解析为对应变量的值。flag.String("act","","")是需要用户使用-act参数来获取用户输入的参数。当然flag包还有其他写法。

HTTP请求

http请求主要用的是golang内置的net/http包,这里先采用GET请求。

使用http.NewRequest函数构造一个GET请求

testUrl := "http://127.0.0.1"// 其中testUrl,是我们要请求的url。req, err := http.NewRequest("GET", testUrl, nil)tr := &http.Transport{    TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, //忽略证书校验  }  var client *http.Client = &http.Client{Transport: tr}// 这里的err 不等于空的情况下返回err错误信息。if err != nil {    panic(err)  }req.Header.Set("","")              // 这里可以添加一些header以防止服务端认为是爬虫// client := http.Client{//    Timeout: 5 * time.Second,     // 设置访问超时时间//  }resp, err := client.Do(req)        // 发送http请求if err != nil { //当出现err不等于nil的时候,说明出现某些错误,需要做异常处理    fmt.Println("request fail", err.Error())    return  } else {    fmt.Printf("StatusCode: %v\n", resp.StatusCode)         // 输出状态码    body, err := ioutil.ReadAll(resp.Body)                  // 提取Body    if err != nil {      panic(err)    }    fmt.Println("解密值为:",string(Body))                      // 打印输入请求的body内容  }

base64加密

// base64加密  message := *b64decode  // 编码消息  encodedMessage := base64.StdEncoding.EncodeToString([]byte(message))  // 输出编码完成的消息  fmt.Println(encodedMessage)

简单的一个解密函数,固定写法base64.StdEncoding.EncodeToString([]byte())

base64解密

// bse64解密  enmessage := *enb64code  // base64解密  data, err := base64.StdEncoding.DecodeString(enmessage)  // 出错处理  if err != nil {    fmt.Println(err)  } else {    // 打印解码完成的数据    fmt.Println(string(data))  }

base64.StdEncoding.DecodeString()解密函数也是固定的写法。后面依旧是err报错的处理方法。

完整的源码包

package main
import ( "crypto/tls" "encoding/base64" "flag" "fmt" //当下面调用到包时会自动填充 "io/ioutil" "net/http")
func main() { // 获取命令行参数 flag.String("h", "", "-h 显示帮助信息") md5 := flag.String("m", "", "-m 输入要解密的md5字符串") b64decode := flag.String("d", "", "-d 输入要加密的Base64字符串") enb64code := flag.String("a", "", "-a 输入要加密的Base64字符串") // 解析命令行参数写入注册的flag里 flag.Parse()
// MD5解密 [email protected] 是你cmd5的账号,key是你cmd5的密钥 testUrl := "http://www.cmd5.com/[email protected]&key=xxxx&hash=" + *md5 req, err := http.NewRequest("GET", testUrl, nil) tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, //忽略证书校验 } var client *http.Client = &http.Client{Transport: tr} if err != nil { panic(err) } req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (HTML, like Gecko) Chrome/103.0.0.0 Safari/537.36") //自定义http请求头
//client := http.Client{ // Timeout: 5 * time.Second, //设置访问超时时间 //}
resp, err := client.Do(req) //发送请求
if err != nil { //当出现err不等于nil的时候,说明出现某些错误,需要做异常处理 fmt.Println("request fail", err.Error()) return } else { //fmt.Printf("StatusCode: %v\n", resp.StatusCode) //输出状态码 body, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } fmt.Println(string(body)) //打印提取结果,这里不需要正则了,因为返回的body只有结果这一行 }
// base64加密 message := *b64decode // 编码消息 encodedMessage := base64.StdEncoding.EncodeToString([]byte(message)) // 输出编码完成的消息 fmt.Println(encodedMessage)
// bse64解密 enmessage := *enb64code // base64解密 data, err := base64.StdEncoding.DecodeString(enmessage) // 出错处理 if err != nil { fmt.Println(err) } else { // 打印解码完成的数据 fmt.Println(string(data)) }
}

打开终端进行测试go run test1.go -h

这里使用一下加密base64字符串。go run test1.go -d 233

再进行一下base64解密操作。go run test1.go -a MjMz

这里看到输出了一个CMD5-ERROR:-4,这是因为这里去请求了MD5解密,在这里加一个设置开关即可。

这里应该分开请求的,使用图形化界面的话,就可以分开,变成模块化的。


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg2MzYzNjEyMg==&mid=2247487049&idx=1&sn=be14586fae72cf3e756e44c6ab640325&chksm=ce74d1bcf90358aac5c9e834b2aa8dbf55ef9d24490ac3fe8d08a4669f51a5ac81e05322b338#rd
如有侵权请联系:admin#unsafe.sh