Что ж, вот и пришла пора третьей части статьи о сборе информации. Первая и вторая часть здесь по ссылкам.
Но, сегодня мы дополним сборщик совсем незначительно. Добавим в него функцию сканирования портов для того, чтобы найти открытые и определить, какие службы на них работают. Это поможет собрать еще более полную картину о компьютере. И цель все та же – информация. Чем ее больше, тем больше полнота картины об объекте.
Давайте приступим к написанию кода и дополнения сборщика.
Что понадобиться?
Устанавливать сторонние библиотеки на этот раз не будет необходимости. Мы обойдемся тем, что имеем, а именно библиотеками, которые устанавливаются вместе с питоном. Это socket, threading и time. Первая библиотека нужна для того, чтобы отправлять запросы на порты и получать от них ответы. Вторая для того, чтобы делать отправку запросов в многопоточном режиме и третья для создания небольшой паузы при сканировании. Так как слишком агрессивное сканирование тоже не особо хорошо. Ну и time немного притормозит потоки, что позволит выводиться сообщениям в терминале в более-менее упорядоченном виде. Давайте импортируем необходимые библиотеки.
Теперь создадим список вне функций, по сути, сделав его глобальным и доступным из каждой функции. В него мы будем записывать найденные открытые порты, которые далее будут записаны в текстовый файл.
Создадим функцию portscanner(port, target, src), которая будет принимать три значения. Это порт, цель, то есть адрес, который нужно будет сканировать, а точнее локальный IP. И словарь с портами и их расшифровкой. В данной функции он нужен будет для подстановки значения найденным портам. Далее, в самой функции создаем объект сокета. Устанавливаем небольшую паузу между отправкой запросов. И далее оборачиваем в try – except код, в котором будут отправляться запросы на тот случай, если вдруг произойдет сбой. В этом случае программа просто продолжит свою работу. Закрываем соединение. Затем выводим в терминал и добавляем в список порт и его расшифровку. А в случае срабатывания исключения выводим сообщение, что порт не распознан. И пауза в одну секунду, перед выходом из функции.
А теперь давайте напишем небольшую функцию по запуску потоков для сканирования портов. Назовем ее thread_func(src). На входе она будет получать тот же самый словарь, который использовался в предыдущей функции, но уже для того, чтобы по списку портов в нем запускать сканирование в потоках.
Для того, чтобы просканировать порты на компьютере, надо получить ip-адрес сетевого интерфейса по умолчанию. И если в Windows это делается довольно несложно, то во для Linux, тот же самый код выводит адрес 127.0.0.1. То есть, изначально была задумка получить адрес с помощью socket.gethostbyname(socket.gethostname()). Но, не получилось. Пришлось нагородить небольшой огород с помощью тех же сокетов. И для того, чтобы определить ip, отправить запрос на широковещательный адрес. Но, зато этот код отлично возвращает нужное значение адреса как в Linux, так и в Windows.
Далее бежим по словарю с портами и передаем их значения в поток для запуска сканирования. Сам по себе поток ничего не выполняет. В только выполняется код, который и осуществляет нужные действия. Поэтому, в потоке, в данном случае, будет запускаться сканирование одного порта. Как только сканирование завершено, поток прекращает свою работу.
А теперь осталось дополнить функцию main().
После того, как будет получена информация о машине, открывается словарь с портами и расшифровкой. Запускается функция запуска потоков, в которую передается открытый словарь. И на завершающем этапе записываем полученные порты из списка в текстовый файл.
А на этом, пожалуй, все. На данном этапе сканер уже приобретает некоторый функционал, который даже можно использовать при желании. У меня даже появилась мысль перенести функции в отдельный модуль, так как основной модуль скрипта становиться перегружен функциями, особенно такими монструозными, как у меня.
Словарь с портами можно дополнить. Я знаю, что он далеко не полон, так как добавил в него только те порты, которые мне удалось найти и которые описывают на разных сайтах как наиболее часто сканируемые. Так что, тут есть простор для творчества. Или можно создать словарь прямо в коде, если вам требуется сканировать небольшое количество портов, чтобы не подгружать лишние файлы.
А это результат сканирования Windows:
В Linux, а я использовал для теста Kali, все немного печальнее. Там сканер не нашел ни одного порта. Но, тут надо полагать, что у Kali портов открытых и должно быть меньше по умолчанию. Хотя, я пробовал выставить диапазон вплоть до 1000-го порта. Но, открытых сканер так и не нашел.
Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезна
Но, сегодня мы дополним сборщик совсем незначительно. Добавим в него функцию сканирования портов для того, чтобы найти открытые и определить, какие службы на них работают. Это поможет собрать еще более полную картину о компьютере. И цель все та же – информация. Чем ее больше, тем больше полнота картины об объекте.
Давайте приступим к написанию кода и дополнения сборщика.
Что понадобиться?
Устанавливать сторонние библиотеки на этот раз не будет необходимости. Мы обойдемся тем, что имеем, а именно библиотеками, которые устанавливаются вместе с питоном. Это socket, threading и time. Первая библиотека нужна для того, чтобы отправлять запросы на порты и получать от них ответы. Вторая для того, чтобы делать отправку запросов в многопоточном режиме и третья для создания небольшой паузы при сканировании. Так как слишком агрессивное сканирование тоже не особо хорошо. Ну и time немного притормозит потоки, что позволит выводиться сообщениям в терминале в более-менее упорядоченном виде. Давайте импортируем необходимые библиотеки.
Python:
import socket
import time
import threading
Теперь создадим список вне функций, по сути, сделав его глобальным и доступным из каждой функции. В него мы будем записывать найденные открытые порты, которые далее будут записаны в текстовый файл.
port_list = []
Создадим функцию portscanner(port, target, src), которая будет принимать три значения. Это порт, цель, то есть адрес, который нужно будет сканировать, а точнее локальный IP. И словарь с портами и их расшифровкой. В данной функции он нужен будет для подстановки значения найденным портам. Далее, в самой функции создаем объект сокета. Устанавливаем небольшую паузу между отправкой запросов. И далее оборачиваем в try – except код, в котором будут отправляться запросы на тот случай, если вдруг произойдет сбой. В этом случае программа просто продолжит свою работу. Закрываем соединение. Затем выводим в терминал и добавляем в список порт и его расшифровку. А в случае срабатывания исключения выводим сообщение, что порт не распознан. И пауза в одну секунду, перед выходом из функции.
Python:
def portscanner(port, target, src):
s = socket.socket()
s.settimeout(0.5)
try:
s.connect((target, port))
except socket.error:
pass
else:
s.close()
try:
print(f'Открыт порт: {port}/{src[str(port)]}')
port_list.append(f'{port}/{src[str(port)]}')
except:
print(f'Открыт порт: {port}/Unassigned')
time.sleep(1)
А теперь давайте напишем небольшую функцию по запуску потоков для сканирования портов. Назовем ее thread_func(src). На входе она будет получать тот же самый словарь, который использовался в предыдущей функции, но уже для того, чтобы по списку портов в нем запускать сканирование в потоках.
Для того, чтобы просканировать порты на компьютере, надо получить ip-адрес сетевого интерфейса по умолчанию. И если в Windows это делается довольно несложно, то во для Linux, тот же самый код выводит адрес 127.0.0.1. То есть, изначально была задумка получить адрес с помощью socket.gethostbyname(socket.gethostname()). Но, не получилось. Пришлось нагородить небольшой огород с помощью тех же сокетов. И для того, чтобы определить ip, отправить запрос на широковещательный адрес. Но, зато этот код отлично возвращает нужное значение адреса как в Linux, так и в Windows.
Python:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.connect(('<broadcast>', 0))
ip = s.getsockname()[0]
Далее бежим по словарю с портами и передаем их значения в поток для запуска сканирования. Сам по себе поток ничего не выполняет. В только выполняется код, который и осуществляет нужные действия. Поэтому, в потоке, в данном случае, будет запускаться сканирование одного порта. Как только сканирование завершено, поток прекращает свою работу.
Python:
def thread_func(src):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.connect(('<broadcast>', 0))
ip = s.getsockname()[0]
for port in src:
t = threading.Thread(target=portscanner, kwargs={'port': int(port), 'target': ip, 'src': src})
t.start()
А теперь осталось дополнить функцию main().
Python:
def main():
if uname().system == "Windows":
dict_info = creating_file()
dict_info_dop = win_dop_info(dict_info)
with open(f'{uname().node}_info.json', 'w', encoding='utf-8') as file:
json.dump(dict_info_dop, file, indent=4, ensure_ascii=False)
print_info(dict_info)
print_dop_info(dict_info_dop)
elif uname().system == "Linux":
dict_info = creating_file()
with open(f'{uname().node}_info.json', 'w', encoding='utf-8') as file:
json.dump(dict_info, file, indent=4, ensure_ascii=False)
print_info(dict_info)
try:
with open('ps_dict.json', 'r', encoding='utf-8') as file:
src = json.load(file)
except:
src = list(range(1, 1001))
print(f'\n[+] Открытые порты\n{"-"*33}')
thread_func(src)
if len(port_list) > 0:
with open(f'{uname().node}_open_port.txt', 'w') as file:
for port in port_list:
file.write(f'{port}\n')
После того, как будет получена информация о машине, открывается словарь с портами и расшифровкой. Запускается функция запуска потоков, в которую передается открытый словарь. И на завершающем этапе записываем полученные порты из списка в текстовый файл.
А на этом, пожалуй, все. На данном этапе сканер уже приобретает некоторый функционал, который даже можно использовать при желании. У меня даже появилась мысль перенести функции в отдельный модуль, так как основной модуль скрипта становиться перегружен функциями, особенно такими монструозными, как у меня.
Словарь с портами можно дополнить. Я знаю, что он далеко не полон, так как добавил в него только те порты, которые мне удалось найти и которые описывают на разных сайтах как наиболее часто сканируемые. Так что, тут есть простор для творчества. Или можно создать словарь прямо в коде, если вам требуется сканировать небольшое количество портов, чтобы не подгружать лишние файлы.
А это результат сканирования Windows:
В Linux, а я использовал для теста Kali, все немного печальнее. Там сканер не нашел ни одного порта. Но, тут надо полагать, что у Kali портов открытых и должно быть меньше по умолчанию. Хотя, я пробовал выставить диапазон вплоть до 1000-го порта. Но, открытых сканер так и не нашел.
Python:
import json
import subprocess
import psutil
from platform import uname
import socket
import time
import threading
port_list = []
def portscanner(port, target, src):
s = socket.socket()
s.settimeout(0.5)
try:
s.connect((target, port))
except socket.error:
pass
else:
s.close()
try:
print(f'Открыт порт: {port}/{src[str(port)]}')
port_list.append(f'{port}/{src[str(port)]}')
except:
print(f'Открыт порт: {port}/Unassigned')
time.sleep(1)
def thread_func(src):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.connect(('<broadcast>', 0))
ip = s.getsockname()[0]
for port in src:
t = threading.Thread(target=portscanner, kwargs={'port': int(port), 'target': ip, 'src': src})
t.start()
def get_syze(bts, ending='iB'):
size = 1024
for item in ["", "K", "M", "G", "T", "P"]:
if bts < size:
return f"{bts:.2f}{item}{ending}"
bts /= size
def creating_file():
collect_info_dict = dict()
if 'info' not in collect_info_dict:
collect_info_dict['info'] = dict()
collect_info_dict['info']['system_info'] = dict()
collect_info_dict['info']['system_info'] = {'system': {'comp_name': uname().node,
'os_name': f"{uname().system} {uname().release}",
'version': uname().version,
'machine': uname().machine},
'processor': {'name': uname().processor,
'phisycal_core': psutil.cpu_count(logical=False),
'all_core': psutil.cpu_count(logical=True),
'freq_max': f"{psutil.cpu_freq().max:.2f}Мгц"},
'ram': {'volume': get_syze(psutil.virtual_memory().total),
'aviable': get_syze(psutil.virtual_memory().available),
'used': get_syze(psutil.virtual_memory().used)}}
for partition in psutil.disk_partitions():
try:
partition_usage = psutil.disk_usage(partition.mountpoint)
except PermissionError:
continue
if 'disk_info' not in collect_info_dict['info']:
collect_info_dict['info']['disk_info'] = dict()
if f"'device': {partition.device}" not in collect_info_dict['info']['disk_info']:
collect_info_dict['info']['disk_info'][partition.device] = dict()
collect_info_dict['info']['disk_info'][partition.device] = {'file_system': partition.fstype,
'size_total': get_syze(
partition_usage.total),
'size_used': get_syze(
partition_usage.used),
'size_free': get_syze(
partition_usage.free),
'percent':
f'{partition_usage.percent}'}
for interface_name, interface_address in psutil.net_if_addrs().items():
if interface_name == 'Loopback Pseudo-Interface 1':
continue
else:
if 'net_info' not in collect_info_dict['info']:
collect_info_dict['info']['net_info'] = dict()
if interface_name not in collect_info_dict['info']['net_info']:
collect_info_dict['info']['net_info'][interface_name] = dict()
collect_info_dict['info']['net_info'][interface_name] = {
'mac': interface_address[0].address.replace("-", ":"),
'ipv4': interface_address[1].address,
'ipv6': interface_address[2].address}
return collect_info_dict
def win_dop_info(dict_info):
import windows_tools.product_key
# motherboard
man_moth_com = 'WMIC BASEBOARD GET Manufacturer /VALUE'.split()
manufacturer = str(subprocess.check_output(man_moth_com, shell=True)).split("\\n")[2].replace("\\r", "").\
split("=")[1]
prod_com = 'WMIC BASEBOARD GET Product /VALUE'.split()
product = str(subprocess.check_output(prod_com, shell=True)).split("\\n")[2].split("\\r")[0].split("=")[1]
# bios
verb_com = 'WMIC BIOS GET Version /VALUE'.split()
version_bios = str(subprocess.check_output(verb_com, shell=True)).split("\\n")[2].split("\\r")[0].split("=")[1]
man_bios_com = 'WMIC BIOS GET Manufacturer /VALUE'.split()
manufacturer_bios = str(subprocess.check_output(man_bios_com, shell=True)).split("\\n")[2].split("\\r")[0].\
split("=")[1]
sn_bios_com = 'WMIC BIOS GET SerialNumber /VALUE'.split()
serial_num_bios = str(subprocess.check_output(sn_bios_com, shell=True)).split("\\n")[2].split("\\r")[0].\
split("=")[1]
dv_bios_com = 'WMIC BIOS GET Description /VALUE'.split()
date_version_bios = str(subprocess.check_output(dv_bios_com, shell=True)).split("\\n")[2].split("\\r")[0].\
split("=")[1]
smbios_com = 'WMIC BIOS GET SMBIOSBIOSVersion /VALUE'.split()
smbios_ver = str(subprocess.check_output(smbios_com, shell=True)).split("\\n")[2].split("\\r")[0].split("=")[1]
# boot configuration
boot_dir_com = 'WMIC BOOTCONFIG GET BootDirectory /VALUE'.split()
boot_directory = str(subprocess.check_output(boot_dir_com, shell=True)).split("\\n")[2].split("\\r")[0].\
split("=")[1]
lastd_com = 'WMIC BOOTCONFIG GET LastDrive /VALUE'.split()
last_drive = str(subprocess.check_output(lastd_com, shell=True)).split("\\n")[2].split("\\r")[0].split("=")[1]
# processor info
proc_name_com = 'WMIC CPU GET Name /VALUE'.split()
processor_name = str(subprocess.check_output(proc_name_com, shell=True)).split("\\n")[2].\
split("\\r")[0].split("=")[1]
proc_id_com = 'WMIC CPU GET ProcessorId /VALUE'.split()
processor_id = str(subprocess.check_output(proc_id_com, shell=True)).split("\\n")[2].split("\\r")[0].split("=")[1]
# system info from SMBIOS
uuid_sys_com = 'WMIC CSPRODUCT GET UUID /VALUE'.split()
uuid_system = str(subprocess.check_output(uuid_sys_com, shell=True)).split("\\n")[2].split("\\r")[0].split("=")[1]
# monitor info
mon_pnp_com = 'WMIC DESKTOPMONITOR GET PNPDeviceID /VALUE'.split()
pnpdeviceid = str(subprocess.check_output(mon_pnp_com, shell=True)).split("\\n")[2].split("\\r")[0].split("=")[1]
if 'other_info' not in dict_info['info']:
dict_info['info']['other_info'] = dict()
dict_info['info']['other_info'] = {'motherboard_manufacturer': manufacturer,
'motherboard_product': product,
'version_bios': version_bios,
'manufacturer_bios': manufacturer_bios,
'serial_number_bios': serial_num_bios,
'date_version_bios': date_version_bios,
'smbios_version': smbios_ver,
'os_boot_directory': boot_directory,
'last_drive': last_drive,
'processor_name': processor_name,
'processor_id': processor_id,
'uuid_system': uuid_system,
'pnp_device_id': pnpdeviceid}
# disk info
d_cap_com = 'WMIC DISKDRIVE GET Caption /VALUE'.split()
disk_caption = str(subprocess.check_output(d_cap_com, shell=True)).strip().split("\\n")
d_list = []
for cap in disk_caption:
if 'Caption=' in cap:
d_list.append(cap.split("\\r")[0].split("=")[1])
ser_dcom = 'WMIC DISKDRIVE GET SerialNumber /VALUE'.split()
serial_num_disk = str(subprocess.check_output(ser_dcom, shell=True)).strip().split("\\n")
d_sn_list = []
for ser in serial_num_disk:
if 'SerialNumber=' in ser:
d_sn_list.append(ser.split("\\r")[0].split("=")[1].strip())
for num in range(0, len(d_list)):
if 'drive_name_serial' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['drive_name_serial'] = dict()
if d_list[num] not in dict_info['info']['other_info']['drive_name_serial']:
dict_info['info']['other_info']['drive_name_serial'][d_list[num]] = dict()
dict_info['info']['other_info']['drive_name_serial'][d_list[num]] = d_sn_list[num]
firm_rev_com = 'WMIC DISKDRIVE GET FirmwareRevision /VALUE'.split()
firmvare_revision_disk = str(subprocess.check_output(firm_rev_com, shell=True)).strip().split("\\n")
fr_list = []
for num, fm in enumerate(firmvare_revision_disk):
if 'FirmwareRevision=' in fm:
fr_list.append(fm.split("\\r")[0].split("=")[1].strip())
for nf in range(0, len(fr_list)):
if 'drive_firmware' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['drive_firmware'] = dict()
if f'drive_{str(nf)}' not in dict_info['info']['other_info']['drive_firmware']:
dict_info['info']['other_info']['drive_firmware'][f'drive_{str(nf)}'] = dict()
dict_info['info']['other_info']['drive_firmware'][f'drive_{str(nf)}'] = fr_list[nf]
disk_sig_com = 'WMIC DISKDRIVE GET Signature /VALUE'.split()
disk_signature = str(subprocess.check_output(disk_sig_com, shell=True)).strip().split("\\n")
sig_list = []
for sig in disk_signature:
if 'Signature=' in sig:
sig_list.append(sig.split("\\r")[0].split("=")[1].strip())
for sgl in range(0, len(sig_list)):
if 'disk_signature' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['disk_signature'] = dict()
if f'sig_{sgl}' not in dict_info['info']['other_info']['disk_signature']:
dict_info['info']['other_info']['disk_signature'][f'sig_{sgl}'] = sig_list[sgl]
# volume disk info
vdn_com = 'WMIC LOGICALDISK GET VolumeName /value'
disk_volume_name = str(subprocess.check_output(vdn_com, shell=True)).strip().split("\\n")
vol_name_list = []
for voln in disk_volume_name:
if 'VolumeName=' in voln:
if voln.split("\\r")[0].split("=")[1].strip() == "":
vol_name_list.append('Local Drive')
else:
vol_name_list.append(voln.split("\\r")[0].split("=")[1].strip())
for vln in range(0, len(vol_name_list)):
if 'volum_name' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['volum_name'] = dict()
if f'volum_{vln}' not in dict_info['info']['other_info']['volum_name']:
dict_info['info']['other_info']['volum_name'][f'volum_{vln}'] = dict()
dict_info['info']['other_info']['volum_name'][f'volum_{vln}'] = vol_name_list[vln]
vol_sn_com = 'WMIC LOGICALDISK GET VolumeSerialNumber /value'
volume_serialnumber = str(subprocess.check_output(vol_sn_com, shell=True)).strip().split("\\n")
vol_sn_list = []
for vol_sn in volume_serialnumber:
if 'VolumeSerialNumber=' in vol_sn:
vol_sn_list.append(vol_sn.split("\\r")[0].split("=")[1].strip())
for vsn in range(0, len(vol_sn_list)):
if 'volume_serial_number' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['volume_serial_number'] = dict()
if f'volume_serial_{vsn}' not in dict_info['info']['other_info']['volume_serial_number']:
dict_info['info']['other_info']['volume_serial_number'][f'volume_serial_{vsn}'] = dict()
dict_info['info']['other_info']['volume_serial_number'][f'volume_serial_{vsn}'] = vol_sn_list[vsn]
# ram info
formf_com = 'WMIC MEMORYCHIP GET FormFactor /value'.split()
ram_form_factor = str(subprocess.check_output(formf_com, shell=True)).strip().split("\\n")
for num, ffm in enumerate(ram_form_factor):
if 'FormFactor=8' in ffm:
if 'memory_form_factor' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['memory_form_factor'] = dict()
if f'memory_{num}' not in dict_info['info']['other_info']['memory_form_factor']:
dict_info['info']['other_info']['memory_form_factor'][f'memory_{num}'] = dict()
dict_info['info']['other_info']['memory_form_factor'][f'memory_{num}'] = \
ffm.split("\\r")[0].split("=")[1].strip()
ram_man_com = 'WMIC MEMORYCHIP GET Manufacturer /value'.split()
ram_manufacturer = str(subprocess.check_output(ram_man_com, shell=True)).strip().split("\\n")
for num, ram_m in enumerate(ram_manufacturer):
if 'Manufacturer=' in ram_m:
if 'memory_manufacturer' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['memory_manufacturer'] = dict()
if f'manufacturer_{num}' not in dict_info['info']['other_info']['memory_manufacturer']:
dict_info['info']['other_info']['memory_manufacturer'][f'manufacturer_{num}'] = dict()
dict_info['info']['other_info']['memory_manufacturer'][f'manufacturer_{num}'] = \
ram_m.split("\\r")[0].split("=")[1].strip()
ram_pn_com = 'WMIC MEMORYCHIP GET PartNumber /value'.split()
ram_part_number = str(subprocess.check_output(ram_pn_com, shell=True)).strip().split("\\n")
for num, rpn in enumerate(ram_part_number):
if 'PartNumber=' in rpn:
if 'memory_part_number' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['memory_part_number'] = dict()
if f'part_number_{num}' not in dict_info['info']['other_info']['memory_part_number']:
dict_info['info']['other_info']['memory_part_number'][f'part_number_{num}'] = dict()
dict_info['info']['other_info']['memory_part_number'][f'part_number_{num}'] = \
rpn.split("\\r")[0].split("=")[1].strip()
ram_sn_com = 'WMIC MEMORYCHIP GET SerialNumber /value'.split()
serial_number_ram = str(subprocess.check_output(ram_sn_com, shell=True)).strip().split("\\n")
for num, sn_ram in enumerate(serial_number_ram):
if 'SerialNumber=' in sn_ram:
if 'memory_serial_number' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['memory_serial_number'] = dict()
if f'serial_number_{num}' not in dict_info['info']['other_info']['memory_serial_number']:
dict_info['info']['other_info']['memory_serial_number'][f'serial_number_{num}'] = dict()
dict_info['info']['other_info']['memory_serial_number'][f'serial_number_{num}'] = \
sn_ram.split("\\r")[0].split("=")[1].strip()
ram_spf_com = 'WMIC MEMORYCHIP GET Speed /value'.split()
ram_speed_frequency = str(subprocess.check_output(ram_spf_com, shell=True)).strip().split("\\n")
for num, rsf in enumerate(ram_speed_frequency):
if 'Speed=' in rsf:
if 'memory_frequency' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['memory_frequency'] = dict()
if f'frequency_{num}' not in dict_info['info']['other_info']['memory_frequency']:
dict_info['info']['other_info']['memory_frequency'][f'frequency_{num}'] = dict()
dict_info['info']['other_info']['memory_frequency'][f'frequency_{num}'] = \
rsf.split("\\r")[0].split("=")[1].strip()
ram_mdev_com = 'WMIC MEMPHYSICAL get MemoryDevices /value'.split()
ram_count_memory = str(subprocess.check_output(ram_mdev_com, shell=True)).strip().split("\\n")[2].\
split("\\r")[0].split("=")[1]
if 'count_memory' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['count_memory'] = dict()
dict_info['info']['other_info']['count_memory'] = ram_count_memory
# network adapter info
cap_net_com = 'WMIC NIC get Caption /value'.split()
caption_net_adapter = str(subprocess.check_output(cap_net_com, shell=True)).strip().split("\\n")
for num, capnad in enumerate(caption_net_adapter):
if 'Caption=' in capnad:
if 'net_adapter_caption' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['net_adapter_caption'] = dict()
if f'net_adapter_{num}' not in dict_info['info']['other_info']['net_adapter_caption']:
dict_info['info']['other_info']['net_adapter_caption'][f'net_adapter_{num}'] = dict()
dict_info['info']['other_info']['net_adapter_caption'][f'net_adapter_{num}'] = \
capnad.split("\\r")[0].split("=")[1].strip().split("]")[1].strip()
net_giud_com = 'WMIC NIC get GUID /value'.split()
guid_network_adapter = str(subprocess.check_output(net_giud_com, shell=True)).strip().split("\\n")
for num, guid in enumerate(guid_network_adapter):
if 'GUID=' in guid:
if guid.split("\\r")[0].split("=")[1].strip():
if 'guid_net_adapter' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['guid_net_adapter'] = dict()
if f'guid_{num}' not in dict_info['info']['other_info']['guid_net_adapter']:
dict_info['info']['other_info']['guid_net_adapter'][f'guid_{num}'] = dict()
dict_info['info']['other_info']['guid_net_adapter'][f'guid_{num}'] = guid.split("\\r")[0].\
split("=")[1].strip()
# os information
os_inst_date_com = 'WMIC OS get InstallDate /value'.split()
os_install_date = str(subprocess.check_output(os_inst_date_com, shell=True)).strip().split("\\n")[2].\
split("\\r")[0].split("=")[1]
if 'os_install_date_time' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['os_install_date_time'] = dict()
dict_info['info']['other_info']['os_install_date_time'] = f'{os_install_date[0:8]}, {os_install_date[8:14]}'
os_sn_com = 'WMIC OS get SerialNumber /value'.split()
os_serial_number = str(subprocess.check_output(os_sn_com, shell=True)).strip().split("\\n")[2].\
split("\\r")[0].split("=")[1]
if 'os_serial_number' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['os_serial_number'] = dict()
dict_info['info']['other_info']['os_serial_number'] = os_serial_number
# license cliendID
lic_clid_com = 'wmic path softwarelicensingservice get ClientMachineID /value'
client_machine_id_lic = \
str(subprocess.check_output(lic_clid_com, shell=True)).strip().split("\\n")[2].split("\\r")[0].split("=")[1]
if 'client_machine_id_lic' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['client_machine_id_lic'] = dict()
dict_info['info']['other_info']['client_machine_id_lic'] = client_machine_id_lic
serial_num_com = 'wmic path softwarelicensingservice get OA3xOriginalProductKey /value'.split()
key_activate_win_uefi = \
str(subprocess.check_output(serial_num_com, shell=True)).strip().split("\\n")[2].split("\\r")[0].split("=")[1]
if key_activate_win_uefi == '':
pkey = windows_tools.product_key.get_windows_product_key_from_reg()
if 'key_activate_win' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['key_activate_win'] = dict()
dict_info['info']['other_info']['key_activate_win'] = pkey
else:
if 'key_activate_win' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['key_activate_win'] = dict()
dict_info['info']['other_info']['key_activate_win'] = key_activate_win_uefi
# printer info
prn_cap_com = 'WMIC PRINTER get Caption /value'.split()
printer_caption = str(subprocess.check_output(prn_cap_com, shell=True)).strip().split("\\n")
for num, prn in enumerate(printer_caption):
if 'Caption=' in prn:
if 'printer_caption' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['printer_caption'] = dict()
if f'printer_{num}' not in dict_info['info']['other_info']['printer_caption']:
dict_info['info']['other_info']['printer_caption'][f'printer_{num}'] = dict()
dict_info['info']['other_info']['printer_caption'][f'printer_{num}'] = prn.split("\\r")[0].\
split("=")[1].strip()
# time zone info
time_z_com = 'WMIC TIMEZONE get Caption /value'.split()
time_zone = str(subprocess.check_output(time_z_com, shell=True)).strip().split("\\n")[2].split("\\r")[0].\
split("=")[1]
if 'time_zone' not in dict_info['info']['other_info']:
dict_info['info']['other_info']['time_zone'] = dict()
dict_info['info']['other_info']['time_zone'] = time_zone
with open(f'info_{uname().node}.json', 'w', encoding='utf-8') as file:
json.dump(dict_info, file, indent=4, ensure_ascii=False)
return dict_info
def print_info(dict_info):
for item in dict_info['info']:
if item == "system_info":
for elem in dict_info['info'][item]:
if elem == 'system':
print(f"[+] Информация о системе\n"
f"\t- Имя компьютера: {dict_info['info'][item][elem]['comp_name']}\n"
f"\t- Опереционная система: {dict_info['info'][item][elem]['os_name']}\n"
f"\t- Сборка: {dict_info['info'][item][elem]['version']}\n"
f"\t- Архитектура: {dict_info['info'][item][elem]['machine']}\n")
if elem == 'processor':
print(f"[+] Информация о процессоре\n"
f"\t- Семейство: {dict_info['info'][item][elem]['name']}\n"
f"\t- Физические ядра: {dict_info['info'][item][elem]['phisycal_core']}\n"
f"\t- Всего ядер: {dict_info['info'][item][elem]['all_core']}\n"
f"\t- Максимальная частота: {dict_info['info'][item][elem]['freq_max']}\n")
if elem == 'ram':
print(f"[+] Оперативная память\n"
f"\t- Объем: {dict_info['info'][item][elem]['volume']}\n"
f"\t- Доступно: {dict_info['info'][item][elem]['aviable']}\n"
f"\t- Используется: {dict_info['info'][item][elem]['used']}\n")
if item == "disk_info":
for elem in dict_info['info'][item]:
print(f"[+] Информация о дисках\n"
f"\t- Имя диска: {elem}\n"
f"\t- Файловая система: {dict_info['info'][item][elem]['file_system']}\n"
f"\t- Объем диска: {dict_info['info'][item][elem]['size_total']}\n"
f"\t- Занято: {dict_info['info'][item][elem]['size_used']}\n"
f"\t- Свободно: {dict_info['info'][item][elem]['size_free']}\n"
f"\t- Заполненность: {dict_info['info'][item][elem]['percent']}%\n")
if item == "net_info":
for elem in dict_info['info'][item]:
print(f"[+] Информация о сети\n"
f"\t- Имя интерфейса: {elem}\n"
f"\t- MAC-адрес: {dict_info['info'][item][elem]['mac']}\n"
f"\t- IPv4: {dict_info['info'][item][elem]['ipv4']}\n"
f"\t- IPv6: {dict_info['info'][item][elem]['ipv6']}\n")
def print_dop_info(dict_info_dop):
for item in dict_info_dop['info']:
if item == "other_info":
print(f'[+] Дополнительная информация\n{"-"*33}')
for elem in dict_info_dop['info'][item]:
if elem == 'drive_name_serial':
print(f"\n[+] Диски: модель, серийный номер")
for drive in dict_info_dop['info'][item][elem]:
print(f"\t- {drive}: {dict_info_dop['info'][item][elem][drive]}")
elif elem == 'drive_firmware':
print(f"\n[+] Версия прошивки:")
for firmware in dict_info_dop['info'][item][elem]:
print(f"\t- {firmware}: {dict_info_dop['info'][item][elem][firmware]}")
elif elem == 'disk_signature':
print(f"\n[+] Цифровая подпись:")
for signature in dict_info_dop['info'][item][elem]:
print(f"\t- {signature}: {dict_info_dop['info'][item][elem][signature]}")
elif elem == 'volum_name':
print(f"\n[+] Имя тома:")
for vol_n in dict_info_dop['info'][item][elem]:
print(f"\t- {vol_n}: {dict_info_dop['info'][item][elem][vol_n]}")
elif elem == 'volume_serial_number':
print(f"\n[+] Серийный номер тома:")
for volume_serial in dict_info_dop['info'][item][elem]:
print(f"\t- {volume_serial}: {dict_info_dop['info'][item][elem][volume_serial]}")
elif elem == 'memory_form_factor':
print(f"\n[+] RAM форм-фактор:")
for memory_ff in dict_info_dop['info'][item][elem]:
print(f"\t- {memory_ff}: {dict_info_dop['info'][item][elem][memory_ff]}")
elif elem == 'memory_manufacturer':
print(f"\n[+] Производитель RAM:")
for memory_man in dict_info_dop['info'][item][elem]:
print(f"\t- {memory_man}: {dict_info_dop['info'][item][elem][memory_man]}")
elif elem == 'memory_part_number':
print(f"\n[+] Инвентарный номер RAM:")
for memory_part in dict_info_dop['info'][item][elem]:
print(f"\t- {memory_part}: {dict_info_dop['info'][item][elem][memory_part]}")
elif elem == 'memory_serial_number':
print(f"\n[+] Серийный номер RAM:")
for memory_serial in dict_info_dop['info'][item][elem]:
print(f"\t- {memory_serial}: {dict_info_dop['info'][item][elem][memory_serial]}")
elif elem == 'memory_frequency':
print(f"\n[+] Частота RAM:")
for memory_fr in dict_info_dop['info'][item][elem]:
print(f"\t- {memory_fr}: {dict_info_dop['info'][item][elem][memory_fr]}")
elif elem == 'net_adapter_caption':
print(f"\n[+] Название сетевого адаптера:")
for adapter_caption in dict_info_dop['info'][item][elem]:
print(f"\t- {adapter_caption}: {dict_info_dop['info'][item][elem][adapter_caption]}")
elif elem == 'guid_net_adapter':
print(f"\n[+] GUID сетевого адаптера:")
for guid_net in dict_info_dop['info'][item][elem]:
print(f"\t- {guid_net}: {dict_info_dop['info'][item][elem][guid_net]}")
elif elem == 'printer_caption':
print(f"\n[+] Название принтера:")
for prn_caption in dict_info_dop['info'][item][elem]:
print(f"\t- {prn_caption}: {dict_info_dop['info'][item][elem][prn_caption]}")
else:
print(f"[+] {elem.upper()}: {dict_info_dop['info'][item][elem]}")
def main():
if uname().system == "Windows":
dict_info = creating_file()
dict_info_dop = win_dop_info(dict_info)
with open(f'{uname().node}_info.json', 'w', encoding='utf-8') as file:
json.dump(dict_info_dop, file, indent=4, ensure_ascii=False)
print_info(dict_info)
print_dop_info(dict_info_dop)
elif uname().system == "Linux":
dict_info = creating_file()
with open(f'{uname().node}_info.json', 'w', encoding='utf-8') as file:
json.dump(dict_info, file, indent=4, ensure_ascii=False)
print_info(dict_info)
try:
with open('ps_dict.json', 'r', encoding='utf-8') as file:
src = json.load(file)
except:
src = list(range(1, 1001))
print(f'\n[+] Открытые порты\n{"-"*33}')
thread_func(src)
if len(port_list) > 0:
with open(f'{uname().node}_open_port.txt', 'w') as file:
for port in port_list:
file.write(f'{port}\n')
if __name__ == "__main__":
main()
Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезна