gpt4 book ai didi

python - 使用 pyinstaller 制作的 exe 文件被 Windows Defender 报告为病毒威胁

转载 作者:行者123 更新时间:2023-12-04 11:51:46 51 4
gpt4 key购买 nike

我正在尝试使用 pyinstaller 为学校项目创建一个 exe,但是 Windows Defender 似乎报告了病毒威胁并阻止了该文件。我想将此 exe 发送给其他一些人,但除非我解决此问题,否则我无法这样做。所以这些是我的查询- 为什么 exe 文件被报告为病毒? 对病毒总数的快速扫描表明 16 engines detect this file as a Trojan .另外,有什么方法可以防止 Windows Defender 或任何其他防病毒软件警告用户存在病毒威胁 ,我的意思是,有没有办法让我的文件对防病毒软件来说是安全的,以防它只是一个虚假的威胁?如果这是不可能的, pyinstaller 的其他安全替代品是什么? 我只是一个初学者,所以任何提示都将不胜感激。谢谢。
编辑:根据@Pro Chess 的要求,我包含了我的脚本。

import socket 
import threading
import pickle

class Server :
def __init__(self) :
self.HEADER = 64
self.PORT = 5050
self.SERVER = socket.gethostbyname(socket.gethostname())
self.ADDR = (self.SERVER, self.PORT)
self.FORMAT = 'utf-8'
self.DISCONNECT_MESSAGE = "!DISCONNECT"

self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind(self.ADDR)
self.save_dict = {}

def file_access(self) :
with open("project_data\\savedata.dat","rb") as save_file :
save_dict = pickle.load(save_file)
return save_dict

def file_dump(self) :
with open("project_data\\savedata.dat","wb") as save_file :
pickle.dump(self.save_dict,save_file)

def recieve(self,conn) :
msg_length = conn.recv(self.HEADER).decode(self.FORMAT)
if msg_length:
msg_length = int(msg_length)
msg = conn.recv(msg_length).decode(self.FORMAT)
return msg

def handle_client(self,conn, addr):
print(f"[NEW CONNECTION] {addr} connected.")

connected = True
while connected:
try :
self.save_dict = self.file_access()
msg = self.recieve(conn)
if msg == self.DISCONNECT_MESSAGE:
connected = False
elif msg == "Save Data" :
player_id = conn.recv(5000)
try :
name,code = pickle.loads(player_id)
except EOFError :
pass
if (name,code) not in self.save_dict :
conn.send("Available".encode(self.FORMAT))
msg1 = self.recieve(conn)
if msg1 == "Game Data" :
game_data = conn.recv(5000)
#msg = pickle.loads(msg_data)
self.save_dict[(name,code)] = game_data
print(self.save_dict)
conn.send("Success".encode(self.FORMAT))
else :
conn.send("Exists".encode(self.FORMAT))
msg1 = self.recieve(conn)
if msg1 == "Game Data" :
game_data = conn.recv(5000)
self.save_dict[(name,code)] = game_data
conn.send("Success".encode(self.FORMAT))
elif msg == "Wipe" :
self.save_dict.pop((name,code))
print(f"new dict is ",self.save_dict)
elif msg == "Load" :
player_id = conn.recv(5000)
try :
name,code = pickle.loads(player_id)
except EOFError :
pass
if (name,code) in self.save_dict :
conn.send("Present".encode(self.FORMAT))
conn.send(self.save_dict[(name,code)])
else :
conn.send("Absent".encode(self.FORMAT))
elif msg == "Check Data" :
player_id = conn.recv(5000)
try :
name,code = pickle.loads(player_id)
except EOFError :
pass
if (name,code) in self.save_dict :
conn.send("Exists".encode(self.FORMAT))
else :
conn.send("New".encode(self.FORMAT))
self.file_dump()
except ConnectionResetError :
connected = False

conn.close()
print(f"[Terminated] connection terminated for {addr}")


def start(self):
self.server.listen()
print(f"[LISTENING] Server is listening on {self.SERVER}")
while True:
conn, addr = self.server.accept()
thread = threading.Thread(target=self.handle_client, args=(conn, addr))
thread.start()
print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}")


print("[STARTING] server is starting...")
server = Server()
server.start()

我已经使用套接字包在我的本地网络上运行服务器。

最佳答案

方法 1
一个可能的解决方案是加密您的代码。有几种加密代码的方法。但最简单的方法是使用 base64或基本上转换 text-to-binary编码。并且您需要确保没有特殊字符,因为 base64 仅具有此字符集。
您可以在此处查看 base64 表 https://en.wikipedia.org/wiki/Base64

import base64

your_code = base64.b64encode(b"""

# All your code goes in here.

import socket
import threading
import pickle

class Server :
def __init__(self) :
self.HEADER = 64
self.PORT = 5050
self.SERVER = socket.gethostbyname(socket.gethostname())
self.ADDR = (self.SERVER, self.PORT)
self.FORMAT = 'utf-8'
self.DISCONNECT_MESSAGE = "!DISCONNECT"
# Continue your code...
""")

