[C++][ASM] Ramka stosu z oddzielnego wątku, wyciek pamięci

0

Witam,
Posiadam pewną aplikacje, do której wszczepiam biblioteke DLL metodą proxy DLL (tj. podmieniam nazwe, a w mojej DLL-ce wczytuje oryginalną).

W mojej DLL-ce w DLLMain() tworze nowy wątek przy użyciu _beginthread(). W wątku tym mam główny kod DLL-ki, a co najważniejsze posiadam tam wywołania do funkcji, które znajdują w aplikacji do której wszczepiłem DLL-ke.
Po pewnym nieokreślonym czasie od uruchomienia całości i uruchomienia mojego magicznego kodu oryginalna aplikacja potrafi się wyspypać.

Zamieszczam schemat mojej aplikacji:

// mojadll.dll
DWORD fback = 0xFFFFFFFF; // przykładowy adres instrukcji po sub esp,18h

// jest to funkcja umożliwiająca mi wywołanie funkcji w oryginalnej aplikacji
int __declspec( naked ) Send(BYTE type,LPCSTR format,...)
{
	__asm
	{
		push ebp
		mov ebp, esp
		sub esp, 18h
		jmp fback	
	}		
}


void Thread (void* param)
{
	while (true)
	{		
		Send(0x02, "bs", 1, "main");
		Sleep(500);
		
	}

}

BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID)
{
	if (reason == DLL_PROCESS_ATTACH)
	{
		_beginthread(Thread,0,NULL);			
	}
}
0
  1. asembler to brzytwa którą trzeba się umieć posługiwać! a ta twoja wstawka to raczej nie powinna działać! Jak już tworzysz ramkę stosu to powinno następną instrukcją powinno być call a nie jmp!
    Na dodatek kod tworzący ramkę jest odpowiedzialny również za jej posprzątanie!

  2. powszechnym standardem jest to, że wskaźniki o nieokreślonej wartości nadaje się wartość początkową NULL czyli 0.

  3. zanim zaczniesz programować wątki (szczególnie w połączeniu z asemblerem), naucz się porządnie programować jednobieżnie (bez wątków).

0

Start funkcji
user image

Koniec
user image

0

@MarekR22
Zobacz powyższy post zamieściłem tam jak to wygląda

  1. Nie musze sprzątać po push, bo przy końcu tej funkcji mam pop, które pozamiata? Mam racje?
  2. Ten wskaźnik inicjalizowany na początku nie ma wartości FFFFFFF tylko jest to adres funkcji. Przeczytaj komentarze w kodzie.
  3. Ciekawe jak w jednym wątku zrealizować mój problem ;).

W czym problem?
Zauważyłem, że przy wolnych (co 0,5s) wywołaniach tej funkcji (poprzez ramke stosu) nie dzieje się nic szczególnego.
Jednak przy szybszym np. co 0,25s, nie mówiąc już o 1ms ucieka mi pamięć z systemu.
Nawet po zatrzymaniu wysyłaniu kolejnych ramek stosu pamięć spada, aż w SPACJA końcu spadnie do 0 i crash.

Oczywiście przypominam funkcje wywołuje z oddzielnego wątku, choć nie wiem czy to ma znaczenie bo każdy wątek i tak ma własny stos.
Jak to naprawić?

1 użytkowników online, w tym zalogowanych: 0, gości: 1