Thread View: pl.comp.lang.asm
6 messages
6 total messages
Started by lemkat
Sat, 20 May 2006 16:45
pobieranie danych z stosu
Author: lemkat
Date: Sat, 20 May 2006 16:45
Date: Sat, 20 May 2006 16:45
41 lines
1775 bytes
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
Author: Bogdan (bogdro)
Date: Sun, 21 May 2006 08:22
Date: Sun, 21 May 2006 08:22
59 lines
2662 bytes
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
Author: Remek
Date: Mon, 22 May 2006 01:23
Date: Mon, 22 May 2006 01:23
29 lines
1466 bytes
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
Author: lemkat
Date: Thu, 25 May 2006 18:32
Date: Thu, 25 May 2006 18:32
72 lines
2550 bytes
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
Author: Remek
Date: Fri, 26 May 2006 13:02
Date: Fri, 26 May 2006 13:02
46 lines
2010 bytes
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
Author: lemkat
Date: Sat, 27 May 2006 20:01
Date: Sat, 27 May 2006 20:01
61 lines
2588 bytes
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