前段时间结合zoomeye的开发文档做了个简易的信息搜集工具ThunderSearch【项目地址 / 博客地址】,这次来讲讲具体的实现原理和开发思路

首先要能看懂开发文档,https://www.zoomeye.org/doc#user,上面介绍了一些api的使用。我们只需要调用我们想要的api就可以获取到想要的数据。

1. 登陆

根据文档,登陆方式分为两种,api-key账号/密码,我这里使用了账号密码登陆的方式,主要是获取api-key需要登陆到网页比较麻烦。登陆的目的是为了拿到access-token,在后期的api调用过程中需要将其作为请求头发送。我们先来看access-token的获取。

文档中使用curl制造http请求,在python中可以使用requests

import requests
import json
url = "https://api.zoomeye.org/user/login"
login_info = {
"username" : "xxxxx",
"password" : "xxxxx"
}
encoded_data = json.dumps(login_info)
resp = requests.post(url,encoded_data)
access_token = resp.json()['access_token']
print(access_token)

这里需要注意的是发送的data数据必须是json格式,因此需要把字典格式的info进行一个转化

再通过resp.jgon()['access_token']就能拿到token数据了。

在这个token前加上JWT(空格)作为Authorization提交。

headers = {
'Authorization':'JWT ' + access_token
}

2.调用api

以主机设备搜索为例

请求的url为https://api.zoomeye.org/host/search,请求方式为GET,四个参数中query(查询语句)为必填项

那么就可以创造如下函数

def host_search(query, page):       # 主机设备搜索
url = f'https://api.zoomeye.org/host/search?query={query}&page={page}&sub_type=v4&facets=app,os'
matches = requests.get(url, headers=headers).json()

文档中提供的返回json数据样例如下:(在上面的例子中就是matches)

{ "matches": [ {
"geoinfo": {
"asn": 45261,
"city": {
"names": {
"en": "Brisbane",
"zh-CN": "\u5e03\u91cc\u65af\u73ed"
}
},
"continent": {
"code": "OC",
"names": {
"en": "Oceania",
"zh-CN": "\u5927\u6d0b\u6d32"
}
},
"country": {
"code": "AU",
"names": {
"en": "Australia",
"zh-CN": "\u6fb3\u5927\u5229\u4e9a"
}
},
"location": {
"lat": -27.471,
"lon": 153.0243
}
},
"ip": "192.168.1.1",
"portinfo": {
"app": "",
"banner": "+OK Hello there.\r\n-ERR Invalid command.\r\n\n",
"device": "",
"extrainfo": "",
"hostname": "",
"os": "",
"port": 110,
"service": "",
"version": ""
},
"timestamp": "2016-03-09T16:14:04"
}, ... ...],
"facets": {
},
"total": 28731397
}

按照如下方式就可以拿到数据了

for each in matches['matches']:
ip = each['ip']
port = each['portinfo']['port']
country = each['geoinfo']['country']['names']['en']
os = each['portinfo']['os']
hostname = each['portinfo']['hostname']


3. 图形化

这里主要使用到了tkinter。按照如下通过面向对象的方式就能建立一个基础的GUI界面

from tkinter import *
class Application(Frame):
def __init__(self,master):
super().__init__(master)
self.master=master
self.createWidget()
self.pack() def createWidget(self):
pass if __name__=="__main__":
root = Tk()
root.title("TEST")
root.geometry('400x300+200+100')
Application(root)
root.mainloop()

4. 整合

结合多线程并发技术,最终能够实现ThunderSearch这样一个小公举


5. 总结

整体难度并不大,主要是GUI库tkinter的使用和读懂api开发文档、结合多线程并发的综合练习。

另外在tkinter的开发中遇到了一个问题,mainloop事件中的任何一个循环都要等待其结束之后主组件才会进行刷新,刷新前会一直卡住呈现假死状态。查遍S.O.,基本方法有每执行一次循环刷新界面,或者使用master等,但不能很好的解决问题,尤其是在复杂的多线程的多个循环同时执行的情况下就不好用了。

我这里是开了一个守护子线程去跑每个模块,这样和组件的mainloop事件就不冲突了,也能很好的上线程池。但总觉得有些不太好,希望有哪位懂的师傅能指点一下。

