Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

LOOP

[es] :: C/C++ programiranje :: LOOP

[ Pregleda: 4576 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

kajla
Milorad Janković
Beograd

Član broj: 445
Poruke: 909
*.InfoSky.Net



+2 Profil

icon LOOP06.08.2001. u 14:24 - pre 275 meseci
Napravio sam program
koji vrti petlju 0xFFFFFFFF do 0x00, i pri svakom prolasku poziva
printf("%x\n",index_petlje); , e problem je sada sto program lepo
stampa sve od 0xFFFFFFFF pa stane na 0xFFFF0280, i tu mi javi
stack overflow ili se win "blokira".
Evo kod-a sa komentarima:

Code:

int counter()
{
__asm{
mov ecx,0xFFFFFFFF
xor esi,esi
mov dword ptr[edx],0x0d0a7825 ;string "%xn"
mov dword ptr[edx+04h],esi
PrintLp:
push ebp
mov ebp,esp
push 0x78022a28 ;adresa printf() u kernel32.dll
push ecx
push edx
mov esi,edx
mov edi,ecx
call dword ptr[esp+08h] ;poziva printf(),ciju sam adresu stavio u stack
mov edx,esi
mov ecx,edi
loop PrintLp
}
}


poz.

[Ovu poruku je menjao kajla dana 08-06-2001 u 02:25 PM GMT]
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
*.verat.net



+1 Profil

icon Re: LOOP06.08.2001. u 16:48 - pre 275 meseci
Citat:
kajla je napisao:
Code:

int counter()
{
__asm{
mov ecx,0xFFFFFFFF
xor esi,esi
mov dword ptr[edx],0x0d0a7825 ;string "%xn"
mov dword ptr[edx+04h],esi
PrintLp:
push ebp
mov ebp,esp
push 0x78022a28 ;adresa printf() u kernel32.dll
push ecx
push edx
mov esi,edx
mov edi,ecx
call dword ptr[esp+08h] ;poziva printf(),ciju sam adresu stavio u stack
mov edx,esi
mov ecx,edi
loop PrintLp
}
}



imas :

Code:

push ecx
pudh edx


Ali pri izlazu iz funkcije nemas kod koji ce tih 8 byte da vrati stacku.Ispravno bi bilo da sad stacku dodas 8byte ( esp += 8 ) da se stack vrne u prvobitno stanje (pre poziva funkije).Ti pri svakom loop-u pravis 8byte na stacku koje ne oslobodis e sad razmisli koliko je to memorije kad radis
8 byte x 0xFFFFFFFF.Zapravo popunio bi svu memoriju da OS ne kontolise tvoje segmente (stack,data,code ;o)).
Za one koji nisu ukapirali evo slika:

ecx
edx
eip
ebp

u toku prve funkcije:

ecx
edx
ecx
edx
eip
ebp

u toku drugog poziva printf e sad koliko je to memorije kad ti pozivas 0xFFFFFFFF puta tu funkciju ;o)
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
*.verat.net



+1 Profil

icon Re: LOOP06.08.2001. u 16:50 - pre 275 meseci
E da plus adresa od funkije + ebp to je isto puno memorije.Moj savet je da na kraju funkcije loop-a uradis :

Code:
[b] movl %ebp,%esp , pop %ebp[/b]
Ovim ces da restorujes stari ESP i EBP tako da ce sve biti ok.
 
Odgovor na temu

kajla
Milorad Janković
Beograd

Član broj: 445
Poruke: 909
*.15.EUnet.yu



+2 Profil

icon Re: LOOP07.08.2001. u 14:57 - pre 275 meseci
Citat:
predator je napisao:
E da plus adresa od funkije + ebp to je isto puno memorije.Moj savet je da na kraju funkcije loop-a uradis :

Code:
[b] movl %ebp,%esp , pop %ebp[/b]
Ovim ces da restorujes stari ESP i EBP tako da ce sve biti ok.

Hvala puno...evo sad cu da probam...

poz.
 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.ptt.yu



Profil

icon Re: LOOP07.08.2001. u 19:00 - pre 275 meseci
E jel moze neko da pojasni ceo taj kod. Posto u vezi asemblera nemam pojma. Ili ako je smarno, neki link do odredjenog texta o koriscenju asemblera u C-u, bi dobro dosao.
Pozdrav.
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
*.verat.net



+1 Profil

