Jump to content
Nytro

Schimba statusul de pe Web

Recommended Posts

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

<?php

include("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

<?php

include("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 nevoie

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Const WM_COMMAND As Long = &H111

Dim ws
Dim last_status As String

Private Sub Form_Load()
' Cream un obiect Wsh cu ajutorul caruia putem scrie in Registry
Set ws = CreateObject("WScript.Shell")
End Sub

Private Function ChangeStatus(ByVal id As String, ByVal mesaj As String, ByVal busy As Boolean)
On Error Resume Next

Dim a As Long

' Stergem ultimul status, poate provoca o eroare la schimbare

ws.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 Registry
ws.RegWrite "HKEY_CURRENT_USER\Software\yahoo\pager\profiles\" & id & "\custom msgs\1", mesaj, "REG_SZ"

' Daca se prefera Busy
If busy = True Then
' Setam 1_dnd din Registry ca 1
ws.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 0
ws.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 clasa
a = 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 selectie
SendMessage a, WM_COMMAND, 388, 1&

End Function

Private Sub Timer1_Timer()
Dim text, id_mess, status, busy As String

' Citim http://localhost/status.php?status

text = 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 element

id_mess = Split(text, "_separator_")(0) ' ID-ul de mess
status = Split(text, "_separator_")(1) ' Statusul
busy = 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 schimbam

If status <> last_status Then
last_status = status ' Setam noul status ca ultim status
ChangeStatus id_mess, status, CBool(busy) ' Apelam functia de schimbare a statusului, convertim busy din 'string in Boolean
End If

End Sub

Aceasta 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.

Link to comment
Share on other sites

Felicitari Nytro

Am sa folosesc si eu exe-le :D.

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.

Link to comment
Share on other sites

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 messenger

Cand 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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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 .

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 :D 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:D

On 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.

Link to comment
Share on other sites

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 :)

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...