Nytro Posted January 10, 2009 Report Posted January 10, 2009 Am primit o "misiune" de a realiza acest lucru. O sa o prezint pe scurt. Ideea e simpla, e nevoie de un script PHP de unde se va schimba statusul online si de un executabil care va schimba practic statusul la messenger. Scriptul PHP salveaza statusul intr-un tabel iar programul citeste statusul de pe pagina si il pune la status.Incepem cu scriptul PHP. Vom folosi 3 fisiere: config.php pentru conectarea la baza de date, instalare.php pentru crearea bazei de date si a tabelului in care va fi memorat statusul si de status.php care permite schimbarea statusului si regasirea acestuia pentru program.config.php<?php $db_host="127.0.0.1"; $db_user="root"; $db_password=""; $db_name="cls";$con=mysql_connect($db_host,$db_user,$db_password);if($con) { $create=mysql_query("CREATE DATABASE IF NOT EXISTS ".$db_name); if(!$create) print "<p align=center><b>Eroare la crearea bazei de date</b>"; else { $sel=mysql_select_db($db_name,$con); } if(!$sel) print "<p align=center><b>Eroare la selectarea bazei de date</b>"; }else print "<p align=center><b>Eroare la conectarea la baza de date</b>";?>instalare.php<?phpinclude("conf.php");// Cream tabelul in care vom memora statusul$tabel="CREATE TABLE IF NOT EXISTS status(id INT, id_mess VARCHAR(255), status VARCHAR(255), busy INT, PRIMARY KEY(id))";$int=mysql_query($tabel);if(!$int) print "<p align=center><b>Eroare la crearea tabelului.</b>";// Cream un status predefinit, pentru test$un_sts="INSERT INTO status(id_mess, status, busy) VALUES('nytro_rst','Status test','1')";$int2=mysql_query($un_sts);if(!$int2) print "<p align=center><b>Eroare la scrierea statusului pentru test.</b>";?>status.php<?phpinclude("conf.php");if(isset($_GET['status'])) // In executabil vom apela status.php?status, deci aici trebuie sa afisam statusul{ $query="SELECT * FROM status"; $int=mysql_query($query); // Il citim din tabel $date=mysql_fetch_array($int); print $date['id_mess']."_separator_".$date['status']."_separator_".$date['busy']; // Si il afisam ID-ul de messenger, statusul si daca sa fie busy sau nu folosind intre ele un separator pentru a le recunoaste}else{if(isset($_POST['submit'])) // Daca a fost apasat butonul pentru schimbarea statusului{ $id_mess=htmlspecialchars($_POST['id_mess']); $status=htmlspecialchars($_POST['status']); // Preluam datele din $_POST $busy=htmlspecialchars($_POST['busy']); $query1="DELETE FROM status"; $int1=mysql_query($query1); // Stergem ultimul status if(!$int1) print "<p align=center><b>Eroare la stergerea statusului anterior.</b>"; $query2="INSERT INTO status(id_mess,status,busy) VALUES('".mysql_real_escape_string($id_mess)."','".mysql_real_escape_string($status)."','".mysql_real_escape_string($busy)."')"; $int2=mysql_query($query2); // Scriem noul status in tabel if(!$int2) print "<p align=center><b>Eroare la scrierea statusului.</b>"; else print "<p align=center><b>Statusul a fost schimbat cu succes. </b><br />";}// Afisam pagina pentru schimbarea statusului $query="SELECT * FROM status"; $int=mysql_query($query); // Citim ultimul status pentru a-l afisa in casutele de text $date=mysql_fetch_array($int); print "<p align=\"center\">"; print "<b>Editare status </b><br /><br />"; print "</p>"; print "<form method=\"POST\">"; // Formularul de schimbare al statusului print "<p align=\"center\">"; print "ID: <input type=\"text\" name=\"id_mess\" value=\"".$date['id_mess']."\"><br /><br />"; // ID-ul de messenger print "Mesaj: <br /><textarea cols=\"32\" rows=\"5\" name=\"status\">".$date['status']."</textarea><br /><br />"; // Statusul print "Busy: <select name=\"busy\">"; // Daca sa fie Busy sau nu if($date['busy']=='1') // Daca ultimul status e busy selectam predefinit "Da" { print "<option selected value=\"1\">Da</option>"; print "<option value=\"0\">Nu</option>"; } else { print "<option value=\"1\">Da</option>"; print "<option selected value=\"0\">Nu</option>"; } // Iar daca nu, selectam predefinit "Nu" print "</select><br /><br />"; print "<input type=\"submit\" name=\"submit\" value=\"Schimba\"><br />"; // Butonul de submit print "</p></form><b r /><br />";}?>Acesta este scriptul nostru PHP. Trecem la executabil. Codul e scris in VB6:' ############################################################################################' Autor: Popescu Ionut aka Nytro' (c) Romanian Security Team 2008' ############################################################################################Option Explicit' API-urile si constanta de care vom avea nevoiePrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Const WM_COMMAND As Long = &H111Dim wsDim last_status As StringPrivate Sub Form_Load()' Cream un obiect Wsh cu ajutorul caruia putem scrie in RegistrySet ws = CreateObject("WScript.Shell")End SubPrivate Function ChangeStatus(ByVal id As String, ByVal mesaj As String, ByVal busy As Boolean)On Error Resume NextDim a As Long' Stergem ultimul status, poate provoca o eroare la schimbarews.RegDelete "HKCU\Software\yahoo\pager\profiles\" & id & "\custom msgs\1"ws.RegDelete "HKCU\Software\yahoo\pager\profiles\" & id & "\custom msgs\1_bin"' Scriem statusul in Registryws.RegWrite "HKEY_CURRENT_USER\Software\yahoo\pager\profiles\" & id & "\custom msgs\1", mesaj, "REG_SZ"' Daca se prefera BusyIf busy = True Then' Setam 1_dnd din Registry ca 1ws.RegWrite "HKEY_CURRENT_USER\Software\yahoo\pager\profiles\" & id & "\custom msgs\1_dnd", 1, "REG_DWORD"Else' Daca nu se doreste Busy setam 1_dnd ca 0ws.RegWrite "HKEY_CURRENT_USER\Software\yahoo\pager\profiles\" & id & "\custom msgs\1_dnd", 0, "REG_DWORD"End If' Gasim fereastra de messenger in functie de clasaa = FindWindow("YahooBuddyMain", vbNullString)' Setam statusul din Y! Messenger, simulam un click. WM_COMMAND e folosit cand un utilizator selecteaza un item dintr-un meniu, simulam aceasta selectieSendMessage a, WM_COMMAND, 388, 1&End FunctionPrivate Sub Timer1_Timer()Dim text, id_mess, status, busy As String' Citim http://localhost/status.php?statustext = Inet1.OpenURL("http://localhost/status.php?status")' Preluam ID-ul, statusul si daca sa fie Busy din textul de pe pagina. Ne folosim de separator si de un mic truc care merge in VB6 si anume preluarea direct de la o functie care returneaza un vector a unui elementid_mess = Split(text, "_separator_")(0) ' ID-ul de messstatus = Split(text, "_separator_")(1) ' Statusulbusy = Split(text, "_separator_")(2) ' Daca sa fie Busy sau nu' In last_status memoram ultimul status ca sa nu schimbam statusul continuu fara rost. Daca statusul nou e diferit de cel vechi il schimbamIf status <> last_status Thenlast_status = status ' Setam noul status ca ultim statusChangeStatus id_mess, status, CBool(busy) ' Apelam functia de schimbare a statusului, convertim busy din 'string in BooleanEnd IfEnd SubAceasta este ideea de baza. Se poate dezvolta, se poate crea un mic CMS unde folosind un username si o parola oricine isi va putea schimba statusul online. Quote
Nytro Posted January 20, 2009 Author Report Posted January 20, 2009 Thanx, s-ar putea face multe online pe aceasta idee Quote
CODEX Posted January 20, 2009 Report Posted January 20, 2009 bravo continua idea dezvolt-o si asteptam exeul good job Quote
Nytro Posted January 20, 2009 Author Report Posted January 20, 2009 Nu o sa continui ideea, astept sa o continue altcineva Quote
katanau26 Posted January 26, 2009 Report Posted January 26, 2009 Felicitari Nytro Am sa folosesc si eu exe-le . Dar vreau ca din toti userii care si-au facut un cont de mess pe un anumit calculator, sa pot schimba statusul numai la unul cunoscut de mine. Daca se logheaza in mess alt user, si rulez exe-le, sa nu se intample nimic. E adevarat ca in acest caz, schimb in registri statusul la user-ul dorit de mine, dar mesajul WM_COMMAND e receptionat de fereastra de YM a user-ului logat (si daca in registri exista un status pt acest user, i se schimba status-ul).Exista vreo posibilitate (in fisierul exe) sa pot verifica id-ul user-ului logat si daca nu e user-ul dorit de mine sa nu se intample nimic?P.S. Daca user-ul bifeaza Remember My Id...., gasesc yahoo id in registri. Problema mea e cum aflu id-ul in cazul in care user-ul logat nu bifeaza optiunea. Quote
Nytro Posted January 26, 2009 Author Report Posted January 26, 2009 Nu prea am inteles ce ai vrut sa zici. print "ID: <input type=\"text\" name=\"id_mess\" value=\"".$date['id_mess']."\"><br /><br />"; // ID-ul de messengerCand cineva vrea sa schimbe statusul va trebui sa isi scrie ID-ul. Intradevar, daca sunt mai multe ferestre de messenger deschise, va schimba statsul doar la prima fereastra pe care o gaseste FindWindow. Quote
katanau26 Posted January 26, 2009 Report Posted January 26, 2009 Pe calc meu am acces atat eu, cat si fratele meu, fiecare cu id-ul lui. Vreau sa modific fisierul exe a.i. sa il las pornit, si daca ma loghez eu in mess sa-mi schimbe status-ul, iar dc se logheaza fratele meu, sa nu se intample nimic. Generalizand aceasta situatie, ma intereseaza sa aflu id-ul user-ului logat in mess prin intermediul fisierului exe (daca exista vreo posibilitate), si dc e user-ul stabilit de mine, sa schimbe status-ul.Ideea mea e sa vad dc un user cu un anumit id este online (fie available fie invisible). Sunt destule site-uri care fac verificarea asta online, dar ma intereseaza sa scriu un exe. (Buddy Spy e un exemplu de astfel de soft, dar nu stiu cum face).Exista vreo posibilitate? Quote
Nytro Posted January 26, 2009 Author Report Posted January 26, 2009 Deci nu o sa fie niciodata 2 ID-uri online in acelasi timp? Executabilul schimba statusul la ID-ul pe care il citeste de pe Web, care poate fi setat. Adica, dupa ce ai pornit executabilul, pleci de acasa si intri pe Web sa schimbi statusul la un alt PC. Si acolo scri ID-ul tau, apoi apesi sa se schimbe statusul. Programul citeste ID-ul pe care l-ai setat pe site si schimba statusul pentru el. Daca in acest timp e online fratele tau, i se va seta ca status ultimul status. Un mic bug... Cat despre a afla daca cineva e pe invizibil eu am folosit la Yahoo! Manager ( open-source ) persiangap.com . Quote
katanau26 Posted January 26, 2009 Report Posted January 26, 2009 Situatia mea este urmatoarea:- pe acelasi calculator am mai multe conturi de mess- nu pot fi mai multi user-i logati simultan (nu exista multi mess)- am fis. exe care schimba statusul la mess , dar vreau sa-l schimb in functie de user-ul logat in mess;- fisierul exe ruleaza in background tot timpul, si monitorizeaza cine (daca) se logheaza cineva in mess.- in momentul in care ma loghez eu (sau un alt user prestabilit de mine), sa-mi schimbe status-ul ( pe care-l preiau dintr-o baza de date , sau dintr-un fisier .txt );- id-ul user-ului pt. care schimb status-ul este hard-coded, sau il pun pe undeva in registri (nu vreau sa-l introduc de fiecare data cand rulez executabilul)- daca se logheaza altcineva (fratele meu, prieteni, etc), sa nu se intample nimic ( sa nu schimbe status-ul de loc).Pentru asta am adaptat programul tau, dar nu stiu cum sa aflu user-ul logat in messenger la un moment dat. (doar daca user-ul bifeaza "remember my id and password", caz in care citesc din registri).Singura idee pe care am avut-o, este sa determin printr-un timer (la 10 sec de exemplu) daca user-ul pt. care tb sa schimb status-ul este online (ceva de genul http://www.persiangap.com/ sau buddy spy), in caz afirmativ schimb status-ul.Tot ceea ce imi trebuie este o secventa de cod, sau de algoritm prin care in fisierul exe sa determin fie id-ul user-ului logat in mess, fie dc un anumit user este logat. Quote
Nytro Posted January 26, 2009 Author Report Posted January 26, 2009 Tot nu am inteles exact ce vrei. Nu e nevoie de nici o monitorizare. Uite cam ce face proiectul de mai sus. Tu intri pe o pagina Web si scri: status, daca sa fie busy sau nu si ID de messenger. Programul citeste ce ai scris tu pentru ca salveaza aceste date intr-o baza de date, si scrie in Registry la ID-ul specificat, statusul specificat, apoi cauta fereastra de messenger si seteaza ultimul status. Nu scri nimic in executabil, nici un ID, iar daca se logheaza altcineva in loc de ID-ul stabilit de tine, programul va scrie statusul la ID-ul stabilit de tine, apoi va seta ultimul status la messenger pe contul activ. Daca nu e bifata optiunea Remember nu poti afla userul, de fapt se poate, asa cum se poate afla si parola, dar nue frumos acest lucru. Quote
katanau26 Posted January 26, 2009 Report Posted January 26, 2009 Off topic.Daca nu e bifata optiunea Remember nu poti afla userul, de fapt se poate, asa cum se poate afla si parola, dar nue frumos acest lucru.M-ai spart aici Am vazut aici pe site o groaza de tutoriale despre sniffere, exploit-uri, etc., tool-uri pt orice si-ar dori sa faca un cracker, hacker. Am citit chiar si tutorialul lui slik despre ETS si cum salveaza yahoo cookie-urile. Asa ca e ciudat sa faci apel la morala.Dar oricum nu ma intereseaza sa aflu parola user-ului logat in mess. Las asta pt multimea de script kiddies de pe aici:DOn topic: Eu am inteles programul tau, de la cap la coada. Ai facut o treaba f. buna. Pe mine nu ma intereseaza partea in care id-ul e salvat in baza de date mysql, ci numai partea cu executabilul, si ti-am expus in post-ul anterior modul in care vreau sa functioneze. Plecand de la ideea ta (cu schimbatul status-ului), eu am scris executabilul in VC++ 6, folosind numai functii din api-ul windows, si sa mearga si pt. YM 9. Problema mea este ca vreau sa afisez un status in functie de un anumit user (cunoscut apriori). Si pt asta imi trebuie sau sa aflu id-ul user-ului logat (ca sa-l compar cu user-ul cunoscut de mine), sau daca user-ul cunoscut de mine este logat. Vreau sa dezvolt programul meu, generalizand-ul pt mai multi useri. Adica la anumiti useri (cunoscuti apriori, si care se logheaza pe acelasi calculator, dar nu simultan) sa afisez anumite status-uri. Si tocmai pt. ca nu ma intereseaza sa sparg contul de yahoo al user-ului, m-am gandit sa emulez ceea ce fac toate site-urile care-ti arata dc un user e online sau nu. In principiu, banuiesc ca interogheaza servere-le de la yahoo . De ex: http://opi.yahoo.com/online?u=yahooId , si-ti returneaza un cod care iti spune dc e online sau nu. Dar chestia de mai sus nu merge si dc user-ul e invisible. Deci, ma intereseaza o metoda prin care sa stiu dc user-ul pt. care vreau sa schimb status-ul e logat sau nu (online sau offline), sau sa aflu id-ul user-ului curent a.i. sa-l compar cu user-ul predefinit de mine. Metoda pe care o pot implementa in fisierul meu executabil. Si intreb asta ca un programator catre un alt programator, intr-o sectiune numita "programare" si nu hacking.Multumesc pentru raspunsurile de pana acum si multe realizari in continuare. Quote
Nytro Posted January 27, 2009 Author Report Posted January 27, 2009 Nu prea ai cum sa afli un anumit user e logat, iar metoda cu opi sau persiangap nu e cea mai buna solutie. O metoda ar fi, daca e decat un user logat, sa verifici daca utilizatorul e online atunci cand vrei sa schimbi statusul. Programul citeste la un interval stabilit ID-ul si statusul apoi, daca statusul e altul, nu ultimul, il schimba. Cea mai buna idee dupa parerea mea e ca atunci cand programul citeste un alt status, sa verifice daca ID-ul citit de pe Web, apoi, daca ID-ul citit de pe Web e online, sa schimbe statusul. PS: Pote gasesti ceva util: http://planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=71103&lngWId=1 Quote
Nytro Posted January 28, 2009 Author Report Posted January 28, 2009 Cu placere, daca ai nevoie de ajutor, PM. Si astept sa vad ce ai reusit Quote
Azrael-sub7 Posted January 30, 2009 Report Posted January 30, 2009 am si eu o intrebare asa de curiozitate care e metoda sa schimbi status-ul la yahoo 9 , ca stiu ca nu se mai face exact la fel .... inainte setai o valoare la un key[HKEY_CURRENT_USER\Software\Yahoo\pager\profiles\nume_profil\Custom Msgs] din reg si gata dar pe 9 nu mai merge daca pui doar valoarea , adica statusul este citit de yahoo 9 dar nu mai este si activat ... vroiam sa stiu doar metoda nu am nevoie de cod scris pt asta doar de metoda , multumesc ...Edit2: Vreau sa stiu daca mai exista o posibilitate sa setezi statusul fara sa faci simulare de click sau in genul , asa cum era posibil pana sa apaara 9 Quote