[C++] Polaczenie HTTP w tle systemu

Fiodorow

Użytkownik
Dołączył
Maj 27, 2010
Posty
3
Mam pytanie, raczkuje jeszcze w tematyce C++. Czy jest możliwe napisanie programu, który w tle systemu co jakis odstep czasu, nawiazywal by polaczenie z serwerem HTTP, generowal wejscie na stronę? Najlepiej by bylo by tez zanadto nie obciazal systemy, najlepiej wysylal tylko zadanie do serwera i nie odbieral zadnych informacji. I czy to na pewno w C++?
 

5.56

Użytkownik
Dołączył
Luty 1, 2010
Posty
102
I owszem, da radę.
Możesz spróbować z tematyką winapi(tj.rejestrowanie całego okienka bez wyświetlania, czyli pierwszy lepszy kurs winapi i nie używamy ShowWindow), a odstępy zrealizować za pomocą timerów(to aż się prosi o zrobienie "wm_timer" w wndproc)
A sam aspekt wejścia na stronę - jeżeli URLDownloadToFile nie generuje wejścia(nawiązując do dokumentacji plik będzie ściągać nawet gdy ścieżka jest nieprawidłowa, więc na potrzeby "klikania" może być) to idziemy w stronę po*******onych uchwytów od internetu i innych cud(msdn), albo w stronę libcurla(google, jest ładnie udokumentowany wraz z przejrzystymi example'ami).
Co do ostatniego - w C++ da się zrobić wszystko, oprócz dobrych kanapek :D
 

skaktus

Użytkownik
Dołączył
Maj 17, 2010
Posty
24
Od timera lepiej wątek, choć wiem że dla "zielonego" będzie utrudnieniem.
Połączenie chyba najlepiej wykonać na socketach, da się zaimplementować wtedy tylko tą część kodu na której nam zależy. CURL to niestety osobna biblioteka, a nie zawsze możemy sobie pozwolić na jej dołączenie, poza tym jego wykorzystanie do tak drobnego zadania mija się z celem.

5.56:
Dobrego bootloadera czy shellcode też raczej nie zrobisz, ale to takie małe wyjątki. :]
 

discovery44

Były Moderator
Dołączył
Sierpień 14, 2007
Posty
763
5.56 napisał:
Możesz spróbować z tematyką winapi(tj.rejestrowanie całego okienka bez wyświetlania, czyli pierwszy lepszy kurs winapi i nie używamy ShowWindow), a odstępy zrealizować za pomocą timerów(to aż się prosi o zrobienie "wm_timer" w wndproc)
Lepiej tak:
Kod:
HWND hwnd;
ShowWindow(hwnd, 0);
while(1)
{
    /* pobieraj stronę i wysyłaj zmienne POST'em */
    Sleep(1000); // 1s - 1000ms
}
 

cyber_pl

Użytkownik
Dołączył
Wrzesień 30, 2009
Posty
187
Mam pytanie, raczkuje jeszcze w tematyce C++. Czy jest możliwe napisanie programu, który w tle systemu co jakis odstep czasu, nawiazywal by polaczenie z serwerem HTTP, generowal wejscie na stronę? Najlepiej by bylo by tez zanadto nie obciazal systemy, najlepiej wysylal tylko zadanie do serwera i nie odbieral zadnych informacji. I czy to na pewno w C++?

uzyj curla, tutaj bardzo prosty przyklad odemnie w ansi c/win32:

Kod:
#include <windows.h>
#include <curl/curl.h>

#define LOOPTIME    5000
#define URL         "haker.com.pl"

#define REC 1

unsigned long WINAPI loop(void *ptr){

    CURL *curl;

#ifdef REC
    CURLcode res;
#endif
    
    while(1){
             
          curl = curl_easy_init();
  
          if(curl) {
          
              curl_easy_setopt(curl, CURLOPT_URL, URL);

#ifdef REC
              res = curl_easy_perform(curl);
#else       
              curl_easy_perform(curl);
#endif

              Sleep(LOOPTIME);
     
              curl_easy_cleanup(curl);
              
              continue;
              
          }   
    
          Sleep(LOOPTIME);         
             
    }
    
    return 1;
         
}

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil){

    WaitForSingleObject(
    CreateThread(0,0,loop,0,0,0),INFINITE); return 0;                        

}