exec(base64.b64decode(your_code))
此技术用于黑客攻击和其他恶意目的,以避免防病毒软件将其检测为恶意软件。这可能对你有用。重新编译试试。让我们知道它是否有效。
方法 2
如果上述方法不起作用,请尝试此方法。此方法使用 fernet cryptography .这意味着代码被更严密地加密,这让 anti-virus software 变得更加困难。将其识别为恶意软件而不是第一种方法。为此,您需要一个名为 cryptography 的 Python 模块。 https://pypi.org/project/cryptography/
from cryptography.fernet import Fernet
import base64

code = b"""

import socket
import threading
import pickle

class Server :
def __init__(self) :
self.HEADER = 64
self.PORT = 5050
self.SERVER = socket.gethostbyname(socket.gethostname())
self.ADDR = (self.SERVER, self.PORT)
self.FORMAT = 'utf-8'
self.DISCONNECT_MESSAGE = "!DISCONNECT"

self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind(self.ADDR)
self.save_dict = {}

def file_access(self) :
with open("project_data\\savedata.dat","rb") as save_file :
save_dict = pickle.load(save_file)
return save_dict

def file_dump(self) :
with open("project_data\\savedata.dat","wb") as save_file :
pickle.dump(self.save_dict,save_file)

def recieve(self,conn) :
msg_length = conn.recv(self.HEADER).decode(self.FORMAT)
if msg_length:
msg_length = int(msg_length)
msg = conn.recv(msg_length).decode(self.FORMAT)
return msg

def handle_client(self,conn, addr):
print(f"[NEW CONNECTION] {addr} connected.")

connected = True
while connected:
try :
self.save_dict = self.file_access()
msg = self.recieve(conn)
if msg == self.DISCONNECT_MESSAGE:
connected = False
elif msg == "Save Data" :
player_id = conn.recv(5000)
try :
name,code = pickle.loads(player_id)
except EOFError :
pass
if (name,code) not in self.save_dict :
conn.send("Available".encode(self.FORMAT))
msg1 = self.recieve(conn)
if msg1 == "Game Data" :
game_data = conn.recv(5000)
#msg = pickle.loads(msg_data)
self.save_dict[(name,code)] = game_data
print(self.save_dict)
conn.send("Success".encode(self.FORMAT))
else :
conn.send("Exists".encode(self.FORMAT))
msg1 = self.recieve(conn)
if msg1 == "Game Data" :
game_data = conn.recv(5000)
self.save_dict[(name,code)] = game_data
conn.send("Success".encode(self.FORMAT))
elif msg == "Wipe" :
self.save_dict.pop((name,code))
print(f"new dict is ",self.save_dict)
elif msg == "Load" :
player_id = conn.recv(5000)
try :
name,code = pickle.loads(player_id)
except EOFError :
pass
if (name,code) in self.save_dict :
conn.send("Present".encode(self.FORMAT))
conn.send(self.save_dict[(name,code)])
else :
conn.send("Absent".encode(self.FORMAT))
elif msg == "Check Data" :
player_id = conn.recv(5000)
try :
name,code = pickle.loads(player_id)
except EOFError :
pass
if (name,code) in self.save_dict :
conn.send("Exists".encode(self.FORMAT))
else :
conn.send("New".encode(self.FORMAT))
self.file_dump()
except ConnectionResetError :
connected = False

conn.close()
print(f"[Terminated] connection terminated for {addr}")


def start(self):
self.server.listen()
print(f"[LISTENING] Server is listening on {self.SERVER}")
while True:
conn, addr = self.server.accept()
thread = threading.Thread(target=self.handle_client, args=(conn, addr))
thread.start()
print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}")


print("[STARTING] server is starting...")
server = Server()
server.start()

"""

key = Fernet.generate_key()
encryption_type = Fernet(key)
encrypted_message = encryption_type.encrypt(code)

decrypted_message = encryption_type.decrypt(encrypted_message)

exec(decrypted_message)
这次编译 exe已上传到 https://www.virustotal.com/gui/结果更好
方法 3 - 使用另一种方法来卡住您的代码
有很多方法可以将您的代码转换为 exe .另一种最流行的卡住代码的方法是使用 py2exe . Install the module from the pypi website.
  • 创建一个名为 setup.py 的新 python 文件在与主代码文件相同的目录中。然后将以下内容粘贴到您的 setup.py 中文件。

  • from distutils.core import setup
    import py2exe

    setup(console=['main.py'])
  • 打开 cmd 并输入 python setup.py py2exe
  • 过了一会儿,一个名为dist的文件夹将被创建。它将包含您 exe 的所有依赖项.
  • 现在您可以通过压缩该文件并将其发送给另一个人来压缩该文件。另一种可能的解决方案是使用像 InnoSetup 这样的编译器。编译你所有的 exe并将依赖项合并为一个 msi文件。
  • 关于python - 使用 pyinstaller 制作的 exe 文件被 Windows Defender 报告为病毒威胁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64788656/

    51 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com