Nie tylko o Tibii i OTS...
Ostatnio czytając forum zauważyłem tendencje do przesady w sprawie klienta Tibii i niesamowitych informacji jakie może on pobierać z waszych komputerów.
Informacje, które czyta klient
CipSoft podał ostatnio informacje, że po patchu klient będzie pobierał niektóre informacje o systemie i sprzęcie.
Pomyślałem, że warto to sprawdzić.
Wyniki poszukiwań będę podawał w formie adresów w pamięci klienta. Adresy te to początki danych funkcji.
Native System Info 0054A000 Memory Status 0054BD00 Processor Type 0054BFF0 System Logical Processor 0054ADE0 Get Processor MHz 0054AF40 Graphics Device 0054C430 Get the max graphic object count 0054B070 Translate the windows the windows type (XP, VISTA, 95...) 0054CAF0 Get the windows type 00454880 Location Information 0054C93F Detect the graphics card corporation (NVidia..) 0054D5F0
Możecie sami sprawdzić co tam siedzi Ja zapewniam was, że nie ma tu nic poza tym co oświadczyły Cipy.
W jaki sposób klient pobiera/wysyła informacje
No dobra, mamy już informacje ale wypadało by dowiedzieć się kiedy klient je pobiera.
Gdyby się zastanowić to raczej nie robi tego ciągle podczas grania, takie cykliczne operacje mogły by spowolnić grę i zwiększyć zużycie procesora. Ja obstawiałbym, ze są one pobierane podczas startu klienta.
Sprawdźmy to !
Aby to zrobić wystarczy założyć breake pointa na którymkolwiek z wyżej wymienionych adresów. Jeżeli CipSoft pobiera te dane raz, to wszystkie.
Wybierzmy 0054A000, postawmy BP i uruchommy klient.
No proszę, proces został zatrzymany co oznacza, że dana funkcja została wywołana. Przepuśćmy ją klikając "Run".
Zalogujmy się i trochę pograjmy.
Możemy sobie chodzić, nic się nie stanie. Jeżeli wyłączymy grę, funkcja również nie zostanie wywołana.
Sprawdźmy jeszcze co się stanie podczas crasha.
No proszę tuż przed crashem również olly pokazał, że funkcja została wywołana.
Podsumujmy, klient pobiera te informacje tylko w 2 przypadkach.
Podczas uruchomienia klienta
Podczas crasha
Sprawdźmy więc położenie głównej funkcji, która pobiera te wszystkie dane i formuje w jeden ciąg.
Oto jej adres:
0054C8F0 > 6A FF PUSH -1
Jeżeli się jej przyjrzymy znajdziemy wywołania wszystkich funkcji które podałem wyżej:
0054C8F0 > 6A FF PUSH -1 0054C8F2 . 68 A8CB5A00 PUSH Tibia.005ACBA8 ; SE handler installation 0054C8F7 . 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 0054C8FD . 50 PUSH EAX 0054C8FE . 64:8925 000000>MOV DWORD PTR FS:[0],ESP 0054C905 . 83EC 1C SUB ESP,1C 0054C908 . 53 PUSH EBX 0054C909 . 56 PUSH ESI 0054C90A . 33DB XOR EBX,EBX 0054C90C . 57 PUSH EDI 0054C90D . 8BF1 MOV ESI,ECX 0054C90F . C74424 24 0F00>MOV DWORD PTR SS:[ESP+24],0F 0054C917 . 895C24 20 MOV DWORD PTR SS:[ESP+20],EBX 0054C91B . 885C24 10 MOV BYTE PTR SS:[ESP+10],BL 0054C91F . 895C24 30 MOV DWORD PTR SS:[ESP+30],EBX 0054C923 . 56 PUSH ESI ; /Arg1 0054C924 . E8 D7D6FFFF [b][color=Red]CALL Tibia.0054A000 ; \Tibia.0054A000 Native System Info[/color][/b] 0054C929 . 8D7E 04 LEA EDI,DWORD PTR DS:[ESI+4] 0054C92C . 83C4 04 ADD ESP,4 0054C92F . 3BFB CMP EDI,EBX 0054C931 . 74 1D JE SHORT Tibia.0054C950 0054C933 . 6A 04 PUSH 4 ; /BufSize = 4 0054C935 . 57 PUSH EDI ; |Buffer 0054C936 . 6A 07 PUSH 7 ; |InfoType = 7 0054C938 . 68 00080000 PUSH 800 ; |LocaleId = 800 0054C93D . 891F MOV DWORD PTR DS:[EDI],EBX ; | [b][color=Red]0054C93F . FF15 DCF25A00 CALL DWORD PTR DS:[<&KERNEL32.GetLocaleI>; \GetLocaleInfoA Location Information[/color][/b] 0054C945 . 85C0 TEST EAX,EAX 0054C947 . 75 04 JNZ SHORT Tibia.0054C94D 0054C949 . 891F MOV DWORD PTR DS:[EDI],EBX 0054C94B . EB 03 JMP SHORT Tibia.0054C950 0054C94D > 885F 03 MOV BYTE PTR DS:[EDI+3],BL 0054C950 > 8D46 08 LEA EAX,DWORD PTR DS:[ESI+8] 0054C953 . 50 PUSH EAX 0054C954 . E8 57DBFFFF CALL Tibia.0054A4B0 0054C959 . 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10] 0054C95D . 51 PUSH ECX 0054C95E . 8D56 10 LEA EDX,DWORD PTR DS:[ESI+10] 0054C961 . 52 PUSH EDX 0054C962 . 8D46 0C LEA EAX,DWORD PTR DS:[ESI+C] 0054C965 . 50 PUSH EAX 0054C966 . E8 95F3FFFF [b][color=Red]CALL Tibia.0054BD00 | Memory Status[/color][/b] 0054C96B . 8D4C24 1C LEA ECX,DWORD PTR SS:[ESP+1C] 0054C96F . 51 PUSH ECX 0054C970 . 8D56 18 LEA EDX,DWORD PTR DS:[ESI+18] 0054C973 . 52 PUSH EDX 0054C974 . 8D46 14 LEA EAX,DWORD PTR DS:[ESI+14] 0054C977 . 50 PUSH EAX 0054C978 . E8 73F6FFFF [b][color=Red]CALL Tibia.0054BFF0 |Processor Type[/color][/b] 0054C97D . 8D4E 30 LEA ECX,DWORD PTR DS:[ESI+30] 0054C980 . 51 PUSH ECX 0054C981 . 8D56 2C LEA EDX,DWORD PTR DS:[ESI+2C] 0054C984 . 52 PUSH EDX 0054C985 . 8D46 28 LEA EAX,DWORD PTR DS:[ESI+28] 0054C988 . 50 PUSH EAX 0054C989 . 8D4E 24 LEA ECX,DWORD PTR DS:[ESI+24] 0054C98C . 51 PUSH ECX 0054C98D . E8 4EE4FFFF [b][color=Red]CALL Tibia.0054ADE0 System Logical Processor[/color][/b] 0054C992 . 8D56 38 LEA EDX,DWORD PTR DS:[ESI+38] 0054C995 . 52 PUSH EDX 0054C996 . 8D46 34 LEA EAX,DWORD PTR DS:[ESI+34] 0054C999 . 50 PUSH EAX 0054C99A . E8 A1E5FFFF [color=Red][b]CALL Tibia.0054AF40 Get Processor MHz[/b][/color] 0054C99F . 8D4E 58 LEA ECX,DWORD PTR DS:[ESI+58] 0054C9A2 . 51 PUSH ECX 0054C9A3 . 8D56 54 LEA EDX,DWORD PTR DS:[ESI+54] 0054C9A6 . 52 PUSH EDX 0054C9A7 . 8D46 50 LEA EAX,DWORD PTR DS:[ESI+50] 0054C9AA . 50 PUSH EAX 0054C9AB . 8D4E 40 LEA ECX,DWORD PTR DS:[ESI+40] 0054C9AE . 51 PUSH ECX 0054C9AF . 8D56 3C LEA EDX,DWORD PTR DS:[ESI+3C] 0054C9B2 . 52 PUSH EDX 0054C9B3 . E8 78FAFFFF [b][color=Red]CALL Tibia.0054C430 Graphics Device [/color][/b] 0054C9B8 . 83C4 48 ADD ESP,48 0054C9BB . 83C6 4C ADD ESI,4C 0054C9BE . 56 PUSH ESI ; /Arg1 0054C9BF . E8 ACE6FFFF [b][color=Red]CALL Tibia.0054B070 ; \Tibia.0054B070 Get the max graphic object count[/color][/b] 0054C9C4 . 83C4 04 ADD ESP,4 0054C9C7 . C74424 30 FFFF>MOV DWORD PTR SS:[ESP+30],-1 0054C9CF . 837C24 24 10 CMP DWORD PTR SS:[ESP+24],10 0054C9D4 . 72 0D JB SHORT Tibia.0054C9E3 0054C9D6 . 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10] 0054C9DA . 50 PUSH EAX 0054C9DB . E8 1CCE0100 CALL Tibia.005697FC 0054C9E0 . 83C4 04 ADD ESP,4 0054C9E3 > 8B4C24 28 MOV ECX,DWORD PTR SS:[ESP+28] 0054C9E7 . 5F POP EDI 0054C9E8 . 5E POP ESI 0054C9E9 . 895C24 18 MOV DWORD PTR SS:[ESP+18],EBX 0054C9ED . 885C24 08 MOV BYTE PTR SS:[ESP+8],BL 0054C9F1 . C74424 1C 0F00>MOV DWORD PTR SS:[ESP+1C],0F 0054C9F9 . 5B POP EBX 0054C9FA . 64:890D 000000>MOV DWORD PTR FS:[0],ECX 0054CA01 . 83C4 28 ADD ESP,28 0054CA04 . C3 RETN
To są funkcje które znaleźliśmy i których adresy znamy
To adresy których bezpośrednio w tej funkcji nie udało się znaleźć:
0054CAF0 : Translate the windows type (XP, VISTA, 95...)
00454880 : Get the windows type
0054D5F0 : Detect the graphics card corporation (NVidia..)
Mamy też wywołania funkcji których nie opisałem wyżej np:
CALL Tibia.0054A4B0
CALL Tibia.005697FC
Przejdźmy więc do nich
054a4b0:
0054A4B0 /$ 83EC 40 SUB ESP,40 0054A4B3 |. 56 PUSH ESI 0054A4B4 |. 8B7424 48 MOV ESI,DWORD PTR SS:[ESP+48] 0054A4B8 |. 68 24B15C00 PUSH Tibia.005CB124 ; /ProcNameOrOrdinal = "GlobalMemoryStatusEx" 0054A4BD |. 68 00B15C00 PUSH Tibia.005CB100 ; |/pModule = "kernel32.dll" 0054A4C2 |. C706 00000000 MOV DWORD PTR DS:[ESI],0 ; || 0054A4C8 |. FF15 A4F25A00 CALL DWORD PTR DS:[<&KERNEL32.GetModuleH>; |\GetModuleHandleA 0054A4CE |. 50 PUSH EAX ; |hModule 0054A4CF |. FF15 20F25A00 CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; \GetProcAddress ..... 0054A548 |. 83C4 40 ADD ESP,40 0054A54B \. C3 RETN
Jak widzicie nic strasznego, ta funkcja pobiera wcześniej parametry potrzebne do wywołania funkcji:
0054C965 . 50 PUSH EAX 0054C966 . E8 95F3FFFF CALL Tibia.0054BD00 | Memory Status
Co widać po przesunięciu na stos wartości z rejestru EAX (czyli właśnie tego co wyszło z "nieznanej funkcji").
Kolejną nieznaną funkcje można rozgryźć szukając w kliencie takiej komendy:
CALL 0054CAF0
Dojdziemy do czegoś takiego:
0054C625 |. 56 |PUSH ESI 0054C626 |. 8D8D 60FFFFFF |LEA ECX,DWORD PTR SS:[EBP-A0] 0054C62C |. 51 |PUSH ECX 0054C62D |. E8 BE0F0000 |CALL Tibia.0054D5F0
Scrollujemy do samej góry i sprawdzamy skąd ta funkcja została wywołana.
Co się okazało? Wywołana została w naszej głównej funkcji formującej informacje o systemie:
0054C9B3 . E8 78FAFFFF CALL Tibia.0054C430
I tym za jednym razem stwierdziliśmy, że funkcja "Detect the graphics card corporation (NVidia..)" jest wywoływana dopiero przez inną funkcję, którą na początku określiliśmy jako nieznaną.
No dobra, ale co z systemem?
Przecież on też musi być pobierany a nigdzie go tutaj nie ma.
Załóżmy breake pointa na
00454880 - Get the windows type
Co się okazuje przy uruchomieniu klienta ta funkcja nie jest wywoływana!
W sumie to nawet logiczne. Programiści nie są w stanie przetestować programu na każdym systemie operacyjnym. Wychodzą z założenia, że jeżeli działa to dobrze a jeżeli crashuje to trzeba coś z tym zrobić. Dlatego ta informacja pobierana jest dopiero podczas crasha.
Jeżeli cofniemy się od naszej głownej funkcji formującej informacje o systemie dojdziemy do takiego miejsca:
005AE18F CC INT3 [b][color=Red]005AE190 . B9 50B17800 MOV ECX,Tibia.0078B150[/color][/b] 005AE195 . E8 D654F5FF CALL Tibia.00503670 005AE19A . 68 F0E45A00 PUSH Tibia.005AE4F0 005AE19F . E8 429DFAFF CALL Tibia.00557EE6 005AE1A4 . 59 POP ECX 005AE1A5 . C3 RETN 005AE1A6 CC INT3
Ta część kodu wywoływana jest w miejscu gdzie tworzone jest proces czyli na samym początku programu.
Tak więc doszliśmy do początku ^^
Dobra, wiemy już, że Tibia pobiera te informacje ale wypadało by sprawdzić czy je wysyła.
Oto adres funkcji która tworzy login packet:
00457655 |. E8 86DEFBFF CALL Tibia.004154E0 ; \Tibia.004154E0
Moim zdaniem nie ma tam informacji o systemie. Jeżeli ktoś uważa inaczej to niech skoryguje to co napisałem.
Nawet gdyby były to niekompletne bo nie ma nic o systemie (jak wiemy ta funkcja wywoływana jest dopiero podczas crasha).
Skąd wiem, że klient nie wysyła tych informacji w czasie gry?
Stąd, że mój program zakład hooka na funkcję recv i send.
Gdyby przeszedł chociaż jeden pakiet z nieznanym nagłówkiem na 100% bym go odnotował.
Nic takiego jednak się nie stało.
Podsumowując, klient nie wysyła informacji o waszym systemie za każdym razem gdy włączycie bota. Robi to dopiero podczas crasha.
Gdyby się zastanowić to nawet ma sens, bo po co informacje o systemie kiedy wszystko działa jak należy? Te info zbiera się dopiero podczas crasha programu bo można po nich dojść co jest ewentualną przyczyną błędu.
Mity o kliencie
Wielokrotnie czytałem wypowiedzi fachowców z tego forum. Niejednokrotnie twierdzili oni, że klient wysyła informacje o tym czy zmieniony jest tittle (ten napis "Tibia" w kliencie), czy korzystamy z bota, albo jeszcze jakieś inne bzdety.
Kiedy niby miałby to robić?
Wiemy, że nie robi tego podczas logowania ani podczas gry. Jedyna możliwość przesłania takich informacji to crash raport. Ale jak ktoś sam raportuje takie rzeczy to jego sprawa.
Tak więc:
1. Klient na pewno pobiera informacje o systemie.
2. Klient na pewno wysyła je do CipSoftu, ale nie robi tego za każdym uruchomieniem.
3. Klient nie sprawdza innych informacji o waszym systemie, nawet jeżeli by to robił, nie ma prawa ich gdziekolwiek przesłać. To wasza prywatna sprawa co macie uruchomione i sprawdzanie czegoś takiego to łamanie prawa!
Czego jeszcze nie rozwiązano
Pomimo wielu starań nikomu nie udało się rozwiązać zagadki cudownego "autobana".
Do tej pory nikt nie wie co jest a co nie jest wykrywalne.
Programiści obstawiają takie rzeczy jak:
"Zbyt częste wysyłanie pakietów"
"Zbyt dokładne leczenie i powtarzanie niektórych czynności"
"Zbyt szybkie zbieranie przedmiotów"
Ale równie dobrze taki system może nie istnieć a CipSoft opiera się na danych które zgromadził do tej pory.
Tak więc w kilku słowach
CipSoft raczej na 100% podczas banów nie wspiera się informacjami o systemie ani niczym innym co mogło by pochodzić od klienta!
Mam nadzieję, że rozwiałem trochę wątpliwości i pokazałem, że do wszystkiego da się dojść.
Jestem jednak człowiekiem i mogłem gdzieś się pomylić. Jeżeli ktokolwiek ma jakiekolwiek zastrzeżenia niech da znać w tym temacie.
Art. pochodzi z forum TibiaSoft.
Offline
Czyli tam to nic strasznego ?
Offline
Przydatna informacja ^^
Offline