Blokowanie watku

Blokowanie watku
KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
0

Ciezko jakis temat dobry wybrac, ale niech bedzie ;) Na razie mam dosc pisania i sprawdzania, wiec takie pytanie bardziej teoretyczne, bo jak bede znal sposob to z kodem dam rade.

Sytuacja wyglada tak, ze jestem podpiety pod funkcje(hook).

Wstepne wykonanie:

Kopiuj
77850DA8 > 8BFF             MOV EDI,EDI
77850DAA   55               PUSH EBP
77850DAB   8BEC             MOV EBP,ESP
77850DAD   A1 50A08777      MOV EAX,DWORD PTR DS:[0x7787A050] <-- tu sie podpinam 

W tym miejscu mamy skok do moich funkcji. Teraz tu rodzi sie problem. Czy pakujac moja funkcje w kolejny watek, zaradze temu, ze dopoki nie wykonaja sie moje funkcje i kod nie wroci w to miejsce to oryginalna funkcja nie ruszy dalej?

Istnieje taki problem ze danych jest bardzo duzo, funkcje wykonywane nie sa specjalnie szybkie i w zasadzie proces glowny zostaje zmrozony przy logowaniu tego. Czy tworzac watek wykonanie bedzie asynchroniczne?

Mam juz kilka watkow, ale jakos tego rozwiazania nie jestem pewien, moze ktos jakis lepszy sposob zna. ;)

Ps. Wiem ze tam jest MOV, w czasie runtime'u jest zakladany hook.

edytowany 2x, ostatnio: Krycho
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1

Jako kolejną instrukcje wpisujesz:
JMP $
i róbta co chceta.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
0

hmm... a ze tak powiem co to "JMP $" zrobi? Bo w tym miejscu jestem w trakcie wykonania funkcji i skacze do innych.

@Edit

Albo ja Cie nie rozumiem albo Ty mnie ;p Ja mam taki flow func -> przerwanie... wykonuje sie moj kod -> powrot i dokonczenie func. Teraz to ma byc tak ze jest func -> przerwanie... ono zostaje gdzies tam oddelegowane i w zasadzie od razu leci dalej wykonanie func.

Kopiuj
	char *buf;

	__asm PUSHAD
	__asm PUSHFD

	// Getting data from func
	__asm mov eax, DWORD PTR [ebp+0xC] // buf pointer
	__asm MOV buf, eax

	func();

	__asm POPFD
	__asm POPAD

	__asm SUB ESP, 0x18
	__asm PUSH EBX
	__asm JMP dwJMPbackRecv

W zasadzie tamten mov jest zly bo podmieniam te 2 instrukcje SUB i PUSH, ale niewazne. Teraz chodzi Ci o to ze jesli dam jmp $ zaraz za tym "oryginalnym" pushem ktory musze tak czy tak wykonac aby nie zaburzyc przebiegu funkcji to watki sie nie zblokuja?

edytowany 1x, ostatnio: Krycho
Zobacz pozostałe 13 komentarzy
KR
Przyspiesze raczej wypisywanie i jak rozpoznam juz strukture danego rodzaju pakietu to sobie jakies 50% wywale z monitorowania, bo nie beda mi potrzebne. Nie wiem czy to wszystko az tak warte zachodu ^^. W sumie mam jeszcze 1 pomysl. Powiedz czy poprawny. Jakbym zrobil sobie pewnego rodzaju wspoldzielone dane, tj. W przejetej funkcji robilbym sobie kopie tych danych. W watku mialbym odpalony monitoring zmian tych danych. Wypisuje jesli sie zmienia i czyszcze. Tylko nie wiem czy nie doszloby do omijania czesci pakietow, jesli watek nie wyrobilby sie z obrobka.
_13th_Dragon
Musisz synchronizować i tyle.
KR
A sekcja krytyczna albo zegary oczekujace? Chociaz sekcja krytyczna to moze mala przesada ;p
_13th_Dragon
Wcale nie jest przesada, natomiast zegar oczekujący to bez sensu jak ci nie nadążało.
KR
Czyli moglbym sobie zrobic zasob dzielony ktory zmienialby sie w shookowanej funkcji a w sekcje krytyczna wpakowac obrobke tych danych. Sprawdze to, moze sie uda ;)
KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
0

Moze sie komus przyda to dam jak to rozwiazalem w koncu ;)

Zrobilem sobie globalna zmienna do monitorowania. W przechwyconej funkcji robie jedynie kopie, a w watku monitoruje zmiany. Jesli pojawi sie w buforze cos nowego to obrabiam to sobie.

Kopiuj
string recvPacket;

// w przechwyconej funkcji
recvPacket.assign(buf,buf+ASyncPos);

// watek

DWORD WINAPI monitorRecv(void *pParams)
{
	recvPacket.clear();
	while(1)
	{
		if(!recvPacket.empty())
		{
			// cos tam robie ;)
		}
		recvPacket.clear();
		Sleep(1);
	}
	return 0;
}

Teraz ladnie wszystko dziala, nie gubie danych z tego co widze i przede wszystkim nie blokuje calego procesu ;)

szopenfx
  • Rejestracja:prawie 21 lat
  • Ostatnio:5 miesięcy
0

Nie lepiej to założyć hook'a na funkcję recv?

KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
0

A myslisz ze skad przechwytuje pakiety? Przeczytaj od poczatku to dowiesz sie czemu bezposrednio logowanie z przejetej funkcji mi nie pasuje.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.