Jump to content
Krisler12™

C++ si ASM. Cum le combini ?

Recommended Posts

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 !

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 B)
{
__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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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 by loki
Link to comment
Share on other sites

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 NOP

int main()
{
tfunk funk=(tfunk)&funk_raw;
funk();
return(0);
}

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

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