不说废话,直接奔正题。
python版本是python2.7,需要的模块有argparse,easygui,wx。
主界面如下图(非常丑见谅!)
代码如下:
# !coding=gbk
#author:zichen
import wx, os
import easygui
import threading
import argparse
from Queue import Queue
import pinger
class Host_is_alive_Frame(wx.Frame):
def __init__(self):
self.q = Queue()
self.list_values = []
self.count = 0
self.gauge_value = 0
self.sum = 1
wx.Frame.__init__(self, None, -1, "主机存活探测工具".decode("gbk"), size=(600, 400), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX)
panel = wx.Panel(self, -1)
wx.StaticText(panel, -1, "Ping:", pos=(4, 6))
#########设置字体##########
# font = wx.Font(12, wx.DECORATIVE, wx.NORMAL, wx.NORMAL)
# ping_Label.SetFont(font)
#################输入文本框###################
self.basicText = wx.TextCtrl(panel, -1, "127.0.0.1", pos=(35, 4), size=(160, -1))
self.basicText.SetInsertionPoint(0)
############动态改变文本框的内容#################
self.Bind(wx.EVT_TEXT_ENTER, self.bt_value, self.basicText)
###########添加按钮############
self.button_add = wx.Button(panel, -1, "添加".decode("gbk"), pos=(200, 2), size=(40, -1))
self.Bind(wx.EVT_BUTTON, self.On_add_Clik, self.button_add)
self.button_add.SetDefault()
##########加载文件按钮############
self.button_load_file = wx.Button(panel, -1, "加载文件".decode("gbk"), pos=(245, 2), size=(80, -1))
self.Bind(wx.EVT_BUTTON, self.On_load_file_Clik, self.button_load_file)
self.button_load_file.SetDefault()
##############清除按钮#############
self.button_clear = wx.Button(panel, -1, "清除".decode("gbk"), pos=(330, 2), size=(80, -1))
self.Bind(wx.EVT_BUTTON, self.On_clear_Clik, self.button_clear)
self.button_clear.SetDefault()
##############下拉框###############
wx.StaticText(panel, -1, "线程数:".decode("gbk"), pos=(415, 8))
# thread_Label.SetFont(font)
sampleList = ["10", "50", "100", "200", "500"]
self.thread_num = wx.Choice(panel, -1, pos=(460, 4), choices=sampleList)
##############开始按钮##############
self.button_action = wx.Button(panel, -1, "开始探测".decode("gbk"), pos=(515, 2), size=(80, -1))
self.Bind(wx.EVT_BUTTON, self.On_action_Clik, self.button_action)
self.button_action.SetDefault()
#################输入文本框###################
self.multiText1 = wx.TextCtrl(panel, -1, "", pos=(50, 50), size=(200, 270), style=wx.TE_MULTILINE) # 创建一个文本控件
self.multiText1.SetInsertionPoint(1) # 设置插入点
#################输出文本框###################
self.multiText2 = wx.TextCtrl(panel, -1, "", pos=(300, 50), size=(200, 270), style=wx.TE_MULTILINE) # 创建一个文本控件
self.multiText2.SetInsertionPoint(2) # 设置插入点
#################进度条##################
self.gauge_text = wx.StaticText(panel, -1, "进度条:".decode("gbk"), pos=(0, 343))
self.gauge = wx.Gauge(panel, -1, 100, pos=(45, 340), size=(500, 25))
self.gauge.SetBezelFace(3)
self.gauge.SetShadowWidth(3)
self.Bind(wx.EVT_IDLE, self.OnIdle)
self.info = wx.TextCtrl(panel, -1, "0%".decode("gbk"), pos=(550, 345), style=wx.TE_READONLY | wx.TE_MULTILINE | wx.BORDER_NONE | wx.BRUSHSTYLE_TRANSPARENT)
self.info.SetBackgroundColour(panel.BackgroundColour)
# 进度条函数
def OnIdle(self, event):
self.gauge_value = self.count * 100 / self.sum
print "self.gauge_value:" + str(self.gauge_value)
self.gauge.SetValue(self.gauge_value)
# self.gauge.Update()
self.info.SetValue(str(self.gauge_value) + "%")
# self.info.Update()
# 添加按钮函数
def On_add_Clik(self, event):
self.button_add.SetLabel("添加".decode("gbk"))
#######队列去重#######
if self.bt_value() not in self.list_values:
self.list_values.append(self.bt_value())
if self.multiText1.GetValue() == "":
self.multiText1.SetValue(self.bt_value())
else:
self.multiText1.AppendText("\n" + self.bt_value())
else:
# 消息对话框
dlg = wx.MessageDialog(None, '输入的内容有重复的值,已自动去重'.decode("gbk"), '警告'.decode("gbk"), wx.OK | wx.ICON_QUESTION)
dlg.ShowModal()
dlg.Destroy()
# 加载文件按钮函数
def On_load_file_Clik(self, event):
self.button_load_file.SetLabel("加载文件".decode("gbk"))
file_path = easygui.fileopenbox(default='*.txt')
with open(file_path) as old_file:
os.path.basename(file_path)
text = old_file.read()
if "\r" in text:
temp_lists = (text.split("\r"))
elif "\n" in text:
temp_lists = (text.split("\n"))
else:
pass
for temp_list in temp_lists:
if temp_list not in self.list_values:
self.list_values.append(temp_list)
if self.multiText1.GetValue() == "":
self.multiText1.SetValue(temp_list)
else:
self.multiText1.AppendText("\n" + temp_list)
else:
# 消息对话框
dlg = wx.MessageDialog(None, '输入的内容有重复的值,已自动去重'.decode("gbk"), '警告'.decode("gbk"), wx.OK | wx.ICON_QUESTION)
dlg.ShowModal()
dlg.Destroy()
# 清除文本框1的函数
def On_clear_Clik(self, event):
self.multiText1.Clear()
self.list_values = []
self.count = 0
# 执行探测函数
def On_action_Clik(self, event):
self.button_action.SetLabel("开始探测".decode("gbk"))
# 清除文本框2
self.multiText2.Clear()
thread_nums = self.thread_num.GetStringSelection()
for list_value in self.list_values:
self.q.put(str(list_value))
# 开始多线程
if thread_nums == "":
thread_nums = "10"
dlg = wx.MessageDialog(None, '已将线程数默认设置成10'.decode("gbk"), '警告'.decode("gbk"), wx.OK | wx.ICON_QUESTION)
dlg.ShowModal()
dlg.Destroy()
threads = []
for thread_num in range(0, int(thread_nums)):
threads.append(threading.Thread(target=self.thread_ping, args=(thread_num,)))
for thread in threads:
thread.start()
# 多线程函数
def thread_ping(self, num):
while True:
if not self.q.empty():
str_value = self.q.get()
self.sum = len(self.list_values)
self.count = self.count + 1
"""执行ping命令
ping_echo = os.popen("ping " + str_value + " -n 1")
content = ping_echo.read()
if "TTL" in content:
print str_value
if self.multiText2.GetValue()=="":
self.multiText2.SetValue(str_value)
else:
self.multiText2.AppendText("\r" + str_value)"""
# stock编程 使用了s0nnet编写的程序
parser = argparse.ArgumentParser(description='Python ping')
parser.add_argument('--target-host', action="store", dest="target_host", required=True)
given_args = '--target-host'
target_host = str_value
pinger_value = pinger.Pinger(target_host=target_host)
flag = pinger_value.ping()
if True == flag:
if self.multiText2.GetValue() == "":
self.multiText2.SetValue(str_value)
self.multiText2.Update()
else:
self.multiText2.AppendText("\r" + str_value)
self.multiText2.Update()
continue
# panel.Update()
break
# 返回输入框的值
def bt_value(self):
return self.basicText.GetValue()
if __name__ == '__main__':
app = wx.App(False)
frame = Host_is_alive_Frame()
frame.Show()
app.MainLoop()
pinger的程序是采用的GitHub 的s0nnet写icmp stock编程链接如下(这里感谢一下s0nnet):
https://github.com/Lingerhk/hacking_script/blob/master/net_attacking/icmp_ping_tool.py
有部分地方改动了一下:
ICMP_ECHO_REQUEST = 8 # Platform specific
DEFAULT_TIMEOUT = 0.3
DEFAULT_COUNT = 1
def ping(self):
"""
Run the ping process
"""
for i in xrange(self.count):
# print "Ping to %s..." % self.target_host,
try:
delay = self.ping_once()
except socket.gaierror, e:
# print "Ping failed. (socket error: '%s')" % e[1]
return False
break
if delay == None:
# print "Ping failed. (timeout within %ssec.)" % self.timeout
return False
else:
# 输出主机存活的信息
# delay = delay * 1000
# print "Get pong in %0.4fms" % delay
return True
wx,光是界面的调整就浪费了我很多时间,我接下来就不会深入的学习wx,如果有人对wx感兴趣的话,可以查看wx的中文文档,下载链接如下: