🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
6 messages
6 total messages Started by lemkat Sat, 20 May 2006 16:45
pobieranie danych z stosu
#266
Author: lemkat
Date: Sat, 20 May 2006 16:45
41 lines
1775 bytes
witam, mam funkcje ktora pobiera dane ze stosu, niestety jak aplikacja 
ja wywyoluje to sie wyklada, co jest nie tak ????? wydaje mi sie ze cos 
z wielkoscia danych

void __declspec(naked) custom_send(void)
{
SOCKET  s;
char*   buf;
int     len;
int     flags;


_asm
     {
     push  ebp
     mov   ebp, esp
     sub   esp, 0x16

     mov   eax, [ebp+8]
     mov   s, eax
     mov   eax, [ebp+8+4]
     mov   buf, eax
     mov   eax, [ebp+8+8]
     mov   len, eax
     mov   eax, [ebp+8+12]
     mov   flags, eax
     }

char*       text="MyInject: wykryto custom_send";
ATOM Atom = ::GlobalAddAtom( text );
UINT uiMyMessage = ::RegisterWindowMessage("InetMessage");
::SendMessage( HWND_BROADCAST  , uiMyMessage , (WPARAM)Atom , 0 );

_asm
     {
     mov eax,len
     mov     esp, ebp
     pop     ebp
     ret      16
     }
}
Re: pobieranie danych z stosu
#267
Author: Bogdan (bogdro)
Date: Sun, 21 May 2006 08:22
59 lines
2662 bytes
lemkat napisał(a):
> witam, mam funkcje ktora pobiera dane ze stosu, niestety jak aplikacja
> ja wywyoluje to sie wyklada, co jest nie tak ????? wydaje mi sie ze cos
> z wielkoscia danych
> 
> void __declspec(naked) custom_send(void)
> {
> SOCKET  s;
> char*   buf;
> int     len;
> int     flags;
> 
> 
> _asm
>     {
>     push  ebp
>     mov   ebp, esp
>     sub   esp, 0x16
> 
>     mov   eax, [ebp+8]
>     mov   s, eax
>     mov   eax, [ebp+8+4]
>     mov   buf, eax
>     mov   eax, [ebp+8+8]
>     mov   len, eax
>     mov   eax, [ebp+8+12]
>     mov   flags, eax
>     }

 Jeśli kompilator układa na stosie zmienne tak, jak są powyżej
zadeklarowane (nie ma na to gwarancji), to kopiujesz nie te co trzeba.
Najgłębiej na stosie, czyli [ebp+8], są "int flags", najpłyciej -
"SOCKET s", w [ebp+8+12]. Jeśli kompilator dodatkowo wyrównuje stos,
to już wszystko jest nieprzewidywalne.
 Swoją drogą, po co takie kopiowanie?

> char*       text="MyInject: wykryto custom_send";
> ATOM Atom = ::GlobalAddAtom( text );
> UINT uiMyMessage = ::RegisterWindowMessage("InetMessage");
> ::SendMessage( HWND_BROADCAST  , uiMyMessage , (WPARAM)Atom , 0 );
> 
> _asm
>     {
>     mov eax,len
>     mov     esp, ebp
>     pop     ebp
>     ret      16
>     }
> }

 Raczej nie z tym "ret 16". Daj "ret". Nie wiem dokładnie co robi
"naked", ale w CDECL argumenty ze stosu zdejmuje wywołujący, nie
wywoływany.

-- 
Pozdrawiam, Bogdan                                  (Linux i FreeDOS)
Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Prawdziwy, bezpieczny komunikator:                   www.JabberPL.org
Re: pobieranie danych z stosu
#268
Author: Remek
Date: Mon, 22 May 2006 01:23
29 lines
1466 bytes
Witam!

Nie napisałeś jaki kompilator i system, ale to nie takie istotne.
Chodzi o to, że z ciekawości bym skompilował i podejrzał
w debuggerze. Na moje oko może wykładać się już tu:

