Krisler12™ Posted July 4, 2010 Report Posted July 4, 2010 Salut !Va rog si eu sa ma ajutati cu o chestie care stiti:As vrea exemplu de un program foarte simplu (comentat daca se poate) care sa faca urmatorul lucru:-sa citeasca codul unui alt program ca si cum ai face tu asta cu OllyDbg si la al doilea NOP citit sa scrie un jmp catre o adresa pe care urmeaza sa o scrie chiar inainte de adresa de final a programului (nu dupa aceasta ci exact inaintea ei sau daca nu exact dupa asta dar as vrea sa stiu cum poti face sa stii care e aia) iar la aceasta adresa sa scrie codul in asm al unui MsgBox.Multumesc !PS: cum poti face ca sa scrie acel jmp nu la primul nop sau la aldoilea ci la o adresa anume specificata de tine ? Quote
phantomas90 Posted July 4, 2010 Report Posted July 4, 2010 Hmm, tu vrei sa faci un bypasser de parola sau de serial key.Eu unu nu am facut niciodata asa ceva.Dar ma gandesc ca poti sa folosesti un .exe debugger si sa vezi exact operatiile care se executa pe procesor, iti genereaza codul asm la toate operatiile.Asa vezi adresa care iti trebuie.Apoi cu "resource hacker" poti sa modifici un pic, dar ala scoate hex-ul.Trebuie un program care scoate si hexul si adresele la care se executa.E riscanta operatie.Incearca pe o copie a programului. Quote
Nytro Posted July 4, 2010 Report Posted July 4, 2010 Un executabil e format din mai multe sectiuni. Aceste sectiuni contin anumite tipuri de date. Exista sectiuni pentru cod masina, codul executabil propriu-zis, sectiuni pentru date initializate si sectiuni pentru date neinitializate. Daca incepi sa modifici un executabil trebuie sa sti ce faci pe acolo. NOP-urile nu cred ca sunt chiar degeaba. Daca vrei sa faci un crack ceva, cred ca cel mai simplu ar fi, desi nu stiu daca se poate, sa modifici un jmp. Probabil executabilul contine ceva de genyl: if(!serial_corect) zii_ca_nui_bun();. In Assembly, asta probabil este un jnz (jump not zero) si decat pui jz (jump zero). Bine, sunt cam paralel cu asta si probabil spun prostii. Insa ideea e sa lasi tu astea si sa incepi sa inveti lucrurile de baza. Daca chiar vrei, invata mai intai C++, cred ca e necesar, apoi Assembly, mai citestid espre structura PE si esti boss. Quote
Krisler12™ Posted July 4, 2010 Author Report Posted July 4, 2010 Hmm, tu vrei sa faci un bypasser de parola sau de serial key.Eu unu nu am facut niciodata asa ceva.Dar ma gandesc ca poti sa folosesti un .exe debugger si sa vezi exact operatiile care se executa pe procesor, iti genereaza codul asm la toate operatiile.Asa vezi adresa care iti trebuie.Apoi cu "resource hacker" poti sa modifici un pic, dar ala scoate hex-ul.Trebuie un program care scoate si hexul si adresele la care se executa.E riscanta operatie.Incearca pe o copie a programului.Asta stiu si eu ca se poate, am vazut si tutoriale daca imi aduc bine aminte. Dar cum fac sa automatizez tot procesul fara sa ma obosesc eu sa umblu cu debuggere si alte chestii. De ce ? Pai, sa zicem ca acel MsgBox nu ar fi chiar un MsgBox ci ar fi un connect back function sau un cod de keylogger sau orice altceva si nu pot sa ma duc eu personal sa ii umblu aluia in pc su reshacker si alte chestii.@Nytro: stiu la ce te referi, am auztit si eu de secitunile alea, sunt explicate foarte bine in tutorialele video despre cracking.Eu am zis asa sa imi dati un exemplu ca sa vad cum se face nu neaparat ca vreau eu sa scriu ceva numaidecat la al doilea NOP si nu la primul.De fapt ce vreau eu se poate rezuma astfel:1.Cum fac sa citesc in c++ codul ala in asm pe care il vezi in OllyDbg astfel incat sa stiu cand citesc un nop, jmp, jnz mov si asa mai departe ?2.Cum fac sa scriu ceva la o anumita adresa specificata de mine ?3.Cum imi pot da seama cand codul in asm al programului s-a terminat si aia e ultima adresa pe care o citesc ?Multumesc ! Quote
Ethereal Posted July 4, 2010 Report Posted July 4, 2010 Chiar aseara am gasit niste articole foarte interesante despre PE header:Inside Windows: An In-Depth Look into the Win32 Portable Executable File Format, Part 2Inside Windows: An In-Depth Look into the Win32 Portable Executable File Format Quote
loki Posted July 4, 2010 Report Posted July 4, 2010 nu pricep totusi ce vrei sa faci.- din constructia virusilor: se baga unde trebuie un jmp la inceputul codului executabilului spre coada sa unde se introduce programul virusului.- vrei sa faci un program sa scrie alt program pe disc? construiesti programul pe care vreu sa il scrii si il folosesti ca resursa, tablou ceva in programul care scrie.- nop-urile nu sunt degeaba, sunt utile daca vrei un program pe un numar exact de tacti (s-a cam dus moda) sau sa umpli o zona de memorie cu nopuri dar sa le umpli mai tarziu cu program pana mea.... nop e elementul neutru al programarii - vezi grupuri si legi de compozitie la mate.- nu stiu ce e ollydbg si-s oleaca ametit sa inteleg care e partea complicata a intrebarii Quote
Krisler12™ Posted July 4, 2010 Author Report Posted July 4, 2010 nu pricep totusi ce vrei sa faci.- din constructia virusilor: se baga unde trebuie un jmp la inceputul codului executabilului spre coada sa unde se introduce programul virusului.- vrei sa faci un program sa scrie alt program pe disc? construiesti programul pe care vreu sa il scrii si il folosesti ca resursa, tablou ceva in programul care scrie.- nop-urile nu sunt degeaba, sunt utile daca vrei un program pe un numar exact de tacti (s-a cam dus moda) sau sa umpli o zona de memorie cu nopuri dar sa le umpli mai tarziu cu program pana mea.... nop e elementul neutru al programarii - vezi grupuri si legi de compozitie la mate.- nu stiu ce e ollydbg si-s oleaca ametit sa inteleg care e partea complicata a intrebariice vreau sa fac ?Un virus sau cum vreti sa-i spuneti care se autoscrie in codul altor programe la o adresa pe care o gaseste el ca fiind "potrivita" sau la o adr4esa pe care sa i-o zic eu. Quote
loki Posted July 4, 2010 Report Posted July 4, 2010 Nu vei scrie tu codul la o adresa de memorie, executabilul se va rula acolo.Problema nu tine de asamblare, ci de studiul executabilelor, constructia lor. Pe mine ma depaseste, cauta exact subiectul asta.Cea mai simpla metoda folosita e cea de mai sus: jump in cod si din cod jump la startul exe-ului. Alte metode mergeau pe suprascrierea fisierului dar asta insemna ca el sa nu mai ruleze. Quote
SlicK Posted July 4, 2010 Report Posted July 4, 2010 Daca vrei sa rescrii un executabil in primul rand trebuie sa-ti faci griji doar daca nu vrei sa-l strici Ca sa "automatizezi" procesul pe care il faci cu olly trebuie sa folosesti un dissasembler si trebuie sa ti-l cam scrii singur( nu te-as sfatui sa faci asta decat daca vrei sa intrii adanc in arhitectura procesoarelor, machine code si executabile, daca te apuci atunci incepi de aici http://download.intel.com/design/intarch/manuals/24319101.pdf) totusi poti sa separi instructiunile din codul executabil folosind doar prima parte dintr-un disasembler anume parserul(e mai simplu de scris decat un dissasembler intreg dar tot nu e o chestie simpla) care iti da marimea intructiunii in functie de opcode deci poti stii unde se termina o instructiune oarecare si poti scrie ceva dupa ea fara sa risti sa suprapui 2 instructiuni(in marea majoritate asta cauzeaza un crash).Alta solutie ar fi de exemplu sa cauti call'uri deja existente(opcode 0xE8) si sa le rescrii adresa(urmatorii 4 bytes) dar tot trebuie sa te asiguri ca opcodul tau e chiar un opcode si nu face parte din alta instructiune(iti trebuie minim un dissasembly parser) (din cauza asta pica si varianta cu cautatul 0x90'ului pentru ca poti sa-l gasesti intr'o adresa de jump de exemplu)O alta problema pe care o ai este sa te asiguri ca executia va ajunge la adresa unde ai scris tu codul, si nu e asa usor cum pare.Cam singurul mod simplu in care poti face chestia asta(daca am inteles bine care e chestia) este sa rescrii o adresa din IAT pentru un API care stii sigur ca se va executa (ExitProcess la sfarsit sau GetStartupInfoA la inceput) si sa-i pui adresa catre codul tau redirectionand apoi call'ul.Cu siguranta mai sunt si alte metode dar nu-mi mai amintesc nici una acum Quote
Nytro Posted July 4, 2010 Report Posted July 4, 2010 A, tu vrei un virus care sa se scrie in alte executabile si sa ruleze cand ruleaza acele executabile. Cred.Pai nu e asa de usor. Virusul tau nu cred ca este format numai din shellcode (cod masina) ci are nevoie si de anumite date (ne)initializate, in sectiuni diferite. Asta inseamna ca acele date trebuie incarcate in memorie la adresa potrivita.De asemenea, daca reusesti sa faci asta, va trebui sa te intorci la adresa de la care ai sarit si astfel sa ruleze executabilul infectat.Da, in teorie totul e usor, practica ne omoara. Asa pateam si eu mereu, imi venea peste noapte cine stie ce idee si eram sigur ca va revolutiona lumea, dar cand incercam sa o pun in practica vedeam ca nu prea se poate. Quote