icon Re: LOOP07.08.2001. u 20:14 - pre 275 meseci
Code:

int counter()
{
__asm{
mov ecx,0xFFFFFFFF
xor esi,esi
mov dword ptr[edx],0x0d0a7825 ;string "%xn"
mov dword ptr[edx+04h],esi


Formira string %x\n i terminira ga sa 0x00

Code:

PrintLp:
push ebp
mov ebp,esp
push 0x78022a28 ;adresa printf() u kernel32.dll
push ecx
push edx


Stavlja adresu od funkcije na stack,zatim u ecx je broj koji se stampa a u edx je adresa od %x\n

Code:

mov esi,edx
mov edi,ecx
call dword ptr[esp+08h] ;poziva printf(),ciju sam adresu stavio u stack
mov edx,esi
mov ecx,edi
loop PrintLp
}
}


Ovde se sacuvaju esi,edi poziva se funkcija i posle se restoruju esi,edi.
Znaci situacija u pozivu funkcije je:

BROJ
ADRESA_OD_%x\n
call printf i to je to pa onda loop
 
Odgovor na temu

kajla
Milorad Janković
Beograd

Član broj: 445
Poruke: 909
*.80.EUnet.yu



+2 Profil

icon Re: LOOP08.08.2001. u 13:59 - pre 275 meseci
Da tako je...to u C-u mozes da uradis bez asm-a ovako:
Code:

main()
{
int i=0xFFFFFFFF;

while (i)
{
printf("%x\n",i);
--i;
}
}

poz.

[Ovu poruku je menjao kajla dana 08-08-2001 u 02:02 PM GMT]
 
Odgovor na temu

kajla
Milorad Janković
Beograd

Član broj: 445
Poruke: 909
*.80.EUnet.yu



+2 Profil

icon Re: LOOP08.08.2001. u 14:06 - pre 275 meseci
Sto se tice assember-a idi na webster.cs.ucr.edu tamo postoji knjiga o asm-u. Postoji 16-bit verzija i 32-bit(mada ti ovo nebi preporucio jer mi se nesvidja HLA - High Level Assembler). Knjiga ima oko 1500 strana i mozes je nabaviti u PDF-u ili HTML-u.

poz.
 
Odgovor na temu

kajla
Milorad Janković
Beograd

Član broj: 445
Poruke: 909
*.InfoSky.Net



+2 Profil

icon Re: LOOP08.08.2001. u 19:24 - pre 275 meseci
Uradio sam sa:
Code:

add esp,0x10

naravno moze i ovo sa:
Code:

mov ebp,esp
pop esp

Ali imam sledeci provlem:
Da bi ovaj progy istampao 0x00400000 brojeva treba mu oko
pola sata, e sada ako ja hocu da iskoristim ovaj program
za pretrazivanje odredjenog stringa u memoriji tako sto
cu pri svakom prolasku kroz petlju da pozivam
lstrcmp(<adresa paterna>,0xFFFFFFFF-ecx) i sada
ako je eax = 0 onda je pattern nadjen i izlazi
se iz petlje. (na kraju bi petlje stavio mov eax,ecx).
SoftICE ovo postize za par sekundi. Kako da postignem
tu brzinu (predpostavljam da lstrcmp() radi brze od
printf(), tako da ce ovom programu trebati manje od
pola sata ali jos uvek daleko vise od par sekundi).

poz.

[Ovu poruku je menjao kajla dana 08-08-2001 u 07:25 PM GMT]
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
*.verat.net



+1 Profil

icon Re: LOOP08.08.2001. u 19:58 - pre 275 meseci
S obzirom da ne znam ni kako izgleda SoftIce a kamoli kako radi,ali predpostavljam da on gleda data segment ili sve segmente datog programa a ne celu memoriju.
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.rcub.bg.ac.yu

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: LOOP08.08.2001. u 21:52 - pre 275 meseci
I tvoje bi sigurno radilo znatno brze ukoliko ne bi isao od kraja adresive memorije 0xffffffff, vec krenuo od pocetka, posto je velika verovatnoca da ces to sto trazis naci u prvih [fizicki_ram+swap+kako_to_win_rasporedjuje_stranice] bajtova. Naravno, i pretraga samo segmenata koje koristi odredjeni program bi znatno ubrzala stvar.

