HookEngine i Calle jak używać 14032 26

O temacie

Autor Siemekk

Zaczęty 7.01.2016 roku

Wyświetleń 14032

Odpowiedzi 26

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Witam. Otóż chciałbym poduczyć się Ikarusa więc chciałem się zapytać jak wywoływać Call. W pliku ikarusa natknąłem się na różne Calle np.: func void MEM_CallByPtr(var int ptr) rozumiem to aby wywołać wystarczy MEM_CALLbyPrt(i to całe prt) i chciałbym dowiedzieć cię co np. oznacza to var int prt; -Czego to jest zmienna. I teraz drugie HookEngine- wiem że to jest pętla. Ale jak mi wywoływać. W LeGo jest napisana funkcja dwóch lub trzech Hooków(mogę się mylić ile ich jest :/) func void HookEngine(var int address, var int oldInstr, var string function) np. ten w hookengine chodzi mi bardziej o adres. Kiedyś wyczytałem gdzieś że aby dostać się to adresów trzeba zdekompilować silnik (podane będą tam adresy w systemie Szesnastkowym-HEX i trzeba je zamienić na dziesiętny z czym sobie poradzę xD) i teraz czy adres dla hookengine zawsze będzie taki sam czy będzie się zmieniać? I dalej do HookEngine co to jest to oldInstr? Patrząc na niektóre skrypty widziałem tam liczby np.5 lub 6. Więc to by było wszystko. Prosiłbym o odpowiedź :) (Nie jestem głupi żeby nie wiedzieć że string function to nazwa funkcji :))
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
ptr, nie prt. To skrót od "pointer" czyli wskaźnik (adres) na miejsce w pamięci silnika gry gdzie znajduje się funkcja którą chcesz wywołać.
HookEngine to nie jest pętla. To funkcja służąca do dodania wywołania funkcji skryptowej do funkcji silnika.
Adres dajesz tej funkcji, do której chcesz coś dodać. Nie musisz do tego niczego dekompilować, chociaż ogólnie tak to się właśnie robi. Sama dekompilacja to jednak za mało - musiałbyś zrozumieć otrzymany assembler i znaleźć to do czego chcesz coś dodać. Obawiam się że to dla ciebie o wiele za trudne (ogólnie to jest zajęcie dla dość zaawansowanych programistów). Zamiast tego często korzysta się z tabel adresów opublikowanych przez innych.

Adres danej funkcji będzie zawsze ten sam w tej samej wersji gry. Jeśli plik exe gry choć trochę się różni, adresy mogą być inne.

oldInstr to długość w bajtach oryginalnych instrukcji pod adresem pod którym chcesz coś podmienić. To także trzeba sprawdzić dekompilatorem. Jest potrzebna do tego, aby skopiować je gdzie indziej, a w oryginalne miejsce wstawić wywołanie twojej funkcji oraz skok do starych instrukcji.

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
oldInstr to długość w bajtach oryginalnych instrukcji pod adresem pod którym chcesz coś podmienić. To także trzeba sprawdzić dekompilatorem. Jest potrzebna do tego, aby skopiować je gdzie indziej, a w oryginalne miejsce wstawić wywołanie twojej funkcji oraz skok do starych instrukcji.

oldInstr nie może być także krótsze niż 5:
    // ----- Sicherheitsabfragen -----
    if(oldInstr < 5) {
        PrintDebug("HOOKENGINE: oldInstr ist zu kurz. Es werden mindestens 5 Bytes erwartet.");
        return;
    };
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
W hook engine jest dodany taki warunek, nie należy go interpretować jednak jako żadnego rodzaju wskazówki żeby wpisać tam jakąś liczbę wynoszącą 5 lub więcej. Nie wydaje mi się żeby tak czy inaczej istniało zbyt wiele przydatnych do hookowania funkcji tak krótkich jak 5 bajtów.

Jeśli wpiszesz za mało lub za dużo, to gra prawdopdobnie crashuje albo stara funkcja nie będzie działać poprawnie.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
@Splash kiedyś wysyłał listę (funkcji?). http://forum.worldofplayers.de/forum/threads/1023720-Skriptpaket-LeGo/page14?p=17631567&viewfull=1#post17631567 czyli dajmy że np chcę zrobić Call od adresu 0x007B677E(znalazłem go w silniku czyli po zamianie z systemu HEX na DEC wychodzi 8087422). Dodatkowo w pliku piszę Call w wierszu G i rodzaj tego calla to __thiscall a więc wyszukałem w czeluściach forum takie coś i zamieniłem adres na swój  CALL__thiscall(_@ (slf), 8087422); Nie wiem czy to jest chociaż w najmniejszym stopniu dobrze.
@Bogdan czy te bity to jest to w tym pliku? http://ifotos.pl/z/snxqhph
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Ten link który wysłałeś do WoG'a zawiera plik z większością funkcji i potrzebnych rozmiarach. Jest tam wszystko opisane, więc nie ma szans żebyś nie kapnął. Co do zdjęcia, tak.

