|
|
""" |
|
|
展示参数分布、属性 |
|
|
""" |
|
|
import os |
|
|
import torch |
|
|
import random |
|
|
import struct |
|
|
import pandas as pd |
|
|
from bitstring import BitArray |
|
|
from concurrent.futures import ThreadPoolExecutor |
|
|
import numpy as np |
|
|
import math |
|
|
|
|
|
from numpy.ma.core import shape |
|
|
|
|
|
|
|
|
def showDif(file1, file2): |
|
|
""" |
|
|
对比提取的恶意软件和原始恶意软件的区别,返回出错的bit |
|
|
:return: |
|
|
""" |
|
|
malwareStr1 = BitArray(filename=file1).bin |
|
|
malwareStr2 = BitArray(filename=file2).bin |
|
|
diffNum = 0 |
|
|
if malwareStr1 != malwareStr2: |
|
|
print("两个恶意软件大小不同,第一个Bit数为:", malwareStr1, " 第二个Bit数为:", malwareStr1) |
|
|
return |
|
|
for i in range(len(malwareStr1)): |
|
|
if malwareStr1[i] != malwareStr2[i]: |
|
|
print("pos:", i, "initBit:", malwareStr1[i], "extractedBit:", malwareStr2[i]) |
|
|
diffNum += 1 |
|
|
|
|
|
|
|
|
print("different bit Num between the two files: ", diffNum) |
|
|
return diffNum |
|
|
|
|
|
|
|
|
def get_file_bit_num(file_path): |
|
|
""" |
|
|
通过文件路径,获得文件bit数 |
|
|
""" |
|
|
return os.path.getSize(file_path) * 8 |
|
|
|
|
|
|
|
|
def getExpEmbeddSize(initParaPath, layers, interval=1, correct=1): |
|
|
""" |
|
|
返回指数部分最大的嵌入容量,单位是字节Byte |
|
|
:param initParaPath: |
|
|
:param layers: list |
|
|
:param interval: 每interval个中嵌入一个 |
|
|
:return: list |
|
|
""" |
|
|
para = torch.load(initParaPath, map_location=torch.device("cpu")) |
|
|
ret = [] |
|
|
for layer in layers: |
|
|
paraTensor = para[layer].data |
|
|
paraTensor_flat = paraTensor.flatten() |
|
|
|
|
|
layerSize = len(paraTensor_flat) // (interval * correct * 8) |
|
|
|
|
|
ret.append(layerSize) |
|
|
return ret |
|
|
|
|
|
|
|
|
def generate_file_with_bits(file_path, num_bits): |
|
|
""" |
|
|
根据需要多少bit,随机生成对应大小的恶意软件 |
|
|
:param file_path: |
|
|
:param num_bits: |
|
|
:return: |
|
|
""" |
|
|
|
|
|
num_bytes = (num_bits + 7) // 8 |
|
|
print("Byte Num:", num_bytes) |
|
|
|
|
|
|
|
|
byte_array = bytearray(random.getrandbits(8) for _ in range(num_bytes)) |
|
|
|
|
|
|
|
|
if num_bits % 8 != 0: |
|
|
last_byte_bits = num_bits % 8 |
|
|
|
|
|
mask = (1 << last_byte_bits) - 1 |
|
|
byte_array[-1] &= mask |
|
|
|
|
|
|
|
|
with open(file_path, 'wb') as f: |
|
|
f.write(byte_array) |
|
|
|
|
|
print(f"File '{file_path}' generated with {num_bits} bits.") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
"""测试路径""" |
|
|
path_swin = "../parameters/classification/swin/swin_b.pth" |
|
|
path_yolo = "../parameters/detection/yolov10/yolov10b.pt" |
|
|
path_rt = "../parameters/detection/rt_dert/rt.pth" |
|
|
path_sam = "../parameters/segmentation/samv2/sam.pth" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""测试swin""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pth_keys = torch.load(path_yolo) |
|
|
print(pth_keys.keys()) |
|
|
print(type(pth_keys['model'].model.named_modules())) |
|
|
print(pth_keys['model'].model.named_modules()) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for idx, (name, module) in enumerate(pth_keys['model'].model.named_modules()): |
|
|
print(f"模块索引 {idx} - 名称 {name}: {module}") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print("Test Done") |
|
|
|
|
|
|