Blokowanie watku

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:

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.

1

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

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.

	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?

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.

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 ;)

0

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

0

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

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