Krisler12™ Posted July 4, 2010 Report Posted July 4, 2010 Salut ! Cu totiii poate stiti ca ptr. a face un program mai rapid putem ori sa il scriem cap coada in asm (asembler) ori il scriem in c/c++ dar functiile care mananca multa memorie si mult timp le transformam in asm astfel putem crea programe hibride care sunt in c/c++ dar au si incluziuni de asm. Acuma, as avea si eu niste nelamuriri la care va rog sa imi raspundeti cei care stiti:1. Cum poti sa incluzi in c/c++ o functie in asm ?2.De inclus probabil ca nu ar fi asa de greu dar cum poti sa ii dai argumente din c/c++ functiei care este in asm ?3.Cum poti sa iei argumentele pe care le returneaza functia in asm si sa le folosesti mai departe in codul tau ?Multumesc mult ! Quote
Nytro Posted July 4, 2010 Report Posted July 4, 2010 Nu stiu Assembly si din cate vad nici tu nu sti. Deci nu are rost sa se chinuie cineva sa iti raspunda.Datele se pun pe stiva, parametrii, folosind "push", apoi se apeleaza functia din C++ de exemplu, daca asta vrei, apoi se scot datele depe stiva cu "pop".#include <stdio.h>char format[] = "%s %s\n";char hello[] = "Hello";char world[] = "world";void main( void ){ [URL="http://www.codeguru.com/forum/showthread.php?t=308575"]__asm[/URL] { mov eax, offset world push eax mov eax, offset hello push eax mov eax, offset format push eax call printf pop ebx pop ebx pop ebx }}Inca o data, nu stiu Assembly... Quote
Krisler12™ Posted July 4, 2010 Author Report Posted July 4, 2010 Eu ma refream la o functie de genul:int suma (int a, int x){ return a+b;}<<===Toata functia asta pe care am pus-o eu in tagurila "code" este scrisa in asm.Acuma:Programul sa zicem ca ar arata cam asa (bineinteles asta e un exemplu extrem de simplificat):void main (){ printf("a=",%d); scanf(&a); printf("b=",%d); scanf(&; //pana acum citeste de la tastatura ce numere ai dat tu //acuma ii da ca parametri functiei "suma" care este scrisa in asm suma(a,; //aici dupa cum vedeti ia rezultatul functiei "suma" scrisa in asm. printf("Suma celor doua numere este: %d", rezultat);}int suma (int a, int x) //functie scrisa in intregime in asm !!!{ rezultat=a+b; return rezultat;}//*Programul are mai multe erori dar eu am scris in mare ce e important si ceea ce ma intereseaza pe mine, nu am mai declarat variabilele, bla, bla , bla...Cum pot face programul asta in c++ avand functia suma scrisa in asm ???Multumesc !PS: Stiu ceva asm dar la nivel de cracking stiu si ca de exemplu ar trebui scris in functia data ca exemplu add eax, ebx. Am habar cat de cat numai ca nu ma pricep sa fac ce am zis eu mai sus. Quote
Nytro Posted July 4, 2010 Report Posted July 4, 2010 Cred ca functia va fi scrisa tot in C++, cel putin header-ul, dar instructiunile vor fi scrise in ASM.int suma(int a, int { __asm { mov eax, a mov ebx, b add eax, ebx retn eax }}Probabil asa, NU STIU. (sa se inteleaga, am venit doar cu o posibila idee).Eu iti repet, lasa astea, si nu te mai uita la tutoriale de ASM daca nu sti ce fac acele instructiuni, daca nu sti cum arata un fisier PE in memorie si altele. Quote
loki Posted July 4, 2010 Report Posted July 4, 2010 aici exista metoda apelului PASCAL contra C. Exista o teorie pe care am uitat-o dar se aplica la functii:in cazul apelului PASCAL programul are grija sa transmita parametrii functiei si sa-i elibereze.in cazul C functia se ocupa cu preluatul si toata treaba...SAU INVERS....... habarnam cauta pe net despre apelul PASCAL si C! Lucrand in asamblare e posibil sa ai nevoie sa faci manual push si pop.nu ar trebui sa-ti bati capul cu asamblarea daca nu ai nevoie de programe de superviteza. C le traduce cel mai bine in compilare. E pasionant, aprob ce a zis nytro din pacate am vrut sa testez ceva recent dar am observat ca bcc32 de la borland C builder6 imi da erori pe orice incerc in assembler... Quote
Krisler12™ Posted July 4, 2010 Author Report Posted July 4, 2010 nu ar trebui sa-ti bati capul cu asamblarea daca nu ai nevoie de programe de superviteza.pai chiar am nevoie de superviteza: e un algoritm legat de backtracking care la fiecare step face multe alte verificari cu ce a generat plus multe alte conditii ceea ce ar insemna ca in c/c++ i-ar lua ani pana sa termine. C le traduce cel mai bine in compilare. C++ nu e bun ? Quote
loki Posted July 4, 2010 Report Posted July 4, 2010 (edited) ma refer la compilatorul C in general. Ca zici de C++: asta inseamna clase, virtualizare, mosteniri, etc.... Tot in C vei lucra ce vrei tu asemanator asamblarii (compilerul merge si pe C si pe C++). C este limbajul cel mai apropiat de asamblare, nu-ti vor lua ani cum zici, poti doar modela anumite operatii care consideri ca dureaza mult.Stii de ce se foloseste i++? i+=2? pentru ca vor fi inlocuite simplu cu INC EAX, ADD EAX,EBX etc - de aia este cel mai apropiat de asamblare dintre toate compilatoarele. Edited July 4, 2010 by loki Quote
SlicK Posted July 4, 2010 Report Posted July 4, 2010 Daca reusesti sa scrii codul intr-un asembler poti sa-l rulezi in dupa aceea in programul tau direct ca si cod masina(dar ai grija la adrese)#include <stdio.h>typedef void (__stdcall *tfunk)();char funk_raw[]="\x90\x90\x90\x90"; //crasheaza ca nu se duce nicaieri dupa ultimul NOPint main(){ tfunk funk=(tfunk)&funk_raw; funk(); return(0);} Quote
Nytro Posted July 4, 2010 Report Posted July 4, 2010 Da, dar nu stiu ce ar putea face acel "virus" pe care vrei sa il faci fara apelul unor functii de sistem din kernel, user32, care nu sunt functii pe care le poti scrie tu... Apelul se poate face si direct cu shellcode-ul care exista pentru unele functii, dar mai repede se face cu invoke.In plus diferenta dintre un cod scris in assembly si unul scris bine in C nu cred ca este foarte mare. Quote
Ethereal Posted July 5, 2010 Report Posted July 5, 2010 pai chiar am nevoie de superviteza: e un algoritm legat de backtracking care la fiecare step face multe alte verificari cu ce a generat plus multe alte conditii ceea ce ar insemna ca in c/c++ i-ar lua ani pana sa termine.Optimizand manual algoritmul in asm nu vei obtine un timp de executie foarte diferit. De altfel, compilatorul poate optimiza foarte mult codul(/O2) deci, daca nu stii cu adevarat ceea ce faci, nu are rost. Mai degraba, cauta o alternativa la algoritmul de backtracking - ce incerci tu sa faci?aici exista metoda apelului PASCAL contra C. Exista o teorie pe care am uitat-o dar se aplica la functii:in cazul apelului PASCAL programul are grija sa transmita parametrii functiei si sa-i elibereze.in cazul C functia se ocupa cu preluatul si toata treaba...Te referi la astea? __stdcall __cdecl__stdcall (C++)__cdecl (C++) Quote