paczke z bibliotekami curla znajdziesz na oficjalnej stronie curla.
 

Adi32

Użytkownik
Dołączył
Styczeń 19, 2008
Posty
10
Prosty program oparty o Curl

Witajcie.

3 dni szukałem informacji i cały szień próbowałem sam napisać aplikację jakiej potrzebuje ale nie jest mi to widocznie pisane...

Potrzebuje małej aplikacji mniej więcej takiej o jakiej mowa tutaj.

Chodzi o program który odpalam, wpisuje adres strony i czas w sekundach.

Program miałby po prostu wchodzić i logować się, link wyglądałby zazwyczaj tak:

http://193.93.68.138:1111/usg/process?username=gosc&password=gosc&OS=www.lublin.eu

A to wydłużałoby mi internet.

Mam teraz zrobione w harmonogramie windows odpalanie skrótu do tej strony ale jest strasznie wkurzające i chciałbym aby działało w tyle.

Jeżeli ktoś podiąłby się napisania tego to kamień z serca.

Ewentualnie może ktoś mi powie, jak używać DevC++ na Win 7...

Pozdrawiam
 

discovery44

Były Moderator
Dołączył
Sierpień 14, 2007
Posty
763
Kod:
#include <windows.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    if(argc != 4) { cout << "Uzycie: " << argv[0] << " uzytkownik haslo czas_w_sekundach\n"; exit(0); }
    SOCKET sock;
    SOCKADDR_IN addr;
    WSADATA wsadata;
    string username(argv[1]), password(argv[2]);
    int czas = atoi(argv[3]);
    string query = "GET /usg/process?username=" + username + "&password=" + password + "&OS=www.lublin.eu\r\nHost: 193.93.68.138:1111\r\n\r\n";
    // init //
    WSAStartup(MAKEWORD(2,2), &wsadata);
    sock = socket(AF_INET, SOCK_STREAM, 0);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(1111);
    addr.sin_addr.s_addr = inet_addr("193.93.68.138");
    if(connect(sock, (struct sockaddr*)&addr, sizeof addr) == -1)
    {
        cout << "Brak polaczenia.\n"; exit(0);
    }
    //////////
    while(1)
    {
        send(sock, query.c_str(), query.length(), 0);
        Sleep(czas * 1000);
    }
}
O to chodziło?
http://discovery44.tk/upload/http_login.exe masz exe'ka.
Uruchamiasz przez cmd.
 
Ostatnia edycja:

Adi32

Użytkownik
Dołączył
Styczeń 19, 2008
Posty
10
Chyba o to chodziło ale niestety, nie powoduje to zalogowania do sieci. Nie wiem dlaczego, ale nawet jak otworze notatnik i przez niego wejdę na ten link to mnie loguje...

Jestem w stanie coś zapłacić za rozwiązanie tego problemu...

Poruszałem ten temat na forum php.pl ale tam nikt sobie z tym nie poradził...
link do tematu: http://forum.php.pl/index.php?showtopic=179851&start=0&p=880934&#entry880934

Można tam znaleźć więcej szczegółów.
 

discovery44

Były Moderator
Dołączył
Sierpień 14, 2007
Posty
763
Tak to jest jak się nie napisze o co dokładnie chodzi. Na tamtym forum chcieli od Ciebie dane z POST, pobierz firefoxa i livehttpheaders i wklej tu całe zapytanie do serwera jakie kierujesz.
 

discovery44

Były Moderator
Dołączył
Sierpień 14, 2007
Posty
763
Hm... POST'em nic nie leci... spróbuj jeszcze tym a jeżeli nie zadziała to napisz bo mam rozwiązanie (działać będzie ale "nieelegancko"). Można jeszcze uruchamiać ten Twój skrypt w batchu co kilkanaście minut i zamykać przeglądarkę ale to - jak pisałem - bardzo nieeleganckie rozwiązanie :).
Kod:
#include <iostream>
#include <stdlib.h>
#include <windows.h> // o ile dobrze pamiętam to na windowsie wymagana jest do Sleep
#include "curl/curl.h"
using namespace std;