_asm
     {
     push  ebp
     mov   ebp, esp
     sub   esp, 0x16

     mov   eax, [ebp+8]
     mov   s, eax
     mov   eax, [ebp+8+4]
     mov   buf, eax
     mov   eax, [ebp+8+8]
     mov   len, eax
     mov   eax, [ebp+8+12]
     mov   flags, eax
......

Myślę, że tu już powinieneś uregulować stos. W następnej
wstawce to samo, chociaż chyba już niekonieczne.

Pozdrawiam

--
Remek
Re: pobieranie danych z stosu
#269
Author: lemkat
Date: Thu, 25 May 2006 18:32
72 lines
2550 bytes
Witam

Problem juz rozwiazany, probelm byl z przydzialem pamieci, dawalem za 
malo. Kompilator to C++ Builder system WIN XP

Pozdrawiam i dzieki za pomoc, ponizej zamieszczam dzialjaca funkcje:

//----------------------------
void __declspec(naked) custom_WSARecv(void)
{
SOCKET s;
LPWSABUF pWsa;
DWORD dwLen;

_asm  // prolog
	{
     push  ebp
     mov   ebp, esp
     sub   esp, 12

     mov   eax, [ebp + MAGIC_STACKFRAME_SIZE]
     mov   [s], eax
     mov   eax, [ebp + MAGIC_STACKFRAME_SIZE + 4]
     mov   [pWsa], eax
     mov   eax, [ebp + MAGIC_STACKFRAME_SIZE + 8]
     mov   [dwLen], eax
	}


SendBuffor( pWsa->buf, pWsa->len, 5, &s );


_asm // epilog
	{
     mov     esp, ebp
     pop     ebp
     ret
	}
};
//---------------------------

Remek napisał(a):
> Witam!
> 
> Nie napisałeś jaki kompilator i system, ale to nie takie istotne.
> Chodzi o to, że z ciekawości bym skompilował i podejrzał
> w debuggerze. Na moje oko może wykładać się już tu:
> 
> _asm
>      {
>      push  ebp
>      mov   ebp, esp
>      sub   esp, 0x16
> 
>      mov   eax, [ebp+8]
>      mov   s, eax
>      mov   eax, [ebp+8+4]
>      mov   buf, eax
>      mov   eax, [ebp+8+8]
>      mov   len, eax
>      mov   eax, [ebp+8+12]
>      mov   flags, eax
> ......
> 
> Myślę, że tu już powinieneś uregulować stos. W następnej
> wstawce to samo, chociaż chyba już niekonieczne.
> 
> Pozdrawiam
> 
> --
> Remek
> 
Re: pobieranie danych z stosu
#270
Author: Remek
Date: Fri, 26 May 2006 13:02
46 lines
2010 bytes
Witam!

> Problem juz rozwiazany, probelm byl z przydzialem
pamieci, dawalem za malo

No to fajnie. Okazuje się, że to częsty błąd. Też
go popełniam czasem. Swoją drogą to też chyba
niedoskonałość systemu. Nie powinien pozwalać na
pisanie poza przydzielonym obszarem i zamazywanie
innych danych np. uchwytów, co zdarzało się w moich
programach.

Sam jestem początkujący, więc nie traktuj moich obserwacji
jako próby wymądrzania się. Patrząc na Twoj kawałek kodu
mam wrażenie, że w pewnych warunkach może się wysypywać.
Może źle to widzę, ale na moje oko wygląda to tak:

.......   ;kod asm
push  ebp
.......

wyjście do systemu i wywołanie jakiejś funkcji.
;Tu może się sypać, ponieważ wykonaliśmy  operacje na rejestrze
;używanym przez system i nie przywróciliśmy jego poprzedniej
;wartości

...... ;dalszy ciąg kodu asm

Wygląda jak gdyby kod asm był główny. Wg. mnie powinno
to wyglądać tak:

; głowny kod

push .....

wstawka asm

pop ....

; dalszy ciąg głównego kodu


Pozdrawiam

--
Remek
Re: pobieranie danych z stosu
#271
Author: lemkat
Date: Sat, 27 May 2006 20:01
61 lines
2588 bytes
Witam

Na razie program nie sprawia problemow, przyjrze sie twoim uwagom i 
dziekuje za nie.

Problem z przydzialem pamieci polega na tym iz kod funkcji naked z msdn 
zaklada uzycie __LOCAL_SIZE ktorego niestety nie ma w BCB stad problemy ;)

Pozdrawiam.

Remek napisał(a):
> Witam!
> 
> 
>>Problem juz rozwiazany, probelm byl z przydzialem
> 
> pamieci, dawalem za malo
> 
> No to fajnie. Okazuje się, że to częsty błąd. Też
> go popełniam czasem. Swoją drogą to też chyba
> niedoskonałość systemu. Nie powinien pozwalać na
> pisanie poza przydzielonym obszarem i zamazywanie
> innych danych np. uchwytów, co zdarzało się w moich
> programach.
> 
> Sam jestem początkujący, więc nie traktuj moich obserwacji
> jako próby wymądrzania się. Patrząc na Twoj kawałek kodu
> mam wrażenie, że w pewnych warunkach może się wysypywać.
> Może źle to widzę, ale na moje oko wygląda to tak:
> 
> .......   ;kod asm
> push  ebp
> .......
> 
> wyjście do systemu i wywołanie jakiejś funkcji.
> ;Tu może się sypać, ponieważ wykonaliśmy  operacje na rejestrze
> ;używanym przez system i nie przywróciliśmy jego poprzedniej
> ;wartości
> 
> ...... ;dalszy ciąg kodu asm
> 
> Wygląda jak gdyby kod asm był główny. Wg. mnie powinno
> to wyglądać tak:
> 
> ; głowny kod
> 
> push .....
> 
> wstawka asm
> 
> pop ....
> 
> ; dalszy ciąg głównego kodu
> 
> 
> Pozdrawiam
> 
> --
> Remek
> 
> 
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads