La cererea a mai multor utilizatori am decis sa fac un tutorial pe tema patchului idle pentru Y!M 11 pe care l-am realizat nu demult. In aces tutorial nu va dau adrese exacte cum trebuie sa procedati concret pentru Y!M, ci va arat cum am facut eu de la 0, ceea ce ar folosi si pentru alte chestii. Va reamintesc ca patchul poate fi downloadat aici Vom folosi urmatoarele programe: -ollydbg 2.x -ollydump 2.x Deschidem yahoomessenger.exe in olly si asteptam pana se analizeaza toate legaturile YahooMessenger.exe are ~3mb, mult cod disasamblat, atunci unde trebuie sa catuam ceea ce ne trebuie? Vom face referinta la toate functiile care contin in ele sirul de caractere "Idle" Click dreapta -> Search for all referenced strings Dupa ce apare lista cu toate stringurile din program, dam ctrl+f, introducem idle si punem breakpoint la toate referintele gasite. Dupa care ne intoarcem in main thread, si dam run (F9). Vedem ca inainte ca sa apara fereastra principala de la Y!M, ne stopam la niste adrese pe care am pus breakpoint mai inainte. Deci astea sigur nu sunt alea care ne trebuie, intrucat noi vrem sa prindem exact momentul in care se schimba statusul in idle. Se mai analizeaza niste fisiere, dupa care apare fereastra principala. Ne logam ca de obicei, trecand inca peste doua breakpointuri nefolositoare si niste analize, si dupa ce ne-am logat, ne asiguram ca setarile messengerului asigura schimbarea in Idle dupa un minut de inactivitate. Acum nu ne ramane decam sa dam ok, si sa asteptam un minut pana se face apelarea la functia necesara pentru schimbarea statusului in Idle... Si uite ca dupa un minut de asteptare, olly opreste pe un breakpoint interesant, pe adresa 63CFFE. Nu stim exact daca e ceea ce ne trebuie, dar facem o presupunere, pentru ca sansele sunt mari, asa cum s-a oprit exact cand trebuia sa se schimbe statusul in idle. Ne ridicam putin mai sus, pana la inceputul functiei, pe adresa 63CFE7, si punem breakpointuri primele 10-15 randuri. Acum aceasta este sigur functia care ne trebuie, dar in cazul in care faceti ceva pe alt program, ar fi bine sa va verificati inca o data, cu breakpointuri, inainte de a schimba ceva in cod. Analizand putin primele linii de cod, deja e evident ca e transmis ca parametru un argument chiar pe primul rand. Cu breakpoint pe 63CFE8, putem vedea ca e 1 in cazul in care statusul trebuie schimbat in idle, si 0 in cazul in care statusul de idle trebuie scos. In cazul nostru e evident ca, pentru ca statusul de idle sa nu se scoata nici o data, trebuie ca argumentul sa fie tot timpul 1, dar in alte cazuri poate fi diferit. Asa ca analizam putin codul Pana pe adresa 63D003 inclusiv se face diferentierea dintre statusul curent si statusul in care trebuie sa fie schimbat. Insa pe adresa 63D008 se face o comparatie intre cifra reprezentata de statusul curent si argumentul transmis. Dupa care, daca nu sunt egale (63D00D : JE SHORT 63D06E) se trece prin toat procesul de schimbare a statusului, incepand cu 63D00F si termnand cu 63D06E. In caz contrar, se trece imediat la ultima adresa, si nu sunt efectuate schimbari. Deci, dupa cum am zis si mai sus, totul depinde de argumentul transmis, astfel incat daca se transmite doar 1, la prima schimbare statusul curent va fi reprezentat de 0 (NO IDLE) si se va trece prin procesul de schimbare, devenind idle. Dupa care, de fiecare data cand Y!M incearca sa iasa din idle, argumentul va fi tot 1, si comparatia de care am zis mai sus va efectua saritura peste procesul de schimbare a statusului, astfel el ramane neschimbat chiar si la miscarea cursorului/apasarea oricarei taste. Pentru a efectua asta, trebuie sa schimbat exact linia de pe 63CFE8, in loc ca in registrul BL sa fie introdus argumentul, facem asa ca tot timpul sa fie introdus 1. Si dam Assemble. Daca mai asteptam un minut, vedem ca se intra in idle, in schimb dupa ce se iese din starea de inactivitate, statusul ramane acelasi, idle. Acum, unii pot avea intrebarea, daca facem asa, atunci de fiecare data cand se schimba starea de activitate, se apeleaza functia nonsens, si se pierde timp de executie degeaba. Atunci trebuie doar sa debifam optiunea de a ne arata idle in Y!M, si atunci functia nu se mai apeleaza, in timp ce noi ramanem cu statusul de Idle activ. La sfarsit, cu ollydump salvam programul modificat, si il rulam ca de obicei. Dupa cum se vede, a fost extrem de simplu sa trisam messegerul nou pentru a avea statusul de inactiv tot timpul. Chiar si cineva cu cunostinte de baza in Debugging poate realiza acest proiect in mai putin de 30 de minute.