static int writer(char *data, int s, int n, string *buffer)
{
    buffer->append(data, s * n);
    return s * n;
}

int main(int argc, char *argv[])
{
    if(argc != 4)
    {
        cout << "Uzycie:" << argv[0] << " user haslo czas_w_sekundach\n";
        exit(0);
    }
    CURL *a = curl_easy_init();
    string user(argv[1]), haslo(argv[2]), tbuffer;
    int czas = atoi(argv[3]);
    if(!a)
    {
        cout << "curl error\n";
        exit(0);
    }
    curl_easy_setopt(a, CURLOPT_URL, (string("http://193.93.68.138:1111/usg/process?username=") + user + string("&password=") + haslo + string("&OS=www.lublin.eu")).c_str());
    curl_easy_setopt(a, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_setopt(a, CURLOPT_REFERER, "http://haker.com.pl/");
    curl_easy_setopt(a, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3");
    curl_easy_setopt(a, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(a, CURLOPT_WRITEDATA, &tbuffer);
    while(1)
    {
        curl_easy_perform(a);
        tbuffer = "";
        Sleep(czas * 1000);
    }
}
Musisz mieć libcurl.a (w dev-cpp można pobrać przez "sprawdź nowości" [czy coś o podobnej nazwie]) i kompilujesz:
Kod:
g++ net_login.cpp -lcurl -o net_login.exe
Albo dodajesz w opcjach projektu do linkera libcurl.a (kat_z_devcpp\\lib\\libcurl.a) i wtedy kompilujesz.
 

Adi32

Użytkownik
Dołączył
Styczeń 19, 2008
Posty
10
Dzięki za kod, mam nadzieje, że zadziała ale pod Win 7 Dev cpp nie chce kompilować w ogóle. Gdzieś wyczytałem że pod vistą i Win7 Dev c++ nie działa. Próbowałem jeszcze jnnymi programami ale tam nie mogę nawet po ludzku projektu utworzyć a co już mówić o instalowaniu bibliotek. Jeżeli chodzi o dane przesyłane POSTewm, to myśle, że powinieneś spojrzeć jeszcze tu:

http://adrianb.pl/html.html

to jest kod źrógłowy strony logowania, jak wpiszę tam gosc gosc to też mnie zaloguje, w <input type="hidden"> są ukryte zmienne przesyłane postem, jest między innymi zmienna IP, jej wartość to mój wew IP (zmienny lokalny) myśle, że to ważne...

Dziękuję za pomoc
 

discovery44

Były Moderator
Dołączył
Sierpień 14, 2007
Posty
763
to jest kod źrógłowy strony logowania, jak wpiszę tam gosc gosc to też mnie zaloguje, w <input type="hidden"> są ukryte zmienne przesyłane postem, jest między innymi zmienna IP, jej wartość to mój wew IP (zmienny lokalny) myśle, że to ważne...
Z kodu źródłowego pliku html.html na Twojej stronie wynika, że wszystkie dane wysyłane są metodą POST a nie GET więc nie wiem czemu LHH pokazało GET zamiast POST... spróbuj jeszcze z tym koded, przerobiłem go na wysyłanie POSTem danych do konta wraz z IP
Kod:
#include <iostream>
#include <stdlib.h>
#include <windows.h> // o ile dobrze pamiętam to na windowsie wymagana jest do Sleep
#include "curl/curl.h"
using namespace std;

static int writer(char *data, int s, int n, string *buffer)
{
    buffer->append(data, s * n);
    return s * n;
}

int main(int argc, char *argv[])
{
    if(argc != 5)
    {
        cout << "Uzycie:" << argv[0] << " user haslo IP czas_w_sekundach\n";
        exit(0);
    }
    CURL *a = curl_easy_init();
    string user(argv[1]), haslo(argv[2]), ip(argv[3]), tbuffer;
    string query = "username=" + user + "&password=" + haslo + "&IP=" + ip;
    int czas = atoi(argv[4]);
    if(!a)
    {
        cout << "curl error\n";
        exit(0);
    }
    curl_easy_setopt(a, CURLOPT_URL, "http://login.nomadix.com:1111/usg/process");
    curl_easy_setopt(a, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_setopt(a, CURLOPT_REFERER, "http://haker.com.pl/");
    curl_easy_setopt(a, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3");
    curl_easy_setopt(a, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(a, CURLOPT_WRITEDATA, &tbuffer);
    curl_easy_setopt(a, CURLOPT_POSTFIELDS, query.c_str());
    while(1)
    {
        curl_easy_perform(a);
        tbuffer = "";
        Sleep(czas * 1000);
    }
}
/* EDIT */
/* Ten kod jednak nie zadziała, dopiero teraz sprawdziłem, że ta strona nie istnieje. */

Hmm... jak się zalogujesz przez przeglądarkę (manualnie) to w pasku adresu wpisz: javascript:alert(document.cookie); i pokaż co Ci wyskakuje.
 
Ostatnia edycja:

Adi32

Użytkownik
Dołączył
Styczeń 19, 2008
Posty
10
usgLogin=%251Cs%2500c%26%2504k%2518%257B; username=Urzad Miasta Lublin

Strona może nie istnieć dla Ciebie, bo jesteś z zewnątrz sieci.
 

Adi32

Użytkownik
Dołączył
Styczeń 19, 2008
Posty
10
Z pewnością wyświetliłąby się. Teraz pokazuje komunikat:
You already Logged IN Please point the browser
to the site of your choice.

Znalazłem przyczynę nie działania Dev C++

Kod:
Kompilator: Default compiler
Wykonywanie  make clean
rm -f main.o  Projekt1.exe

g++.exe -c main.cpp -o main.o -I"D:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"D:/Dev-Cpp/include/c++/3.4.2/backward"  -I"D:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"D:/Dev-Cpp/include/c++/3.4.2"  -I"D:/Dev-Cpp/include"   

Nazwa 'C:\Users\ADI' nie jest rozpoznawana jako polecenie wewn©trzne lub zewn©trzne,
program wykonywalny lub plik wsadowy.

System nie moľe odnale«† okre˜lonej ˜cieľki.
make.exe: *** [main.o] Error 1

Wykonanie zakończone

Dev nie lubi spacji. Nazwa usera to Adi and Evi

Jest post przy logowaniu przez tą stronę:

http://adrianb.pl/1.txt
http://adrianb.pl/2.txt
 
Ostatnio edytowane przez moderatora:

discovery44

Były Moderator
Dołączył
Sierpień 14, 2007
Posty
763
Z pewnością wyświetliłąby się. Teraz pokazuje komunikat:
You already Logged IN Please point the browser
to the site of your choice.
Zrestartuj komputer i wejdź od nowa na tą stronę, powinieneś być niezalogowany. Następnie uruchom program który Ci podesłałem i odśwież tą stronę, powinieneś być zalogowany. Działa?
 

Adi32

Użytkownik
Dołączył
Styczeń 19, 2008
Posty
10
No ja bardzo chciałbym go uruchomić ale nie mam jak go skompilować.

W devie ni cholery nie mogę znaleźć opcji zmieny akurat którychkolwiek ścieżek prowadzących do C:/Users...
Masz może możliwość skompilować ten kod?
 

Adi32

Użytkownik
Dołączył
Styczeń 19, 2008
Posty
10
Program działa!

Dziękuję, po uruchomieniu programu zostałem zalogowany, fakt bez przekierowania, ale rozkminie jak to skompilować i nie będę zawracać głowy.

Chodzi o to żeby jakąś sekundę po połączaniu program spróbował wejść na obojętnie jaką stronę.

Fajnie byłoby też zrobić tak aby program sam wyłapywał IP to wrzuciłbym w auto start.

Jeszcze taz dziękuję. Jeżeli lubisz C++ to byłbym 100x wdzięczny jakbyś podał mi kod z tymi zmianami, z kompilowaniem już bym coś wymyślił

Pozdrawiam

Edit: Jeszcze takie pytanko, żeby program działa to jego okno musi być otwarte?
 
Ostatnia edycja:
Do góry Bottom