Hier ist von der Möglichkeit die Rede, die Funktionalität von Virustotal in einer Programmiersprache zu nutzen: VirusTotal - Free Online Virus, Malware and URL Scanner
Leider habe ich von HTTP Request komplett keinen Plan. Lässt sich das mit Profan irgendwie umsetzen?
Virustotal API
-
-
-
Der scheint schon mal auf dem richtigen Weg zu sein...
winhttp post - Sysinternals Forums
Hier die Headerkonstanten:
http://forums.purebasic.com/german/viewtopic.php?t=19078
http://wine.1045685.n5.nabble.com/winhttp-includ…-td1743464.html -
OK, habe die Lösung. Code läuft jetzt (geile Sache).
-
Dann poste doch ein Beispiel für die Nachwelt.
-
Kommt noch, ist aber ohne Key nicht lauffähig.
-
Hier Quellcode:
Code
Alles anzeigen'##################################################################################### '######### Virustotal einbinden ######### '######### Code von AHT ######### '######### Gepostet für http://www.paules-pc-forum.de ######### '##################################################################################### 'PCU zur Ermittlung der MD5 $U MD5.pcu = MD5. 'APIs für die Virustotal API Def WinHttpOpen(5) !"Winhttp.dll", "WinHttpOpen" Def WinHttpQueryOption(4) !"Winhttp.dll", "WinHttpQueryOption" Def WinHttpConnect(4) !"Winhttp.dll", "WinHttpConnect" Def WinHttpOpenRequest(7) !"Winhttp.dll", "WinHttpOpenRequest" Def WinHttpSendRequest(7) !"Winhttp.dll", "WinHttpSendRequest" Def WinHttpReceiveResponse(2) !"Winhttp.dll", "WinHttpReceiveResponse" Def WinHttpQueryDataAvailable(2) !"Winhttp.dll", "WinHttpQueryDataAvailable" Def WinHttpReadData(4) !"Winhttp.dll", "WinHttpReadData" Def WinHttpCloseHandle(1) !"Winhttp.dll", "WinHttpCloseHandle" Def GetLastError(0) !"Kernel32", "GetLastError" Def MultiByteToWideChar(6) !"Kernel32", "MultiByteToWideChar" Def SetLastError(1) !"Kernel32", "SetLastError" Def GetModuleHandle(1) !"Kernel32", "GetModuleHandleA" 'APIs für das Programm Def GetSysColor(1), !"User32", "GetSysColor" DEF CreateStatusWindow(4) !"comctl32", "CreateStatusWindow" DEF GetDlgCtrlID(1) !"USER32.dll","GetDlgCtrlID" DEF ButtonClicked(1) GetDlgCtrlID(@&(1)) = (%MENUITEM * -1) 'Globale Variablen für das Programm Declare API_Key_EDIT&, API_Key_Group&, HWWidth&, HWHeight& Declare Statusbar&, Text$, MD5_Group&, MD5_Edit&, MD5_Button& Declare Ergebnisse_Group&, Rich_DLL&, Ergebnisse_Edit& Declare CHARFORMAT#, Dateiname$, Testen&, MD5_String$, Scan$ Declare API_Key$, Vergleich$ Rich_DLL& = UseDLL($SYSPATH + "\RICHED20.DLL") SET("ErrorLevel", -1) API_Key$ = readini$("HKEY_1", "SoftWare\VirustotalRequester", "Key") SET("ErrorLevel", -1) 'HauptFenster erzeugen WindowStyle 31 WindowTitle "VirustotalRequester (Public API)" Window 0, 0 - 640, 440 'Controls erzeugen CLS External("User32", "GetSysColor", 15) Text$ = "Ready to go..." Statusbar& = CreateStatusWindow($50000920, ADDR(Text$), %HWND, 1000) API_Key_Group& = Create("GroupBox", %HWND, "API-Key von Virustotal", 10, 20, int(ABS(Width(%HWND) / 2 - 40)), 100) API_Key_EDIT& = Create("Edit", %HWND, API_Key$, 20, 60, int(ABS(Width(%HWND) / 2 - 60)), 30) MD5_Group& = Create("GroupBox", %HWND, "MD5 einer Datei", 20 + int(ABS(Width(%HWND) / 2 - 20)), 20, int(ABS(Width(%HWND) / 2 - 30)), 100) MD5_Edit& = Create("Edit", %HWND, "", 30 + int(ABS(Width(%HWND) / 2 - 20)), 40, int(ABS(Width(%HWND) / 2 - 50)), 30) MD5_Button& = Create("Button", %HWND, "Datei auswählen", 30 + int(ABS(Width(%HWND) / 2 - 20)), 80, int(ABS(Width(%HWND) / 4 - 10)), 30) Testen& = Create("Button", %HWND, "Testen", (30 + int(ABS(Width(%HWND) / 2 - 20))) + ( int(ABS(Width(%HWND) / 4))), 80, int(ABS(Width(%HWND) / 4 - 50)), 30) EnableWindow Testen&, 0 Ergebnisse_Group& = Create("GroupBox", %HWND, "Ergebnisse der Abfragen", 10, 130, int(ABS(Width(%HWND) - 30)), int(ABS(Height(%HWND) - 170))) Ergebnisse_Edit& = control("RichEdit20A","",$50000000 | $4 | $200000 | $100000 | $100 | $800 | $1000, 20, 30, int(ABS(Width(%HWND) - 70)), int(ABS(Height(%HWND) - 220)) ,Ergebnisse_Group&, 0, %Hinstance, $200) SendMessage(Ergebnisse_Edit&, $0400 + 53, 0, $7FFFFFF0) SendMessage(Ergebnisse_Edit&, $443, 0, RGB(255,255,230)) DIM CHARFORMAT#, 84 Long CHARFORMAT#, 0 = 84 Long CHARFORMAT#, 4 = $40000000 Long CHARFORMAT#, 20 = RGB(0, 0, 255) Sendmessage(Ergebnisse_Edit&, $444, 4, CHARFORMAT#) Dispose CHARFORMAT# While 1 Waitinput Positioner If ButtonClicked(MD5_Button&) SetMenuitem 0 Dateiname$ = LoadFile$("Datei zum überprüfen auswählen...", "*") IF Dateiname$ <> "" MD5_String$ = MD5.GetMD5(Dateiname$, 60, 0, 1) Settext MD5_Edit&, MD5_String$ Text$ = "Jetzt Button 'Testen' klicken!" + Chr$(13) + Chr$(10) Sendmessage(Statusbar&,$401,0,ADDR(TEXT$)) Sendmessage(Statusbar&,$410,0,ADDR(TEXT$)) endif endif If ButtonClicked(Testen&) SetMenuitem 0 EnableWindow Ergebnisse_Edit&, 0 Text$ = "Verbinde mit Virustotal..." Sendmessage(Statusbar&,$401,0,ADDR(TEXT$)) Sendmessage(Statusbar&,$410,0,ADDR(TEXT$)) Text$ = "MD5: " + GetText$(MD5_Edit&) + Chr$(13) + Chr$(10) SendMessage(Ergebnisse_Edit&, $00B1, -1, -1) 'Cursor setzen oder markieren SendMessage(Ergebnisse_Edit&, $00C2, 0, ADDR(Text$)) 'Text einfügen/ersetzen If (Dateiname$ <> "") and (MD5_String$ = GetText$(MD5_Edit&)) Text$ = "Dateiname: " + Dateiname$ + Chr$(13) + Chr$(10) SendMessage(Ergebnisse_Edit&, $00B1, -1, -1) 'Cursor setzen oder markieren SendMessage(Ergebnisse_Edit&, $00C2, 0, ADDR(Text$)) 'Text einfügen/ersetzen endif Scan$ = VT_Scan_MD5(GetText$(API_Key_EDIT&), GetText$(MD5_Edit&), Statusbar&, 0) Scan$ = Translate$(Scan$, ", ", Chr$(13)+Chr$(10)) Scan$ = Scan$ + Chr$(13) + Chr$(10) SendMessage(Ergebnisse_Edit&, $00B1, -1, -1) 'Cursor setzen oder markieren SendMessage(Ergebnisse_Edit&, $00C2, 0, ADDR(Scan$)) 'Text einfügen/ersetzen Text$ = "##################################################################################################################" + Chr$(13) + Chr$(10) SendMessage(Ergebnisse_Edit&, $00B1, -1, -1) 'Cursor setzen oder markieren SendMessage(Ergebnisse_Edit&, $00C2, 0, ADDR(Text$)) 'Text einfügen/ersetzen EnableWindow Ergebnisse_Edit&, 1 Vergleich$ = CHR$(34) + "result" + CHR$(34) + ": -1}" If instr(Vergleich$, Scan$) <> len(Scan$) - (Len(Vergleich$) + 1) Writeini "HKEY_1", "SoftWare\VirustotalRequester", "Key" = GetText$(API_Key_EDIT&) else Text$ = "Falscher API Key!" Sendmessage(Statusbar&,$401,0,ADDR(TEXT$)) Sendmessage(Statusbar&,$410,0,ADDR(TEXT$)) endif Vergleich$ = CHR$(34) + "result" + CHR$(34) + ": -2}" If instr(Vergleich$, Scan$) = len(Scan$) - (Len(Vergleich$) + 1) Text$ = "Zu viele Abfragen getätigt - fünf Minuten bis zur nächsten Abfrage warten (maximal 20 Abfragen in 5 Minuten)!" Sendmessage(Statusbar&,$401,0,ADDR(TEXT$)) Sendmessage(Statusbar&,$410,0,ADDR(TEXT$)) endif Vergleich$ = CHR$(34) + "result" + CHR$(34) + ": 0}" If instr(Vergleich$, Scan$) = len(Scan$) - (Len(Vergleich$) + 1) Text$ = "Datei ist nicht in der Datenbank zu finden!" Sendmessage(Statusbar&,$401,0,ADDR(TEXT$)) Sendmessage(Statusbar&,$410,0,ADDR(TEXT$)) endif endif If GetText$(MD5_Edit&) = "" EnableWindow Testen&, 0 else EnableWindow Testen&, 1 endif wend End 'Ermittelt die Fehlerbeschreibung Proc Fehlercode_bestimmen Parameters Winerror&, HMod& Declare GETERROR_Buffer$, GETERROR_Buffer# DIM GETERROR_Buffer#, 100001 External("kernel32", "FormatMessageA", $800, HMod&,Winerror&, 0, GETERROR_Buffer#, 100000, 0) 'Wandelt Fehlercode in Landesspezifische Message um. GETERROR_Buffer$ = trim$(STRING$(GETERROR_Buffer#, 0)) Dispose GETERROR_Buffer# If GETERROR_Buffer$ = "" GETERROR_Buffer$ = "Fehlercode " + Str$(Winerror&) endif return GETERROR_Buffer$ Endproc 'Prozedur zum Auslesen eines Scans bei Virustotal Proc VT_Scan_MD5 Parameters VT_API_KEY$, VT_MD5_String$, VT_Statusbar&, VT_Statuszeile& Declare HWinhttp&, UserAgent$, UserAgent#, hSession& Declare data&, Size&, hConnect&, Server$, Server# Declare hRequest&, Verb$, Verb#, Objname$, Objname# Declare bResult&, Parameters$, len& Declare URL$, Context&, NumberOfBytesAvailable& Declare Data#, DownLoaded&, Scan_Return$, ReturnEdit& Declare VT_Lasterror&, VT_Statustext$, Mod$ HWinhttp& = UseDLL("Winhttp.dll") UserAgent$ = "Virustotal Test" Server$ = "www.virustotal.com" Verb$ = "POST" Objname$ = "api/get_file_report.json" Parameters$ = "key=" + VT_API_KEY$ + "&resource=" + VT_MD5_String$ URL$ = "https://www.virustotal.com." Dim UserAgent#, len(UserAgent$) * 2 + 2 Dim Server#, len(Server$) * 2 + 2 Dim Verb#, len(Verb$) * 2 + 2 Dim Objname#, len(Objname$) * 2 + 2 len& = len(Parameters$) MultiByteToWideChar(0, 0, addr(UserAgent$), -1, UserAgent#, int(SizeOf(UserAgent#) / 2)) MultiByteToWideChar(0, 0, addr(Server$), -1, Server#, int(SizeOf(Server#) / 2)) MultiByteToWideChar(0, 0, addr(Verb$), -1, Verb#, int(SizeOf(Verb#) / 2)) MultiByteToWideChar(0, 0, addr(Objname$), -1, Objname#, int(SizeOf(Objname#) / 2)) SetLastError(0) hSession& = WinHttpOpen(UserAgent#, 0, 0, 0, 0) If hSession& <> 0 Size& = 4 If WinHttpQueryOption(hSession&, 3, addr(data&), addr(Size&)) hConnect& = WinHttpConnect(hSession&, Server#, 80, 0) If hConnect& <> 0 hRequest& = WinHttpOpenRequest(hConnect&, Verb#, Objname#, 0, 0, 0, $0) If hRequest& <> 0 bResult& = WinHttpSendRequest(hRequest&, 0, 0, addr(Parameters$), len(Parameters$), len(Parameters$), addr(Context&)) If bResult& <> 0 If WinHttpReceiveResponse(hRequest&, 0) If WinHttpQueryDataAvailable(hRequest&, addr(NumberOfBytesAvailable&)) DIM Data#, abs(NumberOfBytesAvailable&) + 1 WinHttpReadData(hRequest&, Data#, SizeOf(Data#), addr(DownLoaded&)) Scan_Return$ = String$(Data#, 0) Dispose Data# else VT_Lasterror& = GetLastError() If VT_Statusbar& <> 0 VT_Statustext$ = "WinHttpQueryDataAvailable: " + Fehlercode_bestimmen(VT_Lasterror&, HWinhttp&) Sendmessage(VT_Statusbar&,$401,0,ADDR(VT_Statustext$)) Sendmessage(VT_Statusbar&,$410,0,ADDR(VT_Statustext$)) endif endif else VT_Lasterror& = GetLastError() If VT_Statusbar& <> 0 VT_Statustext$ = "WinHttpReceiveResponse: " + Fehlercode_bestimmen(VT_Lasterror&, HWinhttp&) Sendmessage(VT_Statusbar&,$401,0,ADDR(VT_Statustext$)) Sendmessage(VT_Statusbar&,$410,0,ADDR(VT_Statustext$)) endif endif else VT_Lasterror& = GetLastError() If VT_Statusbar& <> 0 VT_Statustext$ = "WinHttpSendRequest: " + Fehlercode_bestimmen(VT_Lasterror&, HWinhttp&) Sendmessage(VT_Statusbar&,$401,0,ADDR(VT_Statustext$)) Sendmessage(VT_Statusbar&,$410,0,ADDR(VT_Statustext$)) endif endif WinHttpCloseHandle(hRequest&) else VT_Lasterror& = GetLastError() If VT_Statusbar& <> 0 VT_Statustext$ = "WinHttpOpenRequest: " + Fehlercode_bestimmen(VT_Lasterror&, HWinhttp&) Sendmessage(VT_Statusbar&,$401,0,ADDR(VT_Statustext$)) Sendmessage(VT_Statusbar&,$410,0,ADDR(VT_Statustext$)) endif endif WinHttpCloseHandle(hConnect&) else VT_Lasterror& = GetLastError() If VT_Statusbar& <> 0 VT_Statustext$ = "WinHttpConnect: " + Fehlercode_bestimmen(VT_Lasterror&, HWinhttp&) Sendmessage(VT_Statusbar&,$401,0,ADDR(VT_Statustext$)) Sendmessage(VT_Statusbar&,$410,0,ADDR(VT_Statustext$)) endif endif else VT_Lasterror& = GetLastError() If VT_Statusbar& <> 0 VT_Statustext$ = "WinHttpQueryOption: " + Fehlercode_bestimmen(VT_Lasterror&, HWinhttp&) Sendmessage(VT_Statusbar&,$401,0,ADDR(VT_Statustext$)) Sendmessage(VT_Statusbar&,$410,0,ADDR(VT_Statustext$)) endif endif WinHttpCloseHandle(hSession&) Else VT_Lasterror& = GetLastError() If VT_Statusbar& <> 0 VT_Statustext$ = "WinHttpOpen: " + Fehlercode_bestimmen(VT_Lasterror&, HWinhttp&) Sendmessage(VT_Statusbar&,$401,0,ADDR(VT_Statustext$)) Sendmessage(VT_Statusbar&,$410,0,ADDR(VT_Statustext$)) endif endif VT_Lasterror& = GetLastError() If VT_Statusbar& <> 0 If VT_Lasterror& = 0 Mod$ = "kernel32" VT_Statustext$ = Fehlercode_bestimmen(VT_Lasterror&, GetModuleHandle(addr(Mod$))) Sendmessage(VT_Statusbar&,$401,0,ADDR(VT_Statustext$)) Sendmessage(VT_Statusbar&,$410,0,ADDR(VT_Statustext$)) endif endif Dispose UserAgent# Dispose Server# Dispose Verb# Dispose Objname# FreeDLL HWinhttp& Return Scan_Return$ endproc 'Prozedur zum Positionieren der Controls Proc Positioner If (HWWidth& <> Width(%HWND)) or (HWHeight& <> Height(%HWND)) HWWidth& = Width(%HWND) HWHeight& = Height(%HWND) SetWindowPos API_Key_Group& = 10, 20 - int(ABS(HWWidth& / 2 - 40)), 100 SetWindowPos API_Key_EDIT& = 20, 60 - int(ABS(HWWidth& / 2 - 60)), 30 SetWindowPos MD5_Group& = 20 + int(ABS(Width(%HWND) / 2 - 20)), 20 - int(ABS(HWWidth& / 2 - 30)), 100 SetWindowPos MD5_Edit& = 30 + int(ABS(Width(%HWND) / 2 - 20)), 40 - int(ABS(Width(%HWND) / 2 - 50)), 30 SetWindowPos MD5_Button& = 30 + int(ABS(Width(%HWND) / 2 - 20)), 80 - int(ABS(Width(%HWND) / 4 - 10)), 30 SetWindowPos Testen& = (30 + int(ABS(Width(%HWND) / 2 - 20))) + ( int(ABS(Width(%HWND) / 4))), 80 - int(ABS(Width(%HWND) / 4 - 50)), 30 SetWindowPos Ergebnisse_Group& = 10, 130 - int(ABS(Width(%HWND) - 30)), int(ABS(Height(%HWND) - 170)) SetWindowPos Ergebnisse_Edit& = 20, 30 - int(ABS(Width(%HWND) - 70)), int(ABS(Height(%HWND) - 220)), 30 SetWindowPos Statusbar& = 0, 0 - 0, 0 Repaint endif endproc
Download des kompletten Packets: VirustotalRequester
Kurze Erklärung: Der Code testet eine MD5 einer Datei bei Virustotal und holt sich die Ergebnisse aus der Datenbank. Die Datei wird dabei nicht aktuell auf den Server geladen - die Scanergebnisse sind also nicht aktuell (für einen Schnelltest reicht das aber oft)..
Mit der gleichen API ist es auch möglich, eine Datei aktuell zum Scannen auf den Server von Virustotal zu laden. Dazu müssen aber spezielle Header mit übergeben werden. Um das umzusetzen, fehlt mir im Augenblick noch die Ahnung von HTTP. Hier Infos, wie man den Header in Python formt:
Http client to POST using multipart/form-data Python recipes ActiveState Code
Für den Zugriff auf die Datenbank von Virustotal über die API benötigt man einen API-Key. Den bekommt man kostenlos, wenn man sich auf VirusTotal - Free Online Virus, Malware and URL Scanner anmeldet.
Wer Lust hat, mir beim Erstellen des Codes für den Dateiupload unter die Arme zu greifen kann das gerne tun.[Blockierte Grafik: http://s4.postimage.org/1u4afcixw/image.jpg]
-
Hier noch was, was bei der Umsetzung des Dateiuploads helfen könnte:
my own braindump: WinHttpSendRequest is not so easy to use
http://www.computec.ch/forum_viewtopic.php?11.21038
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!