golang MalShare API 集成与分析插件库gomalshare的使用

Golang MalShare API 集成与分析插件库gomalshare的使用

MalShare客户端库

MalShare是一个免费的恶意软件存储库,为研究人员提供样本、恶意订阅源和Yara结果访问。

使用示例

安装

go get -u github.com/MonaxGT/gomalshare

测试

go test -api APIKEY -url URL

完整示例代码

package main

import (
	"flag"
	"fmt"

	"github.com/MonaxGT/gomalshare"
)

func main() {
	apiKeyPtr := flag.String("api", "", "API key MalShare") // 定义API key参数
	urlPtr := flag.String("url", "", "URL MalShare")        // 定义URL参数
	flag.Parse()
	var err error
	var conf *gomalshare.Client

	// 初始化函数
	conf, err = gomalshare.New(*apiKeyPtr, *urlPtr) // 初始化与API的新连接
	if err != nil {
		panic(err)
	}

	// 示例:获取过去24小时的哈希列表
	var list24 *[]gomalshare.HashList
	list24, _ = conf.GetListOfHash24()
	fmt.Println(list24)

	// 示例:获取过去24小时下载文件的类型列表
	typeCount, _ := conf.GetListOfTypesFile24()
	fmt.Println(typeCount)

	// 示例:获取当前API key的限制
	var limitKey *gomalshare.LimitKey
	limitKey, _ = conf.GetLimitKey()
	fmt.Println(limitKey)

	// 示例:通过样本返回文件信息
	var search *[]gomalshare.SearchDetails
	search, err = conf.GetSearchResult("emotet")
	if err != nil {
		fmt.Println(err)
	}
	for _, v := range *search {
		fmt.Println(v.Md5)
	}
	
	// 示例:上传文件
	filename := "test.test"
	err = conf.UploadFile(filename)
	if err != nil {
		fmt.Println(err)
	}

	// 示例:通过哈希请求下载文件
	file, err := conf.DownloadFileFromHash("95bc3d64f49b03749427fcd6601fa8a7")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(string(file))
}

这个示例展示了如何使用gomalshare库与MalShare API进行交互,包括:

  1. 初始化API连接
  2. 获取24小时内的哈希列表
  3. 获取文件类型统计
  4. 检查API key限制
  5. 搜索特定恶意软件样本
  6. 上传文件
  7. 通过哈希下载文件

每个功能都有清晰的注释说明,便于理解和使用。


更多关于golang MalShare API 集成与分析插件库gomalshare的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang MalShare API 集成与分析插件库gomalshare的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang MalShare API 集成与分析插件库 gomalshare 使用指南

MalShare 是一个公开的恶意软件样本共享平台,而 gomalshare 是一个用于与 MalShare API 交互的 Golang 库。下面我将详细介绍如何使用这个库进行 MalShare API 集成与分析。

安装 gomalshare

首先,你需要安装 gomalshare 库:

go get github.com/signedsecurity/gomalshare

基本使用示例

1. 初始化客户端

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/signedsecurity/gomalshare"
)

func main() {
	// 从环境变量获取 API 密钥
	apiKey := os.Getenv("MALSHARE_API_KEY")
	if apiKey == "" {
		log.Fatal("MALSHARE_API_KEY environment variable not set")
	}

	// 创建 MalShare 客户端
	client := gomalshare.NewClient(apiKey)
	
	// 使用客户端进行操作...
}

2. 获取最近上传的样本列表

func listRecentSamples(client *gomalshare.Client) {
	samples, err := client.GetList(24) // 获取最近24小时的样本
	if err != nil {
		log.Fatalf("Error getting recent samples: %v", err)
	}

	fmt.Println("Recently uploaded samples:")
	for _, sample := range samples {
		fmt.Printf("SHA256: %s, First Seen: %s\n", sample.Sha256, sample.FirstSeen)
	}
}

3. 下载样本

func downloadSample(client *gomalshare.Client, hash string) {
	data, err := client.GetFile(hash)
	if err != nil {
		log.Fatalf("Error downloading sample: %v", err)
	}

	// 保存到文件
	filename := fmt.Sprintf("%s.bin", hash)
	err = os.WriteFile(filename, data, 0644)
	if err != nil {
		log.Fatalf("Error saving file: %v", err)
	}

	fmt.Printf("Sample saved to %s\n", filename)
}

4. 获取样本详情

func getSampleDetails(client *gomalshare.Client, hash string) {
	details, err := client.GetDetails(hash)
	if err != nil {
		log.Fatalf("Error getting sample details: %v", err)
	}

	fmt.Printf("Sample Details for %s:\n", hash)
	fmt.Printf("MD5: %s\n", details.MD5)
	fmt.Printf("SHA1: %s\n", details.SHA1)
	fmt.Printf("SHA256: %s\n", details.SHA256)
	fmt.Printf("First Seen: %s\n", details.FirstSeen)
	fmt.Printf("File Type: %s\n", details.FileType)
	fmt.Printf("File Size: %d bytes\n", details.FileSize)
}

5. 搜索样本

func searchSamples(client *gomalshare.Client, query string) {
	results, err := client.Search(query)
	if err != nil {
		log.Fatalf("Error searching samples: %v", err)
	}

	fmt.Printf("Search results for '%s':\n", query)
	for _, result := range results {
		fmt.Printf("- %s (%s)\n", result.Sha256, result.FileType)
	}
}

完整示例程序

下面是一个完整的示例程序,展示了 gomalshare 的主要功能:

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/signedsecurity/gomalshare"
)

func main() {
	apiKey := os.Getenv("MALSHARE_API_KEY")
	if apiKey == "" {
		log.Fatal("MALSHARE_API_KEY environment variable not set")
	}

	client := gomalshare.NewClient(apiKey)

	// 1. 获取最近上传的样本
	fmt.Println("Fetching recent samples...")
	samples, err := client.GetList(24) // 最近24小时
	if err != nil {
		log.Fatalf("Error getting recent samples: %v", err)
	}

	if len(samples) == 0 {
		fmt.Println("No recent samples found")
		return
	}

	// 2. 显示第一个样本的详细信息
	firstSample := samples[0]
	fmt.Printf("\nDetails for first sample (SHA256: %s):\n", firstSample.Sha256)
	details, err := client.GetDetails(firstSample.Sha256)
	if err != nil {
		log.Printf("Warning: could not get details for sample: %v", err)
	} else {
		fmt.Printf("MD5: %s\n", details.MD5)
		fmt.Printf("SHA1: %s\n", details.SHA1)
		fmt.Printf("File Type: %s\n", details.FileType)
		fmt.Printf("Size: %d bytes\n", details.FileSize)
		fmt.Printf("First Seen: %s\n", details.FirstSeen)
	}

	// 3. 搜索样本 (示例)
	fmt.Println("\nSearching for 'exe' samples...")
	searchResults, err := client.Search("exe")
	if err != nil {
		log.Printf("Warning: search failed: %v", err)
	} else {
		fmt.Printf("Found %d EXE samples\n", len(searchResults))
		if len(searchResults) > 0 {
			fmt.Printf("First result: %s\n", searchResults[0].Sha256)
		}
	}

	// 4. 下载样本 (示例,实际使用需谨慎)
	/*
	fmt.Println("\nDownloading sample (commented out for safety)...")
	// 取消下面的注释来实际下载样本
	// data, err := client.GetFile(firstSample.Sha256)
	// if err != nil {
	// 	log.Fatalf("Download failed: %v", err)
	// }
	// fmt.Printf("Downloaded %d bytes\n", len(data))
	*/
}

注意事项

  1. API 限制:MalShare API 有请求限制,请遵守他们的使用条款。

  2. 安全处理:下载的恶意软件样本应在隔离环境中处理,避免意外执行。

  3. API 密钥保护:不要将 API 密钥硬编码在代码中,使用环境变量或安全的配置管理系统。

  4. 错误处理:始终检查 API 调用返回的错误,MalShare API 可能会因各种原因拒绝请求。

  5. 样本分析:下载样本后,可以结合其他工具如 YARA、VirusTotal API 等进行进一步分析。

gomalshare 库提供了与 MalShare API 交互的便捷方式,使得在 Golang 程序中集成恶意软件分析功能变得更加简单。根据你的具体需求,你可以扩展上述示例来构建更复杂的恶意软件分析工具。

回到顶部