exe文件与pyinstaller被报告为病毒威胁的windows防御者

cs7cruho  于 2022-11-18  发布在  Windows
关注(0)|答案(6)|浏览(610)

我尝试使用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()

我用套接字包在我的本地网络上运行一个服务器。

wwodge7n

wwodge7n1#

方法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))

此技术用于黑客攻击和其他恶意目的,以避免防病毒软件将其检测为恶意软件。这可能对您有效。请尝试重新编译它。如果有效,请告诉我们。
方法二
如果上面的方法不起作用,试试这个方法。这个方法使用fernet cryptography。这意味着代码被更紧密地加密,使得anti-virus software比第一个方法更难将其识别为恶意软件。为此,你需要一个名为cryptographyhttps://pypi.org/project/cryptography/的python模块

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/,结果更好

METHOD 3 -使用其他方法冻结代码

有很多方法可以将你的代码转换成exe。另一个最流行的冻结代码的方法是使用py2exeInstall the module from the pypi website.
1.在主代码文件所在的目录下创建一个名为setup.py的新python文件,然后将以下内容粘贴到setup.py文件中。

from distutils.core import setup
import py2exe

setup(console=['main.py'])

1.打开cmd并键入python setup.py py2exe
1.稍后,将创建一个名为dist的文件夹。它将包含您的exe的所有依赖项。
1.现在你可以压缩这个文件,然后把它发送给其他人。另一个可能的解决方案是使用InnoSetup这样的编译器把所有的exe和依赖项编译成一个msi文件。

66bbxpm5

66bbxpm52#

检查temp文件夹中是否创建了.exe文件。如果是,则这将是防病毒软件检测恶意软件的原因之一。
通常,如果一个程序访问临时文件夹,它将被视为一个潜在的有害应用程序和标记。这是恶意软件的行为,它获得访问临时,并开始控制电脑从临时。
这就是为什么如果你已经观察,反病毒清除临时文件夹,如果你运行它作为临时文件夹是一个包含大部分的bulshit在它。
确保在临时文件夹中没有放置*****可执行文件。

dffbzjpn

dffbzjpn3#

UTF-8问题已解决

如果代码中有任何UTF-8字符,则无法转换为字节。

SyntaxError: bytes can only contain ASCII literal characters.

来解决这个问题

import base64

def encode(data):
    try:
        # Standard Base64 Encoding
        encodedBytes = base64.b64encode(data.encode("utf-8"))
        return str(encodedBytes, "utf-8")
    except:
        return ""
    
def decode(data):
    try:
        message_bytes = base64.b64decode(data)
        return message_bytes.decode('utf-8')
    except:
        return ""

your_code = encode("""

# coding: utf-8

# In[2]:

import os
import requests
import time
import pickle


Your code here.........
""")

exec(decode(your_code))
flvlnr44

flvlnr444#

我在使用pyinstaller -F选项编译时也遇到了同样的问题(将所有内容都放在一个exe文件中,而不是放在一个有很多文件的文件夹中)。
使用该选项时,病毒总数评分为12/70。
我在没有使用-F选项的情况下再次执行此操作:结果更大(从9 MB到20 MB),但是病毒总数分数现在是2/70。

px9o7tmv

px9o7tmv5#

出现这个问题的原因是pyinstaller编译类似于特洛伊木马,windows defender知道exe文件是恶意文件。如果你使用nuitka编译你的代码,这个问题就解决了。我建议你阅读这篇文章。https://github.com/Nuitka/Nuitka祝你有一个愉快的一天。

oogrdqng

oogrdqng6#

我也遇到了同样的问题,然后我发现,这只是因为我在多行注解中使用了文档字符串,
如果你有话,骑着它,你就会没事的
“"”此处的代码.........“"”

相关问题