Toliko.
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.rcub.bg.ac.yu

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: LOOP08.08.2001. u 21:55 - pre 275 meseci
Citat:
kajla je napisao:
Sto se tice assember-a idi na webster.cs.ucr.edu tamo postoji knjiga o asm-u. Postoji 16-bit verzija i 32-bit(mada ti ovo nebi preporucio jer mi se nesvidja HLA - High Level Assembler). Knjiga ima oko 1500 strana i mozes je nabaviti u PDF-u ili HTML-u.

poz.


Naravno da ti se ne svidja HLA, pa izgubi se dozivljaj asemblera :)
Da smo hteli HLA, ne bismo programirali u asm-u, nego C-u (hm, ovo je C/C++ diskusija :)

A sto se tice knjige, prva verzija sadrzi (16-bitna) vecinu informacija koje su relevantne za DOS, a druga (32-bitna) verzija se moze koristiti i bez HLA, kada se shvati sta to HLA u stvari obezbedjuje.

Toliko.

Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

kajla
Milorad Janković
Beograd

Član broj: 445
Poruke: 909
*.InfoSky.Net



+2 Profil

icon Re: LOOP09.08.2001. u 13:01 - pre 275 meseci
Citat:
tOwk je napisao:
I tvoje bi sigurno radilo znatno brze ukoliko ne bi isao od kraja adresive memorije 0xffffffff, vec krenuo od pocetka, posto je velika verovatnoca da ces to sto trazis naci u prvih [fizicki_ram+swap+kako_to_win_rasporedjuje_stranice] bajtova. Naravno, i pretraga samo segmenata koje koristi odredjeni program bi znatno ubrzala stvar.

Toliko.


Pa jeste meni petlja ide od 0xFFFFFFFF do 0x00 ali ja cu kad pozivam
da predam argument 0xFFFFFFFF-ecx umesto ecx tako da ce ici od 0x00 do 0xFFFFFFFF. Inace SoftICE pretrazuje celu memoriju.

poz.
 
Odgovor na temu

kajla
Milorad Janković
Beograd

Član broj: 445
Poruke: 909
*.InfoSky.Net



+2 Profil

icon Re: LOOP09.08.2001. u 13:07 - pre 275 meseci
Citat:
tOwk je napisao:
Citat:
kajla je napisao:
Sto se tice assember-a idi na webster.cs.ucr.edu tamo postoji knjiga o asm-u. Postoji 16-bit verzija i 32-bit(mada ti ovo nebi preporucio jer mi se nesvidja HLA - High Level Assembler). Knjiga ima oko 1500 strana i mozes je nabaviti u PDF-u ili HTML-u.

poz.


Naravno da ti se ne svidja HLA, pa izgubi se dozivljaj asemblera :)
Da smo hteli HLA, ne bismo programirali u asm-u, nego C-u (hm, ovo je C/C++ diskusija :)

A sto se tice knjige, prva verzija sadrzi (16-bitna) vecinu informacija koje su relevantne za DOS, a druga (32-bitna) verzija se moze koristiti i bez HLA, kada se shvati sta to HLA u stvari obezbedjuje.

Toliko.

Tacno je da prva verzija knjige sardzi informacije relevantne za DOS, ali ipak naucis sve sto ti treba...kasnije lako mozes da se prebacis i pises
asm i u win-u (za Linux treba vremena da se naviknes na drugu sintaksu).
Sto se tice druge knjige koliko sam ja video svi primeri su u HLA sto me malo nervira...ali naravno da se moze nauciti i iz ove knjige.

poz.
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.rcub.bg.ac.yu

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: LOOP09.08.2001. u 23:50 - pre 275 meseci
I jos jedna preporuka: koristi

Code:

void *memchr (const void *s, int c, size_t n);


funkciju koja pretrazuje
Code:
n
bajtova od pointera
Code:
s
i trazi char
Code:
c
. Naravno u stringu bi morao da trazis jedan po jedan znak, ali ovo je ANSI C funkcija, i ona nece prekinuti cim se pojavi 0x0 karakter (kao npr.
Code:
strcmp()
,
Code:
strstr()
i ostale string funkcije), vec se pretraziti svih
Code:
n
karaktera.

Naravno, ti vec znas kako bi od ove funkcije mogao napraviti funkciju za trazenje stringova umesto karaktera ("memstr" :).

Zato, toliko.
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

[es] :: C/C++ programiranje :: LOOP

[ Pregleda: 4576 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.