AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Datei nach VirusTotal mittels Indy

Datei nach VirusTotal mittels Indy

Offene Frage von "Valle"
Ein Thema von stOrM · begonnen am 4. Jun 2011 · letzter Beitrag vom 10. Jun 2011
Antwort Antwort
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#1

Datei nach VirusTotal mittels Indy

  Alt 4. Jun 2011, 12:45
Hi,
ich stehe gerade vor dem Problem, dass ich gerne eine Datei mittels Delphi an die Virustotal Webseite zwecks überprüfung dieser Datei senden würde. Bevorzugt würde ich dafür Indy einsetzen. Dumm daran ist das ich mit Indy selber bis auf die IdHTTP Komponente im Zusammenhang mit Dateidownload noch nie etwas gemacht habe.

Die Suche hier hat mich auch nicht wirklich dem Ziel nahegebracht, da ich nicht genau weiß woran das Problem nun genau liegt.

Folgendes zum Upload schreibt Virustotal:

Zitat:
This API call expects multipart/form-data parameters, the string part of the the call should have the following parameter:

key: your API key.
The file part of the call should contain the name of the submitted file and the file itself. We strongly encourage you to send the file with the name with which it was found in the wild since this is very rich metadata for the VirusTotal database. The API acts like a form with a file input field named file.
Gut dachte ich mir, versuch ich mal folgendes (Unwissenderweise)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  stream : TIdMultipartFormDataStream;
  const
    aHost = 'http://www.virustotal.com';
    aSelector = 'http://www.virustotal.com/api/scan_file.json';
begin
  stream := TIdMultipartFormDataStream.Create;
  try
    idHttp1.Request.ContentType := stream.RequestContentType;
    // sha1 filehash
    stream.AddFormField('resource:', '60EC5990C3DD08481F94F85636BAC486F5C19CCD');
    // private api key
    stream.AddFormField('key:', aKey);
    // filename to be send including file
    stream.AddFile('file:Test.exe', 'C:\VirusTotal\Upload\Test.exe', '');
    // set stream to beginning
    stream.Position := 0;
    // send file to virustotal result into memo1
    Memo1.Lines.Text := idHttp1.Post(aHost, stream);
  finally
    stream.Free;
  end;
end;
Was mich verwirrt ist folgendes Script als Beispiel auf Virustotal

Code:
>>> import postfile
>>> host = "www.virustotal.com"
>>> selector = "https://www.virustotal.com/api/scan_file.json"
>>> fields = [("key", "1fe0ef5feca2f84eb450bc3617f839e317b2a686af4d651a9bada77a522201b0")]
>>> file_to_send = open("test.txt", "rb").read()
>>> files = [("file", "test.txt", file_to_send)]
>>> json = postfile.post_multipart(host, selector, fields, files)
>>> print json
{"scan_id": "cd1384c10baa2d5b96f397b986e2a1fc9535d2ef0e185a113fc610eca1c6fb0e-1271623480",
 "result": 1}
Wenn ich das richtig deute wird hier nicht nur die Url www.virustotal.com sondern auch noch https://www.virustotal.com/api/scan_file.json übergeben? Irgendwie blick ichs nicht!
Erst dachte ich gut vielleicht liegts daran das ich die ganze Sache über http anstelle von https aufrufe lt. dem Beispiel soll aber beides machbar sein.

Fehler 1: Wenn ich den Code mit aHost aufrufe bekomme ich ein 'Not allowed' zurück! Nehme ich den aSelector bekomme ich 500 "Internal error" zurück.
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#2

AW: Datei nach VirusTotal mittels Indy

  Alt 4. Jun 2011, 14:57
Wenn ich das richtig deute wird hier nicht nur die Url www.virustotal.com sondern auch noch https://www.virustotal.com/api/scan_file.json übergeben? Irgendwie blick ichs nicht!
Nein, du hast es nicht richtig verstanden.

Das erste ist keine URL, sondern ein Hostname. Dieser wird einfach in eine IP aufgelöst und beschreibt, wohin der folgende Datenverkehr gesendet wird. Da kann auch was ganz anderes stehen, zB. 74.53.201.162. Oder bei der DP kannst du www.delphipraxis.net, 88.198.53.15 oder danielwolf.eu schreiben. Alles der gleiche Host.

Was hier als "Selektor" bezeichnet wird vereint gleich mehrere Sache auf einmal, die du in Indy wahrscheinlich getrennt behandeln musst. So ist hier angegeben, dass du via verschlüsselter Verbindung (SSL) kommunizierst. Außerdem steht drin, welche s.g. "virtuelle Hostname" via HTTP an den Webserver übergeben wird. Dazu gleich mehr. Und dahinter steht die URI, also hier "/api/scan_file.json".

