False Positive in AV

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Muttonhead
Beiträge: 20
Registriert: 25.06.2017 14:06
Computerausstattung: I7

False Positive in AV

Beitrag von Muttonhead »

Mir ist schon klar, ein leidiges Thema...
Gibt es eigentlich eine Art Vermeidungs-Taktik für False Positives? :)
Das Progrämmchen mal hier:

Code: Alles auswählen

; ***** GUI Modus
; für die Konfiguration des Compilers im jeweiligen Slot stehen folgende Platzhalter zur Verfügung:
; %s Quellcode
; %x Executable
; Diese sind in den Optionen zwingend(!) zu zu benutzen.
; Die einfachste Kommandozeilenoption des PureBasic Compilers sieht als Beispiel dann so aus: %s /exe %x
; Für FreeBASIC im GUI Modus sehen die Optionen so aus: -s gui %s -x %x
; Das Programm tauscht die Platzhalter durch die entsprechenden Dateinamen aus.
; Dadurch ist sichergestellt, dass Quellcode und kompilierte Binary den gleichen Namen haben und sich auch im selben
; Verzeichnis befinden. 

; ***** Konsolen Modus
; während im GUI Modus in den Slots verschiedene Konfigurationen eingestellt und getestet werden können,
; gilt es im Konsolen Modus diese Konfigurationen zu benutzen.
; -c <n>            Nummer des Slots dessen Konfiguration benutzt werden soll
; -s <sourcefile>   Dateiname des Quelltextes der kompiliert und ausgeführt werden soll
; -p yes            Schalter, ob dem kompilierten Programm bestimmte Parameter mitgegeben werden soll.
;                   Wenn ja dann öffnet sich vor Programmstart eine EingabeBox.
;                   Bei Weglassen wird keine EingabeBox erscheinen.
; Bespiel für Aufruf:
; <launcherpfad> -c 0 -s c:\qellcode.pb

; Beispiele für das Einbinden des Launchers in Notepad++
; Notepad++ besitzt sogenannte Environment Variablen. Die hier wichtige ist $(FULL_CURRENT_PATH), das ist
; die aktuelle geöffnete Datei. Über die F5 Taste bzw das "Ausführen" Menü kann dann der Launcher in N++ eingebunden werden.
; <launcherpfad> -c 0 -s "$(FULL_CURRENT_PATH)"
; <launcherpfad> -c 1 -s "$(FULL_CURRENT_PATH)" -p yes

; Somit kann man mit Hilfe dieses kleinen Programmes Notepad++ als IDE benutzen, aus welcher man seinen Code "direkt starten" kann.

EnableExplicit

Declare.i RunMyProgram (exefile.s, parameter.s, outputmode.i=1)
Declare.i RunSequence (compiler.s, options.s, source.s, prequest.i=0)
Declare.s QuotationChecked (text.s)
  