@Avallach Niekoniecznie zawsze scrashuje. Miałem funkcję, która nie działała (przy hooku oczywiście) i nie crashowała. Nie każda funkcja crashuje przy złej "długości".
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Splash

Splash

Moderator
posty4210
Propsy3412
ProfesjaNierób
  • Moderator
CALL__thiscall(_@ (slf), 8087422);To nie ma prawa zadziałać :F Przypisujesz wskaźnik do npc w miejscu, gdzie powinien być wskaźnik do ListT<CDDrawDeviceNode>
Nawet nie wiem za co odpowiada ta funkcja.

Przykład użycia funkcji CALL__thiscall:
0073BC10:    oCNpc::UseItem(oCItem *)
CALL_PtrParam (MEM_InstToPtr (itpo_health_01));
CALL__thiscall (MEM_InstToPtr (hero), 7584784);

Zamiast MEM_InstToPtr można użyć _@. Funkcje działają tak samo, tylko że skrócono jej nazwę, ponieważ jest bardzo często używana.

 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Czyli Call_ptrParam(_@...) zawsze występuje ? I jak to odnosi się do innych Calli? Np. czy call może wyglądać tak CALL_thiscall (_@,adres)?
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
@Splash robiłeś kiedyś coś takiego, czy to tylko przykład z dupy? :F
MEM_InstToPtr (itpo_health_01)Chodzi mi o to że to przecież tylko identyfikator "szablonu" przedmiotu. Nie da się go powiązać z konkretną instancją w grze, a co za tym idzie ze wskaźnikiem na nią. Chociaż znając Gothica nie zdziwiłbym się gdyby to się kompilowało i COŚ robiło :F
Nie trzeba by zrobić tego raczej tak?
MEM_InstToPtr (Npc_GetInvItem(hero, itpo_health_01))Tutaj pobieramy konkretną instancję przedmiotu (zidentyfikowaną za pomocą identyfikatora i instancji NPC w którego ekwipunku jest).

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Czyli Call_ptrParam(_@...) zawsze występuje ? I jak to odnosi się do innych Calli? Np. czy call może wyglądać tak CALL_thiscall (_@,adres)?

Nie zawsze. Czasami starczy tylko Thiscall. Ogólnie to sprawa wygląda tak, że jeśli funkcja ma tylko jeden pointer i wywołuje się przez thiscall, starczy tylko thiscall (ptr, address).

Przykład: CALL__thiscall(_@(MEM_Game), zCCamera__RenderCinemaScope);
Ten przykład nie działa poprawnie jak co.

 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Splash

Splash

Moderator
posty4210
Propsy3412
ProfesjaNierób
  • Moderator
@Avallach, jak się okazało mój sposób jak i twój nie działa na tej funkcji :F Ale mój sposób zadziałał na funkcji:
007323C0:    oCNpc::EquipItem(oCItem *)

func void Equip_Item (var c_npc slf, var int ItemInst)
{
    CALL_PtrParam(MEM_InstToPtr (ItemInst));
    CALL__thiscall(MEM_InstToPtr (slf), 7545792);
};
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Są też jednak funkcje, pod które nie da się podczepić. Wtedy trzeba majstrować z MEM_WriteInt / MEM_WriteString (address, int / string ptr). Do tego dochodzą niedokończone funkcje, czyli np. CinemaScope (paski kinowe). Te niedokończone trzeba modyfikować w dość obszerny sposób oraz często się różnią pomiędzy wersjami gry (G/G2) - tzn. sama modyfikacja funkcji.

