Blokowanie watku

Blokowanie watku
KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 2 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:2 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:ponad 2 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:ponad 2 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:ponad 20 lat
  • Ostatnio:4 miesiące
0

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

KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 2 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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)