;Programmzeugs
#numSlots=100;hiermit kann man die Anzahl der Compilerkonfigurationen selbst bestimmen
Dim cmpfile.s(#numSlots-1)
Dim cmpoptions.s(#numSlots-1)
Define.s sourcefile,tmp,ParameterQualifier,ParameterContent
Define.i SlotIndex,AddContentMode,EssentialsFound,ParameterCount,i,AskForExeParameter

;GUI, File
Define.i Event,FileHandle
Global.i Combo_CmpSlot
Global.i Label_Cmpfile,String_Cmpfile,Button_Cmpfile_FR
Global.i Label_Options,String_Options,Button_Srcfile_FR
Global.i Check_Parameter
SetCurrentDirectory( GetPathPart( ProgramFilename() ) );Exeverzeichnis zum Arbeitsverzeichnis machen

FileHandle=ReadFile(#PB_Any ,"config.cfg")
If FileHandle
  For SlotIndex=0 To #numSlots-1   
    cmpfile(SlotIndex) = ReadString(FileHandle)
    cmpoptions(SlotIndex)=ReadString(FileHandle)
  Next SlotIndex
  sourcefile=ReadString(FileHandle)
  CloseFile(FileHandle)
EndIf

;Consolenparameter Parser
AskForExeParameter=0
ParameterQualifier=""
ParameterContent=""
EssentialsFound=0
AddContentMode=0
ParameterCount=CountProgramParameters()

For i=1 To ParameterCount
  ParameterContent=ProgramParameter() 
  ParameterQualifier=LCase(ParameterContent)
  
  If AddContentMode
    Select AddContentMode
      Case 1
        SlotIndex=Val(ParameterContent)
        If SlotIndex<0
          SlotIndex=0
        EndIf        
        If SlotIndex>3
          SlotIndex=3
        EndIf        
        EssentialsFound=EssentialsFound+1
      Case 2
        sourcefile=ParameterContent
        EssentialsFound=EssentialsFound+1
      Case 3
        If LCase(ParameterContent)="yes"
          AskForExeParameter=1
        Else
          AskForExeParameter=0
        EndIf         
    EndSelect
  EndIf  
  AddContentMode=0
  
  Select ParameterQualifier
    Case "-c"
      AddContentMode=1     
    Case "-s"
      AddContentMode=2
    Case "-p"
      AddContentMode=3
  EndSelect
Next i

;*************

If EssentialsFound=2                    ;wenn die beiden wichtigen Consolenparameter gefunden wurden
  
  ;Rufe Compiler auf, compiliere den Quellcode und starte das Compilat
  RunSequence (cmpfile(SlotIndex), cmpoptions(SlotIndex), sourcefile, AskForExeParameter)
  
Else                                    ;wenn keine Parameter gefunden dann GUI öffnen
  
  If OpenWindow(#PB_Any, 0, 0,310,130, "Launcher", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    Combo_CmpSlot           =ComboBoxGadget(#PB_Any, 70, 10, 200, 20)
    Label_Cmpfile           =TextGadget(#PB_Any,10,42,50,20,"Compiler:",#PB_Text_Right )
    String_Cmpfile          =StringGadget(#PB_Any,70,40,200,20,"")
    Button_Cmpfile_FR       =ButtonGadget(#PB_Any,280,40,20,20,"..") 
    Label_Options           =TextGadget(#PB_Any,10,72,50,20,"Options:",#PB_Text_Right )
    String_Options          =StringGadget(#PB_Any,70,70,200,20,"")
    Button_Srcfile_FR       =ButtonGadget(#PB_Any,140,100,130,20,"Select Source And Run")   
    Check_Parameter         =CheckBoxGadget(#PB_Any, 70, 100, 70, 20, "Parameter")
    SlotIndex=0
      
    For i=0 To #numslots-1
      AddGadgetItem(Combo_CmpSlot,-1,"Compiler Slot " + Str(i))
    Next i      
    SetGadgetState(Combo_CmpSlot, SlotIndex)
    
    SetGadgetText(String_Cmpfile, cmpfile(SlotIndex))
    SetGadgetText(String_Options, cmpoptions(SlotIndex))
    
    Repeat
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()  
          Case Combo_CmpSlot
            SlotIndex=GetGadgetState(Combo_CmpSlot)
            SetGadgetText(String_Cmpfile, cmpfile(SlotIndex))
            SetGadgetText(String_Options, cmpoptions(SlotIndex))   
           
          Case String_Cmpfile
            cmpfile(SlotIndex)=GetGadgetText(String_Cmpfile)
           
          Case String_Options
            cmpoptions(SlotIndex)=GetGadgetText(String_Options)
             
          Case Button_Cmpfile_FR
            tmp=""
            tmp=OpenFileRequester("Compiler", cmpfile(SlotIndex),"",0)
            If tmp<>""
              cmpfile(SlotIndex)=tmp
              SetGadgetText(String_Cmpfile, cmpfile(SlotIndex))
            EndIf
            
          Case Button_Srcfile_FR
            tmp=""
            tmp=OpenFileRequester("Source", sourcefile,"",0)
            If tmp<>""
              If GetGadgetState(Check_Parameter)=#PB_Checkbox_Checked
                AskForExeParameter=1
              Else
                AskForExeParameter=0
              EndIf
              sourcefile=tmp
              RunSequence (cmpfile(SlotIndex), cmpoptions(SlotIndex), sourcefile, AskForExeParameter)
            EndIf  
             
        EndSelect
      EndSelect 
    Until Event = #PB_Event_CloseWindow
  EndIf  
  
EndIf

;zum Schluss aufräumen  
SetCurrentDirectory( GetPathPart( ProgramFilename() ) )
FileHandle=CreateFile(#PB_Any ,"config.cfg")
If FileHandle
  For SlotIndex=0 To #numSlots-1
    WriteStringN(FileHandle, cmpfile(SlotIndex))
    WriteStringN(FileHandle, cmpoptions(SlotIndex))
  Next SlotIndex
  WriteStringN(FileHandle, sourcefile)
  CloseFile (FileHandle)
EndIf

End 0

;******************************************************************************
;******************************************************************************
;******************************************************************************

Procedure.i RunMyProgram (exefile.s, parameter.s, outputmode.i=1)
  Define xhandle.i,ReturnCode.i, Flags.i
  Define.s ProgramOutput,ErrorOutput
  
  Select outputmode
    Case 0
      Flags=0
      xhandle=RunProgram(exefile, parameter, "", Flags )
    Case 1
      Flags=#PB_Program_Open |#PB_Program_Read |  #PB_Program_Error
      xhandle=RunProgram(exefile, parameter, "", Flags )
      If xhandle
        While ProgramRunning(xhandle)
          If AvailableProgramOutput(xhandle)
            ProgramOutput= ProgramOutput + ReadProgramString(xhandle) + Chr(13)
            ErrorOutput= ErrorOutput +  ReadProgramError(xhandle) + Chr(13)
          EndIf
        Wend
        ReturnCode=ProgramExitCode(xhandle)  
      EndIf      
      CloseProgram(xhandle)
      If ReturnCode
			  MessageRequester("Error:", ProgramOutput + ErrorOutput, #PB_MessageRequester_Ok | #PB_MessageRequester_Info)      
		  EndIf
  EndSelect
  ProcedureReturn ReturnCode    
EndProcedure


Procedure.i RunSequence (compiler.s, options.s, source.s, prequest.i=0)
  Define.s tmpsourcefile,tmpexefile,tmpoptions,exeparameter
  Define.i CReturncode,EReturncode

	If compiler<>"" 

	  SetCurrentDirectory(GetPathPart(source)) 

		tmpsourcefile=QuotationChecked(source)
		tmpexefile=ReplaceString(tmpsourcefile, GetExtensionPart(tmpsourcefile), "exe")

		;im Optionsstring nun die Platzhalter durch die entsprechenden Strings ersetzen
		tmpoptions=ReplaceString(options,"%s",tmpsourcefile)
		tmpoptions=ReplaceString(tmpoptions,"%x",tmpexefile)

		CReturncode= RunMyProgram(compiler, tmpoptions, 1 )              				
		If CReturncode=0 ;falls Compilierung erfolgreich, Compilat aufrufen
		  If prequest
		    exeparameter=InputRequester("Parameter","","")  
		  EndIf
		  EReturncode= RunMyProgram(tmpexefile, exeparameter, 0)                                 
		EndIf                
	EndIf
EndProcedure


Procedure.s QuotationChecked (text.s)
  ;so vorhanden, erstmal äussere Anführungszeichen entfernen
  ;weiter innen liegende sollten erhalten bleiben
  If Left(text,1)=Chr(34) And Right(text,1)=Chr(34)
    text= Mid(text,2,Len(text)-2)  
  EndIf
  ;falls ein Space enthalten ist, äussere Anführungszeichen wieder hinzufügen
  If FindString(text, Chr(32))>0
    text=Chr(34) + text + Chr(34)  
  EndIf
  ProcedureReturn text
EndProcedure
Funktionsbeschreibung: Es soll ne Art "Compile & Run" Erweiterung für den Notepad++ sein.
Es gibt einen GUI Modus, bei dem man Compiler & Parameter austesten und in einen "Config-Slot" packt.
Später soll dann nur der entsprechende "Slot" aufgerufen werden und das im Editor befindliche Programm soll entsprechend kompiliert und ausgeführt werden.


Mutton
PureBasic 5.62 (Windows 10 Home - x64) | i7 7700HQ | 32GB | HD Graphics 630 / GeForce GTX 1060 Max-Q
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: False Positive in AV

Beitrag von RSBasic »

Ich habe deinen Code kompiliert und auf VirusTotal hochgeladen:
Erkennungsrate: 0 / 66
Ich kann mit deinem Code nicht bestätigen. Was sagt dein AV genau bzw. bei welchen Vorgang? Bekommst du beim Start oder etwas später eine Meldung?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: False Positive in AV

Beitrag von STARGÅTE »

Sowas wie RunProgram oder ReceiveHTTPMemory sollte man sicher vermeiden.
Zumindest war es damals bei mir immer das "Problem", klar, was soll ein "böses" Programm schon machen, andere böse Programme runterladen und ausführen >:)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: False Positive in AV

Beitrag von RSBasic »

OpenProcess_() sollte man auch vermeiden sowie zu kleine EXE-Dateien und UPX.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: False Positive in AV

Beitrag von Mijikai »

RSBasic hat geschrieben:OpenProcess_() sollte man auch vermeiden sowie zu kleine EXE-Dateien und UPX.
Heuristische Engines lassen sich leicht austricksen.
Hier würde ich der Willkür der AVs keine Zugeständnisse machen.
Entweder sollen die Ihren Schrott verbessern oder eine Ausnahme machen.
Wenn es nicht geht -> öffentlich schreiben das AV so und so inkompetent ist.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: False Positive in AV

Beitrag von mk-soft »

Heuristische Engines!

Purebasic ein Stellung:
- Compiler-Standards: Temporäres Executable im Quellcode-Verzeichnis erstellen.

AV-Einstellung:
- Den Code-Ordner im AV-Programm ausklammern, sowie den Ordner mit den Compiler ausklammern.

Prüfung:
- Eigene Executable manuell prüfen.

Weitergabe es Programm:
- Setup-Programm verwenden damit bei Verwendung des Programm richtig auf der Maschine registriert wurde. Ab Windows 7 zu empfehlen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Muttonhead
Beiträge: 20
Registriert: 25.06.2017 14:06
Computerausstattung: I7

Re: False Positive in AV

Beitrag von Muttonhead »

… vielen Dank für die Tipps. Habe mein Problem mittlerweile auch ohne meine "Erweiterung" lösen können.
Das Kompilieren und Starten geht auch mit N++ Boardmitteln.

Das generelle Problem ist natürlich nicht vom Tisch.


Mutton
PureBasic 5.62 (Windows 10 Home - x64) | i7 7700HQ | 32GB | HD Graphics 630 / GeForce GTX 1060 Max-Q
Antworten