Zapewne jeszcze coś pominąłem, ale jak na razie chyba starczy. :P
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Jeszcze jedna rzecz mnie ciekawi. Otóż chcę zrobić Call do dwóch adresów (74A660
i 74A590 - DropfromSlot) i ciekawią mnie te linijki http://ifotos.pl/z/snennqa co one oznaczają. Próbowałem różnymi sposobami ale wszystko kończyło się Crashem (jak na nowicjusza przystało) jak mógłbym wywołać (jakim callem) Prosiłbym o wyjaśnienie gdzie szukać informacji do tego jak wywołać call.
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Te linijki to nagłówki dwóch funkcji silnika.
Obie są
 - publiczne
 - metodami klasy oCNpc
 - instancyjnymi (wołane z thiscall)
 - zwracają wskaźnik na oCVob

Pierwsza przyjmuje jako argument wskaźnik na obiekt TNpcSlot, druga stringa zapewne z nazwą slotu (i nie widzę co jeszcze).

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Czyli to będzie tak wyglądać (początek)  Call__thiscall(_@(slf),adres) tak wywołanie (chyba) i później jak oznaczyć ten slot? Oraz co da sam call?  będę mógł np. zrobić wypadanie itemu ze slotu czy jeszcze coś trzeba robić. ( sorki za dla niektórych banalne pytania ale naprawdę jestem jeszcze bardzo, bardzo zielony.)
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
z obrazka:
W pierwszym adresie potrzebujesz podczepić klasę oCNpc oraz TNpcSlot (ten najprawdopodobniej jest niewypałem albo służy do czegoś innego)
W drugim adresie potrzebujesz oCNpc oraz stringa z nazwą slotu.

Samym Call__thiscall tego nie zrobisz. Potrzebujesz Calla do ptr (pointera). W tym przypadku powinno to wyglądać mniej więcej tak, że odnosisz się do (nie pamiętam jak się to dokładnie nazywa) Call_StrParam (SlotName) i potem dopiero call_thiscall(Insttoptr(npc), address).

Oczywiście to tylko przypuszczenia. Musisz się sam pomęczyć.


Slot = ZS_LeftHand / ZS_Shield etc.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Splash

Splash

Moderator
posty4210
Propsy3412
ProfesjaNierób
  • Moderator
func void DropFromSlot (var c_npc slf, var string slotName)
{
    CALL_zStringPtrParam(slotName);
    CALL__thiscall(_@(slf), 7644560);
};
Choć to i tak ci nie pomoże. Nie musisz wymuszać wywoływania tej funkcji, bo silnik wywołuje ją zawsze po śmierci lub pobiciu postaci. Cały problem polega na tym, że przenoszenie przedmiotu ze slotu na slot z poziomu MDSa jest tylko "efektem wizualnym". Przedmiot tak naprawdę nadal jest w tamtym slocie. Dowód:

func int GetSlotItem(var c_npc slf, var string slotName)
{
    CALL_zStringPtrParam(slotName);
    CALL__thiscall(_@(slf), 7544560);
    return CALL_RetValAsPtr();
};

func void Test ()
{
    var c_npc slf; slf = MEM_PtrToInst (ECX);

    if (GetSlotItem (slf, "ZS_LEFTHAND") > 0)
    {
    Print ("ZS_LEFTHAND");
    }
    else if (GetSlotItem (slf, "ZS_CROSSBOW") > 0)
    {
    Print ("ZS_CROSSBOW");
    };
};

func void INIT_GLOBAL()
{
    [...]
    HookEngineF (7560880,  7, Test);
    HookEngineF (7563104,  7, Test);
};
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Już powoli zaczynam mniej więcej rozumieć... Teraz mam pytanie...
 CALL__thiscall(_@(slf), 7644560); Otóż to jest Call do (funkcji?/classy?) oCNPC jeżeli Call miałby być do (funkcji/classy :F)
Camery (taki przykład) to call miałby wyglądać tak?
CALL__thiscall(_@(ZCCamera), Adres) ? :F Pytam się ponieważ nie wiem a chciałbym coś z Ikarusa w końcu ogarnać  :wstyd:
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Nie ma czegoś takiego jak call do klasy. Jest call do funkcji, tylko. Pierwszy parametr w thiscall to pointer (wskaźnik) ECX - ECX to można powiedzieć główna zmienna w danej funkcji. Jest tych zmiennych więcej i znajdują się w Hookengine.d

Nie robisz czegoś takiego, że odwołujesz się do klsay callami. Call służy do tego, żeby odwołać się do danej funkcji systemowej Gothica.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Może tak. Porwałem się z motyką na słońce z tymi Callami... może powiecie mi od czego stopniowo zacząć aby powoli ogarnąć Ikarusa (tylko błagam nie piszcie mi o podstawowych skryptach bo je w miarę dobrze ogarniam :) )
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry