TLS-evolution(active-scans-drafts/02_postprocessing/02_tls13version_aggregate1(源码解析))

有关active-scans-drafts复现过程,在机器:10.21.238.242,文件夹:/home/k8s/zhenyong/TLS1.3collect/ccr/active-scans-drafts/

有关具体的过程,我当时没有总结,可以借鉴技术,但是我觉得分析TLS的应该没办法用上了。

前言

最近继续做之前的工作,因为前一段时间回家了一趟:D,就空了一段时间,现在想捡起来真的需要很大力气。

我现在只想总结一下每个函数的用途,因为针对前面步骤代码的解析已经很详细了,大多数知识点都已经讲到,以后遗忘的话就去看吧,现在的主要目的是看懂代码在做什么,大体结构看懂,等用的时候再深入看也来的及,我觉得留一点盲点也无可厚非。

aggregate1.go

  • 总结:
    代码整体结构与之前的类似,同样具有互斥的操作以及通道处理数据;
    不同之处,多了很多其它处理,比如:func (s InputSample) to_aggregated() *AggregatedSample函数,是将信息进行整合成AggregatedSample结构。
    除此之外,还对具有相同域名的进行了整合,merge函数就是最好的写照。判断其中的“tls-ver-bitmaps”,full和sh不知道是啥意思,

main函数

定义主要的变量,通过 line_from_stdin,开启协程读入标准输入

通过通道读入,然后反序列化成结构体。

通过定义结构体:

type Worker struct {
	key                  Key
	queue                chan *InputSample
	just_hit_queue_limit bool
	running              bool
	prefix               string
	part                 string
	aggregate            map[string]*AggregatedSample
	close_once           sync.Once
}

来控制整个处理工作,其中的queue表示通道,将反序列化后的结构体:

type InputSample struct {
	Domain    string       `json:"domain"`
	IP        string       `json:"ip"`
	Timestamp time.Time    `json:"timestamp"`
	Error     bool         `json:"error"`
	ErrorMsg  string       `json:"errormsg,omitempty"`
	Version   *VersionInfo `json:"tls,omitempty"`
}

送入通道current_worker.queue <- &sample,通过worker_func做一定处理并写入文件。同时由一个工作管理map来保证互斥处理:

type WorkManager struct {
	lock      sync.RWMutex //读写互斥锁
	workerMap map[Key]*Worker
}

最终处理完成,关闭所有通道。

其中有一些其它的处理方式可以总结一下:

  • 一开始定义了一个信号通道,用于结束程序:
sig_chan := make(chan os.Signal, 1)
signal.Notify(sig_chan, os.Interrupt)

然后判断信号通道读出内容,就结束处理、输入。

worker_func

除掉将异常信息存储起来的函数,还有其它几个主要处理数据的函数,下面一一介绍。

  • 几个函数的包含关系:
aggregate_with_file	------> locked_aggregate_with_file--------> do_aggregate
  • 函数编写的技巧:
    可在函数内编写函数:
	do_aggregate := func(domain string, new_sample *AggregatedSample) {
		old_sample, ok := work.aggregate[domain]
		if ok {
			old_sample.merge(new_sample)
		} else {
			// just store
			work.aggregate[domain] = new_sample
		}
	}

比如上面这个函数,是在worker_func里面的函数。

  • aggregate_with_file
    不太明白filename_lock的作用。好像是表示锁上文件,或者说互斥读写的意思。
    然后里面主要调用了locked_aggregate_with_file,并把最终汇总的结构体赋值给work。

  • locked_aggregate_with_file
    作者将文件分为:filenamefilename_tmpfilename_lock

首先从work.queue通道中读取数据,并调用聚合函数do_aggregate将同一个域中的信息聚合,使用到一个方法就是merge,具体里面的操作还没完全看懂。因为第一次读进来里面

之后新建filename_tmp文件,然后将聚合后的数据写入其中,并压缩。

再之后将filename_tmp改名为filename

再再之后解压filename_tmp文件并反序列化文件,再一次聚合数据,将同一个域中的数据聚合到一块。这样就是最终的输出了。

其中还有to_aggregated方法,将原本的数据进行聚合,聚合成:

type AggregatedSample struct {
	MostRecentSuccess *TimeVersionIP `json:"tls-full,omitempty"`
	MostRecentPartial *TimeVersionIP `json:"tls-SH,omitempty"`
	Bitmaps           Bitmaps        `json:"tls-ver-bitmaps"`
	SeenRefuse        bool           `json:"443_refused"` //可见拒绝
}

type TimeVersionIP struct {
	IP          string       `json:"ip"`
	Timestamp   time.Time    `json:"timestamp"`
	VersionInfo *VersionInfo `json:"tls,omitempty"`
}

方便后面进行处理,具体细节先不深究,里面有一些版本对应的表也还没完全看懂,需要之后进一步看。

涉及到的知识点,我已经在:https://editor.youkuaiyun.com/md/?articleId=108754675 总结了。

tls13version_aggregate1_run.py

python脚本的主要作用就是递归读入压缩文件,并将文件解压缩并调用golang程序将数据标准输入到golang程序,不得不佩服人家的代码功底。

其中涉及到的知识点我已经在:https://editor.youkuaiyun.com/md/?articleId=108725409 中总结了。欢迎学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值