【自写信息搜集工具】ThunderSearch开发原理解析的更多相关文章

  1. 用Golang写的域名信息搜集工具

    blacksheepwall是一款由Go语言编写的域名信息搜集工具 ,你也可以在你的工具中将它作为一个独立软件包来使用. 下载 blacksheepwall支持跨平台,目前它所支持的系统有window ...

  2. 领英Linkedin信息搜集工具InSpy

    领英Linkedin信息搜集工具InSpy   领英Linkedin是一个知名职业社交媒体网站.通过该网站,渗透测试人员可以获取公司内部组成和员工信息.Kali Linux提供一款专用的信息收集工具I ...

  3. Tweet信息搜集工具tinfoleak

    Tweet信息搜集工具tinfoleak   推特是国外用户常用的社交网站.通过分析用户发布的推文以及社交活动,可以获取大量的个人信息.Kali Linux新增一款Tweet信息搜索工具tinfole ...

  4. 2018-2019-2 网络对抗技术 20165212 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165212 Exp6 信息搜集与漏洞扫描 原理与实践说明 1.实践原理 信息搜集:渗透测试中首先要做的重要事项之一,搜集关于目标机器的一切信息 间接收集 D ...

  5. 2018-2019-2 网络对抗技术 20165304 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165304 Exp6 信息搜集与漏洞扫描 原理与实践说明 1.实践原理 信息搜集:渗透测试中首先要做的重要事项之一,搜集关于目标机器的一切信息 间接收集 D ...

  6. 2018-2019-2 网络对抗技术 20165318 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165318 Exp6 信息搜集与漏洞扫描 原理与实践说明 实践原理 实践内容概述 基础问题回答 实践过程记录 各种搜索技巧的应用 DNS IP注册信息的查询 ...

  7. 20155308《网络对抗》Exp6 信息搜集与漏洞扫描

    20155308<网络对抗>Exp6 信息搜集与漏洞扫描 原理与实践说明 实践内容 本实践的目标是掌握信息搜集的最基础技能.具体有: 各种搜索技巧的应用 DNS IP注册信息的查询 基本的 ...

  8. 网络数据包信息收集工具ferret-sidejack

    网络数据包信息收集工具ferret-sidejack   网络数据包传递用户的各种操作和对应的信息.但是由于各种数据混在一起,不利于渗透测试人员分析.Kali Linux提供了一款信息搜集工具ferr ...

  9. 2018-2019-2 《网络对抗技术》Exp6 信息搜集与漏洞扫描 Week9 20165233

    Exp6 信息搜集与漏洞扫描 目录 一.基础问题 二.实验步骤 实验点一:各种搜索技巧的应用 实验点二:DNS IP注册信息的查询 实验点三:基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具 ...

随机推荐

  1. 【LeetCode】215. Kth Largest Element in an Array 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:移除最大值 方法二:排序 方法三:大顶堆 方 ...

  2. EXCEL技能 | EXCEL中实现地图快照,截大图、加水印、保存PNG、TIF、HTML文件

    1 应用场景 本文分享笔者使用EXCEL制作地图的体验. 之前网上有人介绍使用小O地图EXCEL插件版能够在EXCEL中标注地图.绘制地图.可视化数据等操作.如下截图.笔者通过实验,其软件保存方式只能 ...

  3. Certified Robustness to Adversarial Examples with Differential Privacy

    目录 概 主要内容 Differential Privacy insensitivity Lemma1 Proposition1 如何令网络为-DP in practice Lecuyer M, At ...

  4. <学习opencv>opencv数据类型

    目录 Opencv数据类型: 基础类型概述 固定向量类class cv::Vec<> 固定矩阵类cv::Matx<> 点类 Point class cv::Scalar 深入了 ...

  5. 编写Java程序_连锁超市购物结算系统

    目录 功能需求: 一.Use Case 1 显示商品信息列表: 二.Use Case 2 输入购买商品编号 三.Use Case 3 显示购物结算清单 需求分级: 实现代码: 功能需求: Soft f ...

  6. 面试中问你MySql,这一篇就够了

    说一说主键索引与唯一索引 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键索引默认是聚簇索引.唯一索引一般是非聚簇索引. 主键索引不能为空,唯一索引在InnoDB中可以出现多个null ...

  7. AWS 15年(2):云原生兴起

    AWS创立云计算15年来,没有一个行业不跟云计算相关,没有任何一个颠覆性创新缺少云计算的参与,云已经是不可逆的滚滚洪流. AWS这15年,是云原生服务从无到有再到基本成熟的15年,是云原生应用兴起的1 ...

  8. Linux操作系统RedHat6.5安装

    1.说明 安装Linux操作系统Red Hat 6.5, 安装镜像为rhel-server-6.5-x86_64-dvd.iso. 2.开始安装 在BIOS里设置成从光驱启动, 服务器上电后会加载光驱 ...

  9. Hbase单点安装Version1.1.5

    Hbase单点安装,基于版本1.1.5, 使用hbase-1.1.5.tar.gz安装包. 1.安装说明 使用Hbase自带zookeeper和本地文件目录存储数据 2.安装规划 角色规划 IP/机器 ...

  10. sqlsugar freesql hisql 三个ORM框架性能测试对比

    hisql与目前比较流行的ORM框架性能测试对比 总体测试结果 插入记录数 hisql(耗时) sqlsugar(耗时) freesql(耗时) 5条 0.0107秒 0.0312秒 0.02675秒 ...