View previous topic :: View next topic |
Author |
Message |
dadajszen Cheater Reputation: 0
Joined: 19 Sep 2013 Posts: 27
|
Posted: Tue Nov 26, 2013 8:58 am Post subject: |
|
|
Dzięki wielkie!! czyli Ta linijka if not mrMiny.Active then mrMiny.Active = true end
end
Zamrozi adres te np miny na 'nieskaczony' czas ttak?
|
|
Back to top |
|
|
mgr.inz.Player I post too much Reputation: 218
Joined: 07 Nov 2008 Posts: 4438 Location: W kraju nad Wisla. UTC+01:00
|
Posted: Tue Nov 26, 2013 10:15 am Post subject: |
|
|
if not mrMiny.Active then mrMiny.Active = true end
można zapisać to też tak:
Code: | if (mrMiny.Active==false) then
mrMiny.Active = true
end |
O konstrukcji "if ... then" może słyszałeś? Istnieje w każdym popularnym języku programowania.
To po prostu coś takiego: if WARUNEK then ZROBTOITAMTO end
Jeżeli memoryrecord powiązany z minami nie jest zamrożony to
(not mrMiny.Active) będzie miało wartość true, czyli zostaną wykonane instrukcje pomiędzy then i end.
W sumie to możesz zamrażać już zamrożony memoryrecord. Czyli całą tą linijkę możesz zmienić, tj. pozostawić to co pomiędzy then i end.
Ja po prostu z przyzwyczajenia używam "konstrukcje", które robią coś tylko wtedy gdy naprawdę muszą. Jak z samochodem, po co używać rozrusznik gdy auto już na chodzie.
Jeżeli "zamroziłeś" to wartość będzie taka sama tak długo jak długo masz załączony CheatEngine.
_________________
|
|
Back to top |
|
|
dadajszen Cheater Reputation: 0
Joined: 19 Sep 2013 Posts: 27
|
Posted: Tue Nov 26, 2013 10:46 am Post subject: |
|
|
No dobra dzięki czyli te dwa kody działają no ok to zaraz wpisze ten kod do ce i zrobię tego trainera jak program(trainer) to adres nie bd zamrozony?
|
|
Back to top |
|
|
mgr.inz.Player I post too much Reputation: 218
Joined: 07 Nov 2008 Posts: 4438 Location: W kraju nad Wisla. UTC+01:00
|
Posted: Tue Nov 26, 2013 10:49 am Post subject: |
|
|
Utworzony "samodzielny" trainer, to tak na prawdę cheatengine ze zmienionym okienkiem. (mniej więcej). Czyli w tym przypadku adres będzie zamrożony tak długo jak długo masz uruchomiony trainer.
_________________
|
|
Back to top |
|
|
dadajszen Cheater Reputation: 0
Joined: 19 Sep 2013 Posts: 27
|
Posted: Tue Nov 26, 2013 11:04 am Post subject: |
|
|
No dobra dzięki jak bede mial pytania jakies to będę pisać na PRIV
@EDIT
if not mrMiny.Active then mrMiny.Active = true end
A czemu jest mrminy.active then mrminy.active czemu jest dwa razy a i sory że jeszcze raz pytam ten kod if not... zadziała na 100%? A takie pytanie czy pointer jest potrzebny do programu LUa?
|
|
Back to top |
|
|
mgr.inz.Player I post too much Reputation: 218
Joined: 07 Nov 2008 Posts: 4438 Location: W kraju nad Wisla. UTC+01:00
|
Posted: Tue Nov 26, 2013 3:27 pm Post subject: |
|
|
"czemu jest dwa razy"
przeczytaj http://forum.cheatengine.org/viewtopic.php?p=5508210#5508210 jeszcze raz, powoli.
"czy pointer jest potrzebny do programu LUa"
Tego pytania nie do końca rozumiem. Ale spróbuję odpowiedzieć.
W skrypcie Lua w programie CheatEngine możemy używać wskaźników, nawet wielopoziomowych.
_________________
|
|
Back to top |
|
|
dadajszen Cheater Reputation: 0
Joined: 19 Sep 2013 Posts: 27
|
Posted: Tue Nov 26, 2013 3:40 pm Post subject: |
|
|
Głównie chodzi mi o to czy pointer jest potrzebny do trainera bo przecież po wyłączeniu np gry to adres się zmienia
|
|
Back to top |
|
|
mgr.inz.Player I post too much Reputation: 218
Joined: 07 Nov 2008 Posts: 4438 Location: W kraju nad Wisla. UTC+01:00
|
Posted: Tue Nov 26, 2013 5:19 pm Post subject: |
|
|
Oczywiście, obecnie 99.9% gier korzysta z DMA. Wyjątkiem są gry takie jak call of duty, adresy które są cały czas takie same nazywamy "static address".
Aby w nowych grach co kolwiek zdziałać trzeba pobawić się w wstrzykiwanie kodu (czyli skrypt autoassemble) bądź poszukać wielopoziomowych wskaźników. Jeżeli mamy szczęście, bo wiele gier od zwykłych dwuwymiarowych jak Don't Starve do takich jak Metro Last Light są szczególnie upierdliwe. Pointery nawet na poziomie 8, potrafią na następny dzień przestać działać.
Szukanie wskaźników na poziomie 5 może zająć kilka godzin. Ogólnie czym większy poziom (level) i czym większy maksymaly offset tym dłużej czekamy oraz tym więcej otrzymamy wyników. Podczas skanowania pliki trzymające wskaźniki (a liczba wskaźników przy pierwszym skanowaniu może sięgać dziesiątek miliardów) bardzo szybko rosną. Dysk z minimum 500GB wolnego miejsca to minimum. Dopiero po zrobieniu przynajmniej kilku reskanów lista będzie krótsza.
Reskany robimy tak:
1) uruchamiamy grę, wczytujemy wskaźniki z uprzedniego skanowania, robimy reskan
2) znowu uruchamiamy grę, wczytujemy wskaźniki z pierwszego reskanowania, robimy nowy reskan
3) znowu uruchamiamy grę ale tym razem "na innej mapie", wczytujemy wskaźniki z drugiego reskanowania, robimy nowy reskan
4) znowu uruchamiamy grę ale tym razem "na jeszcze innej mapie", wczytujemy wskaźniki z poprzedniego reskanowania, robimy nowy reskan
czwórkę powtarzamy bardzo często. Aby jako tako mieć wolne miejsce możemy usunąć pliki z uprzednich skanów i reskanów, zostawiając tylko ten najnowszy reskan.
5) po wielu reskanach, z iluś tam miliardów zrobi się około od 10 do kilkudziesięciu tysięcy. Wtedy bierzemy ostatni reskan (plik PTR oraz pliki mu towarzyszące; dlatego lepiej jest każdy reskan nazywać inaczej) i idziemy do kolegi który także ma grę (w tej samej wersji bo inaczej lipa) i robimy następne reskany. Wtedy ilość wskaźników zmniejszy się do 5 do kilku tysięcy.
6) na koniec wybieramy dowolny z listy. Powinien działać w każdej sytuacji. Oczywiście gdy gra się uaktualni, cała zabawa zaczyna się od nowa. Ale tym razem możemy skorzystać z wiedzy zdobytej wcześniej. Tak zwane offsety wskaźnika wielopoziomowego nie zmieniają się aż tak często, przeważnie raz na dziesięć uaktualnień gry. Wtedy pierwszy skan robimy z ustawieniem "must end with specific offsets" (na przykład wiemy że w dobrym wskaźniku ostatni offset to 64). A przy reskanie możemy też podać jakie są początkowe offsety.
Tak czy inaczej, nie ma uniwersalnego gotowca, metody według której zawsze się nam powiedzie. Jedyne co pomoże to samodzielna praktyka i czas. No i oczywiście pytać na forum. Na forum jest dużo tutoriali, jest nawet taki dział na forum. Oczywiście wszystko w j.ang.
_________________
|
|
Back to top |
|
|
dadajszen Cheater Reputation: 0
Joined: 19 Sep 2013 Posts: 27
|
Posted: Wed Nov 27, 2013 10:48 am Post subject: |
|
|
Ok to teraz tak mam pointer w descripton nazwałem go Minyxx i teraz w kodzie LUa ma być np Mrminy czy Mrminyxx?
|
|
Back to top |
|
|
mgr.inz.Player I post too much Reputation: 218
Joined: 07 Nov 2008 Posts: 4438 Location: W kraju nad Wisla. UTC+01:00
|
Posted: Wed Nov 27, 2013 12:33 pm Post subject: |
|
|
Ale zaraz zaraz, pointer czy adres?
W okienku dodawania lub modyfikowania (gdy klikniemy dwa razy w kolumnie Address):
- adres to po prostu adres i już
- pointer to jakiś adres z towarzyszącym(i) mu offsetem(ami) który wskazuje na interesujący nas adres.
Widzę, że w ogóle nie przerobiłeś podstaw. No to namieszam ci jeszcze bardziej w głowie. Adres to pojęcie bardzo ogólne, adres to taka informacja mówiąca w którym miejscu znajduje się na przykład jakaś funkcja (assembler), pod danym adresem może też mieścić się jakaś wartość prostego typu (liczba całkowita, rzeczywista, i tak dalej), ale może też być obiekt, struktura, tablica, ciąg znaków (tekst), ...
Na szybko wymyśliłem poniższy kawałek kodu, coś podobnego jest używane w normalnych grach:
(gra która w której HP wojaka jest zawsze pod tym samym adresem)
Code: | 00845E80 - C6 05 1C414100 00 - mov byte ptr [0041411C],00
00845E87 - E8 B4FFFFFF - call 00845E40
00845E8C - B8 0000803F - mov eax,3F800000
00845E91 - E8 AAD0BCFF - call 00412F40
00845E96 - 89 05 00414100 - mov [00414100],eax
00845E9C - C3 - ret
|
Tak więc pod adresem 00845E80 jest jakaś funkcja. Spróbuję ją opisać.
Powyższy kawałek kodu jest używany gdy użyjemy apteczki.
Pod 00845E80 ustawiana jest wartość pod adresem 0041411C na zero, w ten sposób wyłączany jest "blood screen" czy odgłosy bólu, nasz wojak odetchnął chwilkę i już jest pełni sił. Wartość pod adresem 0041411C sprawdzana jest przez inne funkcje, których nie będę opisywał.
Pod adresem 00845E8C widzimy kod który ustawia rejestr EAX na wartość 3F800000 (w assemblerze tak zapisujemy liczbę rzeczywistą 1.0), 1.0 czyli 100%
1065353216(dziesiętne) = 3F800000(hex) = 1.0("single-precision floating-point" w skrócie "single/float")
4613937818241073152(dziesiętne) = 4008000000000000(hex) = 2.0("double-precision floating-point" w skrócie "double")
call to wywołanie innej funkcji w assemblerze, znajdującej się pod podanym adresem. Przykładowo "call 00412F40" wywoła funkcję pod adresem 00412F40. W tym kod pod tym adresem służy do uaktualnienia długości paska życia naszego hiroła.
mov [00414100],eax - nadpisuje dotychczasową wartość nową wartością. Przykładowo wojak miał 0.05 życia (5%), teraz będzie miał 1.0
Ponieważ nowe gry używają DMA, kawałek kodu zapewne wyglądał by tak:
Code: |
...
00845E80 - C6 05 1C414100 00 - mov byte ptr [edx+1C],00
00845E87 - E8 B4FFFFFF - call 00845E40
00845E8C - B8 0000803F - mov eax,3F800000
00845E91 - E8 AAD0BCFF - call 00412F40
00845E96 - 89 05 00414100 - mov [edx],eax
00845E9C - C3 - ret
|
(gdzieś powyżej edx ma przypisywany adres struktury w której trzymany jest HP oraz inne parametry)
Wskaźnik wielopoziomowy to adres którego wartość wraz z offsetem wskazuje na inny adres, a ten inny adres z kolei wraz z kolejnym offsetem "wskazuje" na kolejny inny adres, a ten ....
"descripton nazwałem go Minyxx i teraz w kodzie LUa ma być np Mrminy czy Mrminyxx"
Tą zmienną możesz i nazwać mrMileyCyrus. przykład:
Code: | mrMileyCyrus = getAddressList().getMemoryRecordByDescription('Minyxx') |
najważniejszy jest argument funkcji getMemoryRecordByDescription.
_________________
|
|
Back to top |
|
|
dadajszen Cheater Reputation: 0
Joined: 19 Sep 2013 Posts: 27
|
Posted: Wed Nov 27, 2013 1:17 pm Post subject: |
|
|
Dobra dzięki Ci po raz kolejny. to np CoD 2 wskaźnik wielopoziomowy to jak się go znajdzie to on nie będzie się już zmieniał rozumiem?
|
|
Back to top |
|
|
mgr.inz.Player I post too much Reputation: 218
Joined: 07 Nov 2008 Posts: 4438 Location: W kraju nad Wisla. UTC+01:00
|
Posted: Wed Nov 27, 2013 1:20 pm Post subject: |
|
|
w CoD2, akurat ta gra ma wiele "static address", więc ćwiczenie z wskaźnikami na tej grze nie ma sensu
_________________
|
|
Back to top |
|
|
dadajszen Cheater Reputation: 0
Joined: 19 Sep 2013 Posts: 27
|
Posted: Wed Nov 27, 2013 1:31 pm Post subject: |
|
|
Aha dobra czyli już jest więc nie trzeba się męczyć . Nie wiesz moze gdzie mg poczytać o tym np do czego mam wybrać 4 bity 2 bity float itd?
|
|
Back to top |
|
|
mgr.inz.Player I post too much Reputation: 218
Joined: 07 Nov 2008 Posts: 4438 Location: W kraju nad Wisla. UTC+01:00
|
Posted: Wed Nov 27, 2013 1:39 pm Post subject: |
|
|
z typem wartości jest różnie. Przykładowo HP czasami jest to float czasami double. A w Call of Duty jest to 4 bytes. Nie ma uniwersalnej metody.
I nie "4 bity 2 bity" tylko 4bajty 2bajty (4bytes 2bytes). To jest ogromna różnica. Na czterech bitach można zapisać tylko 16 różnych wartości. Na czterech bajtach to ho ho ho różnych wartości.
_________________
|
|
Back to top |
|
|
dadajszen Cheater Reputation: 0
Joined: 19 Sep 2013 Posts: 27
|
Posted: Wed Nov 27, 2013 1:57 pm Post subject: |
|
|
Ok dzięki cZyli trzeba kombinować
@EDIT
A np naboje jaką mogą być wartoscia?
|
|
Back to top |
|
|
|