Mam problem z objazdami. Objazdy, jak wszyscy wiecie, mogą poruszać się tylko między 5 bajtami przestrzeni (to jest wywołanie "jmp" i 4 bajtowy adres). Z tego powodu niemożliwe jest posiadanie funkcji "hook" w klasie (metoda), nie można podać "tego" wskaźnika, ponieważ po prostu nie ma wystarczająco dużo miejsca (here's problem jest dokładniej wyjaśniony). Pracowałem więc cały dzień nad pomysłem na rozwiązanie, a teraz chcę, żebyś przemyślał ten temat, więc nie rozpoczynam 3-5 dniowego projektu, nie wiedząc, czy to będzie możliwe, czy nie.C++ i FULLY funkcje dynamiczne
Początkowo miałem 3 cele, chciałem, aby funkcje "haka" były metodami klasowymi, chciałem, aby całe podejście było zorientowane obiektowo (bez funkcji statycznych lub obiektów globalnych) i, najgorsze/najtrudniejsze, by było całkowicie dynamiczny. To jest moje (teoretycznie) rozwiązanie; z montażem można modyfikować funkcje w czasie wykonywania (doskonałym przykładem jest dowolna metoda detekcji). Skoro mogę dynamicznie modyfikować funkcje, czy nie powinienem też móc ich dynamicznie tworzyć? Na przykład; Przydzielam pamięć na, powiedzmy ~ 30 bajtów (przez malloc/new). Czy nie byłoby możliwe zastąpienie wszystkich bajtów liczbami binarnymi odpowiadającymi różnym operatorom zespołów (np. 0xE9 to "jmp"), a następnie bezpośrednie wywołanie adresu (ponieważ zawierałoby ono funkcję)?
UWAGA: Znam przedtem wartość zwracaną i wszystkie argumenty dla wszystkich funkcji, które chcę objechać, a ponieważ używam GCC, ta konwencja jest praktycznie identyczna z wersją _cdecl.
To jest moja myśl/wkrótce do realizacji; Tworzę klasę "Funkcja". Ten konstruktor przyjmuje zmienną liczbę argumentów (z wyjątkiem pierwszego argumentu, który opisuje zwracaną wartość funkcji docelowej).
Każdy argument jest opisem argumentów, które otrzyma hak (rozmiar i czy jest to wskaźnik, czy nie). Powiedzmy, że chcę utworzyć klasę funkcji dla int * RandomClass::IntCheckNum(short arg1);
. Wtedy po prostu musiałbym zrobić tak: Function func(Type(4, true), Type(4, true), Type(2, false));
. Gdzie "Typ" jest zdefiniowany jako Type(uint size, bool pointer)
. Następnie poprzez złożenie mogłem dynamicznie utworzyć funkcję (uwaga: to wszystko byłoby za pomocą konwencji wywoływania _cdecl), ponieważ mogę obliczyć liczbę argumentów i całkowitą wielkość.
Edycja: W przykładzie Type(4, true)
stanowi wartość powrotna (int *), przy czym scond Type(4, true)
jest RandomClass „ten” wskaźnik i Type(2, false)
określa pierwszy argument (krótkie arg1).
Dzięki tej implementacji mogłem łatwo zastosować metody klasy jako wywołania zwrotne, ale wymagałoby to dużej ilości kodu zespołu (którego nie jestem szczególnie doświadczony w). Ostatecznie, jedyną niedynamiczną rzeczą byłyby metody w mojej klasie wywołania zwrotnego (które również wymagałyby wywołań zwrotnych przed i po).
Tak więc chciałem wiedzieć; czy to możliwe? Ile pracy będzie wymagało, i czy jestem tu ponad moją głową?
EDYCJA: Przepraszam, jeśli przedstawiłem wszystko nieco rozmyte, ale jeśli jest coś, co chcesz dokładniej wyjaśnić, zapytaj!
EDIT2: Chciałbym również wiedzieć, czy mogę znaleźć gdzieś wartości szesnastkowe dla wszystkich operatorów montażowych? Lista pomoże tony! I/lub jeśli możliwe jest jakoś "uratować" asm (""); kod pod adresem pamięci (co bardzo wątpię).
Dlaczego w ogóle używać objazdów? Nie możesz użyć czystego rozwiązania C++, takiego jak 'std :: function' lub czy czegoś brakuje? –
Nie, jakbym mógł pomóc ci tylko wyjaśnić. Chcesz funkcji do wielokrotnego zapisu w klasie? (Mam na myśli, możesz zmienić je w czasie wykonywania) Jeśli tak, to myślę, że (po zakończeniu) może ewentualnie otworzyć ogromne możliwości programowania AI w C++. +1 – akaltar
@akaltar To jest znane jako [programowanie genetyczne] (http://en.wikipedia.org/wiki/Genetic_programming) i nie wymaga w ogóle funkcji wielokrotnego zapisu. –