Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Datei nach VirusTotal mittels Indy (https://www.delphipraxis.net/160854-datei-nach-virustotal-mittels-indy.html)

stOrM 4. Jun 2011 11:45

Datei nach VirusTotal mittels Indy
 
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) :shock:

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!:roll:
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.

Valle 4. Jun 2011 13:57

AW: Datei nach VirusTotal mittels Indy
 
Zitat:

Zitat von stOrM (Beitrag 1104562)
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!:roll:

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

stOrM 4. Jun 2011 14:26

AW: Datei nach VirusTotal mittels Indy
 
Ok nun gehts für die Richtigkeit (Benutzung der Indy Komponente) keine Gewähr :mrgreen:

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

Blubbels 10. Jun 2011 07:21

AW: Datei nach VirusTotal mittels Indy
 
Sorry, Versehen ;)

CCRDude 10. Jun 2011 16:34

AW: Datei nach VirusTotal mittels Indy
 
Daran habe ich neulich auch mal gearbeitet :)

Eine vollständige Delphi-Klasse wollte ich für VirusTotal eh mal hochladen; siehe also snlAPIVirusTotal.pas.

implementation 10. Jun 2011 17:13

AW: Datei nach VirusTotal mittels Indy
 
Zitat:

Zitat von Valle (Beitrag 1104571)
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 ;)

mdx 10. Jun 2011 18:43

AW: Datei nach VirusTotal mittels Indy
 
Zitat:

Zitat von implementation (Beitrag 1105718)
<Port> fällt meistens ebenfalls weg, bei HTTP ist der Standard 8080.

Öhm also das wäre mir jetzt neu :roll: :-D

himitsu 10. Jun 2011 20:33

AW: Datei nach VirusTotal mittels Indy
 
Man könnte die 8080 fast als Standardalternativport betrachten. :lol:

Valle 10. Jun 2011 22:29

AW: Datei nach VirusTotal mittels Indy
 
Zitat:

Zitat von implementation (Beitrag 1105718)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 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