Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Oczyszczenie funkcji elementu członkowskiego
#1
Ilekroć piszę kod objazdu związany z funkcjami członkowskimi, rzeczy stają się niechlujne, więc dziś postanowiłem nie być leniwy i robić to właściwie. Aby napisać objazd dla funkcji członka, możesz wykonać następujące czynności:   * Przestań używać __fastcall i używaj __thiscall, ponieważ MSVC obsługuje deklarowanie funkcji za pomocą __thiscall * Przebuduj całą klasę z jej członkami, hierarchią dziedziczenia, a nawet funkcjami członkowskimi, tak jakby to był twój kod * Użyj funkcji statycznych wskaźników do członków, aby zarządzać wskaźnikami trampolin * Dodaj obsługę obwołania funkcji członka do swojego kodu objazdu * Proste funkcje, które zwracają adres dla każdej metody   Przykład:   Jako przykład wykorzystam część klasy Socket Skype'a. Pierwszym krokiem jest odwrócenie metody (funkcji klasy), która wykorzystuje strukturę / klasę danych, czyli Socket, więc znalazłem metody Send / Receive, które są Socket :: Send i Socket :: Receive.   Socket :: Wyślij Signature -     Kod:   podpisano int __thiscall Socket :: Send (Socket * this, int Data, int Len)   Socket :: Wyślij wzór -     Kod:   std :: string const kSocketSendSig = "8B 41 58 85 C0 74 0B 83 F8 04 74 06 83 C8" "FF C2 08 00 8B 41 5C 53 FF 74 24 0C FF 74" "24 0C 85 C0 74 20 50 E8? 8 8 D8 53 FF "" 74 24 1C FF 74 24 1 C 68 8 8 8 8 8 8 8 8 "" C 4 1C EB 07 E 8 8 8 8 8 D 8 85 DB 74 2B 83 FB FD ";   Socket :: Odbiór podpisu -     Kod:   podpisano int __thiscall Socket :: Receive (Socket * this, int Data, int Len)   Socket :: Receive Pattern -     Kod:   std :: string const kSocketReceivedSig = "8B 41 58 85 C0 74 0B 83 F8 04 74 06 83 C8" "FF C2 08 00 8B 41 5C 53 FF 74 24 0C FF 74" "24 0C 85 C0 74 20 50 E8? 8 8 D8 53 FF "" 74 24 1C FF 74 24 1 C 68 8 P 8 P 8 8 8 8 "" C 4 1C EB 07 E 8 P 8 8 8 D 8 85 DB 74 2B 83 FB FE ";   Wewnątrz promieni heksagonalnych kliknij prawym przyciskiem myszy podpis pseudo-podprogramu i kliknij "Utwórz nowy typ struktury", a członkowie ci zostaną zadeklarowani.       Promienie podczerwone dały mi tę strukturę danych:       Kod:   / * 288 * / struct __declspec (align (4)) Socket {int gap0; int field_4; int field_8; int field_C; int field_10; int field_14; int field_18; int pole_1C; int field_20; int field_24; int field_28; int field_2C; int field_30; int field_34; int field_38; int field_3C; int field_40; int field_44; int field_48; int field_4C; int field_50; int field_54; _DWORD dword58; _DWORD dword5C; };   Teraz zaczyna się tworzenie reszty klasy. Teraz dodaj proste funkcje, które zwracają adres dwóch metod po użyciu wzorca wyszukiwania (lub zakodowanego adresu w zależności od tego, co robisz).       Kod:   std :: uint8_t * GetSocketSendAddress () {std :: string const kSocketSendSig = "8B 41 58 85 C0 74 0B 83 F8 04 74 06 83 C8" "FF C2 08 00 8B 41 5C 53 FF 74 24 0C FF 74" "24 0C 85 C0 74 20 50 E 8 P 8 8 8 D 8 53 FF "74 24 1 C FF 74 24 1 C 68 P 8 P 8 8 8 P 83 C 4 1 C EB 07 E 8 P 8 A 8 8 D 8 85 DB 74 2B 83 FB FD "; std :: uint8_t * result = Core :: FindPattern (Core :: SearchRegion :: CodeSection, false, kSocketSendSig); if (result == nullptr) {CORE_THROW_EXCEPTION (Core :: Error {} << "FindPattern failed - Socket :: Send"); } Return result; } Std :: uint8_t * GetSocketReceiveAddress () {std :: string const kSocketReceivedSig = "8B 41 58 85 C0 74 0B 83 F8 04 74 06 83 C8" "FF C2 08 00 8B 41 5C 53 FF 74 24 0C FF 74" " 24 0C 85 C0 74 20 50 E 8 P 8 8 8 D 8 53 FF "74 24 1C FF 74 24 1 C 68 8 8 P 8 8 8 8 83 C 4 1 C EB 07 E 8 8 P 8 8 D 8 85 DB 74 2B 83 FB FE "; std :: uint8_t * result = Core :: FindPattern (Core :: SearchRegion :: CodeSection, false, kSocketReceivedSig); if (result == nullptr) {CORE_THROW_EXCEPTION (Core :: Error {} << "FindPattern failed - Socket :: Receive"); } Return result; }   W tym momencie
Reply
#2
Nie widzę sensu używać tego ponad stdcall, chyba że potrzebujesz interakcji ze zmiennymi składowymi. Potrzebujesz więcej kodu, aby to osiągnąć, niż to, czego potrzebujesz do stdcall. fastcall jest jednak brzydki.
Reply
#3
Zacytować: Originally Posted by M i c h a e l * Przestań używać __fastcall i używaj __thiscall, ponieważ MSVC obsługuje deklarowanie funkcji za pomocą __thiscall Czy to nie wspierało tak jak zawsze? Jestem prawie pewien, że można zadeklarować wskaźnik funkcji z tym wywoływaniem nawet w vs2008. Ale jeśli mówisz o funkcji globalnej, to czy mógłbyś mi wyjaśnić jak to włączyć, ponieważ korzystam z aktualizacji 2 vs2015 i nadal mi to mówi "__thiscall może pojawić się tylko na niestatycznych deklaracjach funkcji członkowskich".
Reply




Users browsing this thread: 1 Guest(s)