Der Verbindungsablauf selbst gestaltet sich dann, indem der Client eine SSL-gesicherte Verbindung zur IP hinter www.virustotal.com aufbaut. Danach sendet er (in etwa) folgende Daten zu diesem HTTP-Server. Hinter "Host: " steht dann auch der eben erwähnte virtuelle Hostname. Hier kannst du eintragen was immer du willst, trotzdem kommen die Daten zum gleichen Server der vorher als reeller Host angegeben wurde.

Code:
POST /api/scan_file.json
Host: www.virustotal.com
Content-Length: 15

key=abc&foo=bar
(hier fehlt jetzt natürlich noch der Datei-Upload)

Von Indy habe ich leider keine Ahnung. Aber du kannst davon ausgehen, dass du Protokoll, reellen und virtuellen Hostname und URI trennen musst. Ich vermute, dass aHost hier wirklich ein Host und keine URL sein sollte, also konkret "www.virustotal.com". Hier solltest du dir Beispiele für Bei Google suchenDateiupload mit Indy suchen. Ansonsten lohnt ein Blick auf die Funktionsweise des HTTP.

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog

Geändert von Valle ( 4. Jun 2011 um 15:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Datei nach VirusTotal mittels Indy

  Alt 4. Jun 2011, 15:26
Ok nun gehts für die Richtigkeit (Benutzung der Indy Komponente) keine Gewähr

Lösung

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  stream : TIdMultipartFormDataStream;
  const
    aSelector = 'http://www.virustotal.com/api/scan_file.json';
begin
  stream := TIdMultipartFormDataStream.Create;
  try
    idHttp1.Request.ContentType := stream.RequestContentType;
    stream.AddFormField('key', aKey);
    stream.AddFile('file', 'Test.exe', 'application/octet-stream');
    stream.Position := 0;
    Memo1.Lines.Text := idHttp1.Post(aSelector, stream);
  finally
    stream.Free;
  end;
end;
Ps. Danke für die Erklärung Valle

Geändert von stOrM ( 4. Jun 2011 um 15:34 Uhr)
  Mit Zitat antworten Zitat
Blubbels

Registriert seit: 21. Okt 2008
8 Beiträge
 
#4

AW: Datei nach VirusTotal mittels Indy

  Alt 10. Jun 2011, 08:21
Sorry, Versehen
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Datei nach VirusTotal mittels Indy

  Alt 10. Jun 2011, 17:34
Daran habe ich neulich auch mal gearbeitet

Eine vollständige Delphi-Klasse wollte ich für VirusTotal eh mal hochladen; siehe also snlAPIVirusTotal.pas.
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Datei nach VirusTotal mittels Indy

  Alt 10. Jun 2011, 18:13
Und dahinter steht die URI, also hier "/api/scan_file.json".
Kleine Korrektur: Der Uniform Resource Identificator ist das ganze, also: "http://www.virustotal.com/api/scan_file.json"

URIs sind meistens so aufgebaut: schema: // hostname : port /pfad ? parameter # anker (bei HTTP)
Dabei kann <schema> ein Protokoll sein (HTTP, HTTPS, FTP, usw.) oder aber ein sonstiges Addressattribut, wie bspw. "urn", welches kennzeichnet, dass es sich um einen URN handelt.
<Hostname> kann eine IP-Adresse sein (IPv4 oder IPv6), eine vollqualifizierte Domäne (auf den letzten Punkt achten: "www.delphipraxis.net.") oder auch eine relative Domäne (dort darf der Punkt wegfallen: "www.delphipraxis.net").
<Port> fällt meistens ebenfalls weg, bei HTTP ist der Standard 80.

Bei FTP kann das ganze auch so aussehen: ftp:// username : password @ hostname /pfad
Dort kann man die Logininformationen dadurch also schon in den URI einbauen.

Gültige URIs sind auch "mailto:max.mustermann@domain.tld" oder "tel:+4999999999"

Valle, das was du meinst ist einfach der Pfad im Unix-Format

Geändert von implementation (10. Jun 2011 um 19:51 Uhr)
  Mit Zitat antworten Zitat
mdx
(Gast)

n/a Beiträge
 
#7

AW: Datei nach VirusTotal mittels Indy

  Alt 10. Jun 2011, 19:43
<Port> fällt meistens ebenfalls weg, bei HTTP ist der Standard 8080.
Öhm also das wäre mir jetzt neu
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#8

AW: Datei nach VirusTotal mittels Indy

  Alt 10. Jun 2011, 21:33
Man könnte die 8080 fast als Standardalternativport betrachten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#9

AW: Datei nach VirusTotal mittels Indy

  Alt 10. Jun 2011, 23:29
Kleine Korrektur: Der Uniform Resource Identificator ist das ganze, also: "http://www.virustotal.com/api/scan_file.json"
[...]
Valle, das was du meinst ist einfach der Pfad im Unix-Format
Äh ja, das kommt davon wenn man einen Satz hundert mal umbaut. Mir selbst ist der Aufbau der URIs bestens geläufig.

Hab' den Fehler eben korrigiert korrigieren wollen, aber leider ist es schon zu spät.

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz