Jump to content

compile

Members
  • Posts

    43
  • Joined

  • Last visited

Everything posted by compile

  1. titlul nu se refera la limbaje de programare pentru incepatori, se refera la concepte generale despre limbaje de programare explicate ca unui incepator. si you don't fuck ASM, ASM fucks you
  2. cred ca te referi la o functie void cuvant() { //cod c++ } cuvant();
  3. E posibil sa ma insel dar cred ca problema este ca nici unul din cei doi nu trebuie sa stie mai mult decat orice alta persoana. Daca fiecare are jumatate din parola atunci ei sunt cu cateva ordine de magnitudine mai aproape de aflarea parolei decat cineva care nu are nimic. Daca i-am da unuia o valoarea aleatoare de 100 de biti si celuilalt (valoarea aleatoare XOR parola)? Asa nici unul nu ar fi mai aproape de parola dar daca se intalnesc si isi XOR-uiesc valorile obtin parola (R XOR (R XOR P) = P).
  4. 1. in utilizarea rezonabila un pachet UDP nu ar trebui sa aiba delay la trimitere, spre deosebire de TCP nu astepti nici o confirmare deci viteza depinde doar de numarul si dimensiunea pachetelor, ar trebui sa poti sa trimiti/primesti probabil zeci de mii de pachete pe secunda. Daca e un delay cauta-l in modul in care trimiti, cand trimiti, cat trimiti. Incearca sa ti dimensiunea unui pachet sub 512 octeti ca altfel pot fi fragmentate 2. nu cred ca exista vreun motiv pentru care sa trimiti broadcast cand vrei sa comunici doar cu serverul. Incarci reteaua si toate echipamentele din retea degeaba. Dupa ce ai primit confirmarea de la server trimite doar pe IP-ul lui.
  5. Daca inclini mai mult catre software si high level as zice sa mergi pe arduino sau raspberry pi, daca vrei mai low level si electronica poti sa incerci sa cumperi niste PIC-uri si un programator (putin mai scump dar mai flexibil) si sa te joci pe un breadboard.
  6. Nu trebuie sa-i dai neaparat char chiar daca functia asta cere. Poti sa-i dai orice adresa de memorie si el va trimite ce gaseste acolo byte cu byte pana acopera dimensiunea data. De ex ca sa trimiti: int ival = 42; send(0, (char*)&ival, sizeof(int), 0); //sizeof(int) = 4 si ca sa primesti: int ival = 42; recv(0, (char*)&ival, sizeof(int), 0);
  7. Nu sunt absurd, doar nu o sa fac un site in ASM doar pentru ca se poate. Idea mea era ca pe masura ce limbajele de programare avanseaza, rolul programatorului scade proportional. Cine scrie in HACK, de exemplu, nu trebuie sa-si mai faca probleme cu tipul returnat putandu-se concentra pe alte probleme de nivel mai inalt. Asta e un lucru foarte bun, cel putin pentru firma, dar in acelasi timp pe programatorii nu o sa-i mai intereseze cum functioneaza un sistem ci doar cum sa-l foloseasca astfel incat sa obtine rezultatele care ii intereseaza, ceea ce pentru mine e un pic trist.
  8. e perfect adevarat ca viteza e imbunatatita si exista toate justificarile economice sa cresti viteza cu care este scris codul, dar in acelasi timp nici Dali nu folosea Photoshop.
  9. cum sa dai frate vina pe administratori? daca tu iti lasi usa descuiata si cineva iti fura tot din casa cum ar fi sa-ti zica politia: "le dam drumul la hoti, e vina ta ca ai lasat usa deschisa"
  10. viteza depinde de cine scrie codul...
  11. in RFC sunt specificati patru pasi 1) A --> B SYN my sequence number is X 2) A <-- B ACK your sequence number is X 3) A <-- B SYN my sequence number is Y 4) A --> B ACK your sequence number is Y dar in practica 2) si 3) sunt uniti in acelasi pachet (dupa cum a zis si el)
  12. Daca sunt toate in aceeasi retea (sub acelasi router) poti sa sniffezi DHCP requesturile pe care le trimit la router pentru a li se atribui ip-urile. Daca al patrulea este dincolo de router nu se poate pentru ca MAC-urile celor trei sunt ascunse de router.
  13. Faci confuzie intre constanta gravitationala, acceleratia gravitationala si greutatea. Acceleratia gravitationala g este aproximativ 9.8 si variaza in functie de distanta fata de centrul pamantului. Greutatea G=m*g. Constanta gravitationala e intr-adevar o constanta universala si este implicata in calculul fortelor de atractie dintre doua corpuri. Ca sa intelegi cel mai usor de ce nu "cade luna" cel mai simplu e sa-ti imaginezi "tunul lui Newton". Daca tragi cu un tun orizontal fata de suprafata Pamantului, ghiuleaua va cadea la o oarecare distanta de tine, daca maresti viteza cu care porneste ghiuleaua aceasta va cadea din ce in ce mai departe ajungand pana la urma sa ocoleasca Pamantul si sa te loveasca in spate. In situatia asta exista trei posibilitati (de fapt mai multe dar nu intru in detalii): 1: viteza este perfecta si ghiuleaua se va roti la nesfarsit in jurul Pamantului 2: viteza este putin mai mica si se va apropia cate putin la fiecare rotatie pana cand va cadea inapoi pe Pamant (cum fac satelitii artificiali) 3: viteza este putin mai mare si ghiuleaua se va departa putin la fiecare rotatie pana cand scapa complet de atractia Pamantului si dispare in spatiu (cum face Luna)
  14. @staticwater ai mers destul de bine dar ai uitat de a patra posibilitate: P(Success) P(Success) P(Success)=p*p*p P(2/3) devine p*p*(3 - 2p) Punctul de intersectie e la 0.5 deci pentru valori mai mici ale lui p rezultatul este mai mic iar pentru valori mai mari este mare. Cu alte cuvinte ce alegi depinde de p adica de cat de bine arunci. pentru p=0 nu conteaza pentru ca oricum pierzi pentru p<0.5 alege prima varianta(ex p=0.4 => P(2/3)=0.352) pentru p=0.5 nu conteaza ce alegi, sansele sunt egale pentru p>0.5 alege a doua varianta (ex p=0.6 => P(2/3)=0.648 pentru p=1 nu conteaza pentru ca oricum castigi
  15. select este foarte util (mai ales pe partea de server) dupa ce ai invatat sa-l folosesti dar daca am inteles bine tu cauti un recv care sa faca timeout si in cazul asta select e overkill. recv va returna -1 cu eroarea WSAEWOULDBLOCK atunci cand incerci sa citesti dintr-un socket non-blocking unde nu este nimic de citit asa ca e simplu sa pui recv intr-un loop verificand diferenta de timp. Ti-am facut un exemplu rapid pentru win: #include <winsock2.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") bool make_nonblocking(SOCKET sock) { u_long mode = 1; return ioctlsocket(sock, FIONBIO, &mode) != SOCKET_ERROR; } int recv_to(SOCKET sock, char* buff, int len, int flags, unsigned int tout) { DWORD start = GetTickCount(); int ret = recv(sock, buff, len, flags); while(ret == -1 && WSAGetLastError() == WSAEWOULDBLOCK) { Sleep(10); if(GetTickCount() - start > tout) { SetLastError(WSAETIMEDOUT); return -1; } ret = recv(sock, buff, len, flags); } return ret; } int main() { WSADATA wsd; if(WSAStartup(0x0202, &wsd) == 0) { SOCKET sock =socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sock != INVALID_SOCKET) { sockaddr_in sa; memset(&sa, 0, sizeof(sockaddr_in)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr("127.0.0.1"); sa.sin_port = htons(99); if(connect(sock, (sockaddr*)&sa, sizeof(sockaddr_in)) != SOCKET_ERROR) { if(make_nonblocking(sock)) { char buff[33]; memset(buff, 0, sizeof(buff)); int ret = recv_to(sock, buff, 32, 0, 5000); printf("ret=%i\n", ret); printf("err=%i\n", WSAGetLastError()); } closesocket(sock); } } WSACleanup(); } getchar(); return 0; }
  16. Visual Studio pt C/C++/C# notepad++ si vim pentru toate celelalte
  17. O sa te lovesti de limita de entropie a ceea ce vrei tu sa arhivezi. In principiu, in teoria informatiei, exista o cantitate minima de informatie prin care poti transmite date, vezi Entropy (information theory)
  18. Topicul asta imi aduce aminte de "number one exporter of potassium, other countries have inferior potassium" Mi se pare putin ipocrit sa ne plangem ca alte tari fura creatiile inventatorilor nostrii geniali cand noi luam tot de pe torente in loc sa dam 10 lei pe un DVD. btw, a citit cineva care a terminat clasa a 8-a brevetul lui Rusetel? http://bd.osim.ro/pdf/116000-/116400-/116426.pdf ...la dracu e un motor cu aburi, bateria incalzeste elementul incandescenet, elementul evapora apa si apa impinge pistoanele. Nu e chiar demn de premiul Nobel indiferent de ce zic o suta de bloggeri. In fine, hai sa enumeram ce au facut alti romani ca sa ne simtim mai bine ca ne-am nascut in aceeasi tara cu ei.
  19. porneste consola cu drepturi de administrator
  20. compile

    Algoritmica

    Algorithms, 4th edition de Robert Sedgewick. Are vreo 1000 de pagini si foloseste java ca limbaj. http://fivedots.coe.psu.ac.th/Software.coe/242-535_ADA/Background/Readings/Robert%20Sedgewick%20and%20Kevin%20Wayne%20-%20Algorithms,%204th%20edition.pdf Pe baza cartii au facut si niste cursuri online cu cateva ore de video: https://www.coursera.org/course/algs4partI si https://www.coursera.org/course/algs4partII
  21. rez trebuie alocat cu dimensiune ca altfel iti crapa char* rez=new char[1000]; //poti sa treci odata prin argumente ca sa aflii lungimea exacta daca nu o sti pe cea maxima si apoi trebuie initializat cu 0 ca sa nu ai surprize la strcat memset(rez, 0, 1000); ca sa adaugi spatiu faci strcat(rez, " ");
  22. Sunt constient de problema threadurilor de asta am si gasit solutia de mai sus care permite hookingul fara sa fie nevoie sa dai move/restore la bytes la fiecare apelare fiind mult mai safe pentru ca riscul ca un thread sa crape este foarte mic(doar la instalarea hookului daca se apleaza API-ul dupa ce ai mutat cei 5 octeti dar inainte de a pune jumpul).
  23. Uitasem de mov edi,edi. push ebp, mov ebp, esp sunt doar 3 octeti. Interesanta chestia cu un patch pe alea 5 NOP-uri si un jmp in spate nu stiam ca e facuta intentionat si ca cel putin la dll-urile din Windows poti sa te bazezi pe ea. Daca faci restore la cei 5 octeti la fiecare apelare atunci metoda nu pare a fi thread safe. Eu fac altfel ca sa nu trebuiasca sa mut mereu instructiunile sau sa ma joc direct cu stack-ul: 1. iau primii 5* octeti din API de la adresa XXXX si ii pun la adresa YYYY. In locul lor pun un jump catre functia mea de hook(cum faci si tu la 0. si 1.) 2. dupa cei 5 octeti, la YYYY+5, pun un jump catre restul API-ului la adresa XXXX+5 3. cand se apeleaza API-ul face jump catre functia mea care isi face treaba cu parametrii apoi apeleaza YYYY ca pe API-ul initial. 4. cand apeleaza YYYY se executa primii 5 octeti apoi se sare la restul API-ului la XXXX+5. 5. pentru ca YYYY e apelata de catre functia de hook atunci returneaza tot in functia de hook asa ca apelantului initial pot sa-i returnez orice valoare. Problema ambelor metode este ca la unele API-uri si la DLL-uri de la alti vendori o functie nu incepe intotdeauna cu cele trei instructiuni de 5 octeti, adica poate fi una de 2 apoi una de 4 sau de 5 sau orice alta combinatie insumand mai mult de 5 creand probleme cand iei fix 5 octeti pentru ca spargi o instructiune in doua si nu o sa se execute corect. Asta intrebam de fapt, daca ai gasit o alta solutie sa tratezi situatiile astea. Solutia mea e un mic dissassembler care imi da dimensiunea instructiunilor ca sa nu le sparg deci 5* de mai sus poate varia intre 1 si 15.
  24. @Nytro: interesanta prezentarea dar sunt curios de o chestie, atunci cand faci patch-ul API-ului(presupun ca e un far jump de 5 octeti) cum te asiguri ca pici exact intre instructiuni? majoritatea probabil incep cu "push ebp; mov ebp, esp"=5 octeti, dar exista posibilitatea sa inceapa cu altceva si sa spargi o instructiune.
×
×
  • Create New...