Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
SetTexture-Hook Midfunction
#1
Hej,   Próbuję zahaczyć o ustalony obszar, aby obliczyć crcs dla tekstur (do użycia z azorbix '(od gamedecepcji, napisałem to wczoraj, ale nie dostałem odpowiedzi) technika rec modelu), ale moja funkcja hook nigdy nie jest wywoływana. Jestem pewien, że robię coś nie tak z zahaczaniem, ponieważ jestem naprawdę nowy w tym wszystkim, jak to jest / vtables / dezasemblowanie itd. Tak źle napisałem mój kod i mam nadzieję, że jakaś miła osoba powie mi, co to za błąd.   Oto rzeczy, które robię:   SetTexture z D3D9.dll     Kod:   6F9809F5 8BFF MOV EDI, EDI 6F9809F7. 55 PUSH EBP 6F9809F8. 8BEC MOV EBP, ESP 6F9809FA. 6A FF PUSH - 1 6F9809FC. 68 54B2AF6F PUSH d3d9. 6FAFB254 6F980A01. 64: A1 00000000 MOV EAX, DWORD PTR FS: [0] 6F980A07. 50 PUSH EAX 6F980A08. 83EC 10 SUB ESP, 10 6F980A0B. 53 PUSH EBX 6F980A0C. 56 PUSH ESI 6F980A0D. 57 PUSH EDI 6F980A0E. A1 5092B06F MOV EAX, DWORD PTR DS: [6FB09250] 6F980A13. 33C5 XOR EAX, EBP 6F980A15. 50 PUSH EAX 6F980A16. 8D45 F4 LEA EAX, DWORD PTR SS: [EBP - C] 6F980A19. 64: A3 00000000 MOV DWORD PTR FS: [0], EAX 6F980A1F. 8965 F0 MOV DWORD PTR SS: [EBP - 10], ESP 6F980A22. 8B7D 08 MOV EDI, DWORD PTR SS: [EBP + 8] 6F980A25. 33DB XOR EBX, EBX 6F980A27. 3BFB CMP EDI, EBX 6F980A29. 0F84 ECB20200 JE d3d9. 6F9ABD1B 6F980A2F. 8D77 04 LEA ESI, DWORD PTR DS: [EDI + 4] 6F980A32> 8975 E4 MOV DWORD PTR SS: [EBP - 1C], ESI 6F980A35. 895D E8 MOV DWORD PTR SS: [EBP - 18], EBX 6F980A38. 395E 18 CMP DWORD PTR DS: [ESI + 18], EBX 6F980A3B. 74 07 JE KRÓTKI d3d9. 6F980A44 6F980A3D. 56 PUSH ESI; / pCriticalSection 6F980A3E. FF15 9814966F CALL DWORD PTR DS: [<i KERNEL32. EnterCriti>; \ EnterCriticalSection 6F980A44> F647 2C 02 TEST BYTE PTR DS: [EDI + 2C], 2 6F980A48. 895D FC MOV DWORD PTR SS: [EBP - 4], EBX 6F980A4B. 0F85 C7770600 JNZ d3d9. 6F9E8218 6F980A51. F687 0C2A0000> TEST BYTE PTR DS: [EDI + 2A0C], 4 6F980A58. 8B45 10 MOV EAX, DWORD PTR SS: [EBP + 10] 6F980A5B. 8B4D 0C MOV ECX, DWORD PTR SS: [EBP + C] 6F980A5E. 50 PUSH EAX 6F980A5F. C645 FC 01 MOV BYTE PTR SS: [EBP - 4], 1 6F980A63. 51 PUSH ECX 6F980A64. 0F85 87B20200 JNZ d3d9. 6F9ABCF1 6F980A6A. 8B17 MOV EDX, DWORD PTR DS: [EDI] 6F980A6C. 8B92 4C020000 MOV EDX, DWORD PTR DS: [EDX + 24C] 6F980A72. 57 PUSH EDI 6F980A73. FFD2 CALL EDX 6F980A75. 8BF8 MOV EDI, EAX 6F980A77. 395E 18 CMP DWORD PTR DS: [ESI + 18], EBX 6F980A7A. 74 07 JE KRÓTKI d3d9. 6F980A83 6F980A7C. 56 PUSH ESI; / pCriticalSection 6F980A7D. FF15 9C14966F CALL DWORD PTR DS: [<i KERNEL32. LeaveCriti>; \ LeaveCriticalSection 6F980A83> 8BC7 MOV EAX, EDI 6F980A85. 8B4D F4 MOV ECX, DWORD PTR SS: [EBP - C] 6F980A88. 64: 890D 000000> MOV DWORD PTR FS: [0], ECX 6F980A8F. 59 POP ECX 6F980A90. 5F POP EDI 6F980A91. 5E POP ESI 6F980A92. 5B POP EBX 6F980A93. 8BE5 MOV ESP, EBP 6F980A95. 5D POP EBP 6F980A96. C2 0C00 RETN 0C   Adres SetTexture w vtable: 6F9809F5   DllMain wywołuje to:     Kod:   Dx9Hook (L "d3d9.dll"); memcpy ((void *) EndSceneOpCodes, (void *) "\ x89 \ x65 \ xF0 \ x8B \ x75 \ x08", 6); memcpy ((void *) DrawIndexedPrimiveOpCodes, (void *) "\ x89 \ x65 \ xF0 \ x8B \ x7D \ x08", 6); memcpy ((void *) SetTextureOpCodes, (void *) "\ x89 \ x65 \ xF0 \ x8B \ x7D \ x08", 6); if (memcmp ((void *) EndSceneOpCodes, (void *) dwES_hook, 6) == 0) {makeJMP ((PBYTE) dwES_hook, (DWORD) MyEndscene, 6);} if (memcmp ((void *) DrawIndexedPrimiveOpCodes, ( void *) dwDIP_hook, 6) == 0) {makeJMP ((PBYTE) dwDIP_hook, (DWORD) MyDrawIndexedPrimitive, 6);} if (memcmp ((void *) SetTextureOpCodes, (void *) dwST_hook, 6) == 0) {makeJMP ((PBYTE) dwST_hook, (DWORD) MySetTexture, 6);} return 0;   Dx9Hook     Kod:   HMODULE CBBase = NULL; for (; CBBase == NULL; Sleep (100)) CBBase = LoadLibrary ("d3d9.dll"); DWORD * VTableS = 0; * * * * * * * * * DWORD hD3D8 = (D
Reply
#2
Przede wszystkim dzięki za odpowiedź, naprawdę zaczynałem rozpaczać. Zaimplementowałem twoje pierwsze dwie sugestie. Ale w przypadku trzeciego: Jak uzyskać D3D9Base w OllyDbg. Czy mogę po prostu przełączyć się do modułu d3d9 i dodać 3b19f na pierwszy adres? kiedy to robię, nie ma tam nic ciekawego, na pewno nie skok do mysettexture. Również, skąd wiadomo, że przesunięcie do geometrii jest 3b19f? Jestem pewien, że muszę brzmieć jak idiota. Przepraszam za to. jeśli to konieczne, mogę przesłać całe źródło.
Reply
#3
Zacytować: Originally Posted by hakan.aras Przede wszystkim dzięki za odpowiedź, naprawdę zaczynałem rozpaczać. Zaimplementowałem twoje pierwsze dwie sugestie. Ale w przypadku trzeciego: Jak uzyskać D3D9Base w OllyDbg. Czy mogę po prostu przełączyć się do modułu d3d9 i dodać 3b19f na pierwszy adres? kiedy to robię, nie ma tam nic ciekawego, na pewno nie skok do mysettexture. Również, skąd wiadomo, że przesunięcie do geometrii jest 3b19f? Jestem pewien, że muszę brzmieć jak idiota. Przepraszam za to. jeśli to konieczne, mogę przesłać całe źródło. Aby uzyskać bazę D3d9 DWORD D3d9Base = (DWORD) GetModuleHandle ("D3d9.dll"); Znam go na 0x3B19F biblioteki d3d9, ponieważ otworzyłem go w IDA i sprawdziłem funkcję SetTexture. Funkcja SetTexture zaczyna się od D3d9Base + 0x3B175, a ponieważ wykonujesz hak Mid-Function w SetTexture + 0x2A, miejsce, w którym znajduje się twój hak to D3d9Base + 0x3B19F.
Reply
#4
Twoje pobieranie VTable jest całkowicie błędne, idk jaki wzór używasz, ale nie sądzę, że jest poprawny. VTable, który musisz znaleźć, to D3d9Base + 0x4EF8. Po uzyskaniu poprawnego VTable możesz pobrać adres takiej funkcji: Funkcja DWORD = * (DWORD *) (VTable + Offset); Przesunięcie jest w bajtach, więc na przykład końcowa scena, która wynosi 42, byłaby 0xA8. SetTexture to VTable 65, więc offset będzie wynosił 0x104. Jest to liczba VTable pomnożona przez 4 w Hex. Oto zły sposób na uzyskanie adresu dla haka SetTexture Mid-Function, ale powinno działać tak długo, jak twój plik d3d9.dll jest taki sam jak mój. Kod: DWORD D3d9Base = (DWORD) GetModuleHandle ("d3d9.dll"); DWORD D3DBaseVTable = D3d9Base + 0x4EF8; DWORD SetTextureAddress = * (DWORD *) (D3DBaseVTable + 0x104); DWORD SetTextureMidFunctionAddress = SetTextureAddress + 0x2A; Jeśli chodzi o haczyk zanurzeniowy, cała sprawa jest zła, gdyby została podłączona, to by się zawiesiła.
Reply
#5
adres vtable musi być poprawny, ponieważ mogę go użyć do przechwycenia DIP i ES. te działają doskonale. kiedy drukuję adres vtable w programie i przechodzę do tego adresu w olly, znajduję długą listę wskaźników. kiedy podążam za tymi wskaźnikami, wysyła mnie do początków funkcji. Haczyk DIP działa (mogę go używać do robienia różnych rzeczy), ale Kod: OriginalDIP ((BYTE *) dwDrawIndexedPrimitive_hook, DrawIndexedPrimiveOpCodes); device -> DrawIndexedPrimitive (pType, baseVertexIndex, minIndex, numVertices, startIndex, primitiveCount); nie wydaje się mieć żadnego efektu, ponieważ renderuje wszystko tylko w modelu szkieletowym (zobacz kod z poprzedniej strony). Naprawdę potrzebuję tego szczególnie, ponieważ muszę renderować niektóre rzeczy do osobnego celu renderowania. Oto cały mój kod: Kod I tutaj jest moja wersja d3d9.dll (nie wiem, czy to w ogóle różni się): d3d9.dll
Reply
#6
Uruchomiłem grę i OllyDbg i ustawiłem breakpoint na domniemanym adresie SetTexture (i tak dostaję z vtable [65]). na tym się nie skończyło. potem zastąpiłem całą funkcję NOPami, a gra nawet się nie przejmowała, przebiegła idealnie. Sądzę więc, że mimo tego, że punkty vtable tam, ten kod nie jest wywoływany, gdy wywołuję urządzenie-> SetTexture (). Masz pomysł, jak mogę pobrać adres, który zostanie wywołany, gdy zadzwonię do SetTexture? Pomyślałem o dodaniu połączenia z SetTexture w moich hakowanych funkcjach i śledzeniu przepływu programu, ale nie mogę spojrzeć na mój kod z ollydbg, ponieważ jest poza zakresem gry.
Reply
#7
Twoje adresy są poprawne dla twojego d3d9.dll, więc powinno działać tak długo, jak gra korzysta z SetTexture. Aby odzyskać ustawiony adres tekstury, po prostu pobierz go z VTable i użyj polecenia typeedef, aby można było wywoływać go. Kod: typedef HRESULT (WINAPI * CSetTexture) (LPDIRECT3DDEVICE9 pDevice, DWORD Sampler, LPDIRECT3DBASETEXTURE9 pTexture); CSetTexture pSetTexture; pSetTexture = (CSetTexture) ((DWORD) VTable + 0x104); Następnie wywołaj SetTexture po prostu wykonaj pSetTexture (pDevice, Sampler, pTexture). Powinieneś przejść do adresu SetTexture w OllyDbg i ustawić na nim punkt przerwania, jeśli nie zostanie wywołany, gra go nie używa lub zrobiłeś coś złego.
Reply
#8
To jest interesujące. Dodałem to do mojej metody inicjalizacji: "pSetTexture = (CSetTexture) ((DWORD) dwVTable [65]);" i to do mojego haka DIP "pSetTexture (device, 0, NULL)" Teraz to naprawdę wywołuje mój ST-hook (i ustawia tekstury również na NULL, więc musi to być poprawna funkcja), ale kiedy próbuję otworzyć wskaźnik pliku za pomocą fopen_s, dostaję naruszenie zasad dostępu lub gra po prostu się wyłącza. To jednak nie ma znaczenia. Dlaczego hak nie zostanie wywołany, gdy używam urządzenia-> SetTexture ()? Czy powinienem po prostu spojrzeć na adres urządzenia-> SetTexture () i spojrzeć na instrukcje, aby napisać hak środkowego też? Ponadto: Jakieś wskazówki, dlaczego MyDIP nie robi nic po przepisaniu?
Reply
#9
Powinieneś spróbować użyć normalnych objazdów lub haków VTable, haki na sprzężenia mogą być uciążliwe. Nie wiem, co próbujesz otworzyć za pomocą fopen_s, ale jeśli nie ma to tekstury, to nie, twoje wywołanie SetTexture z NULL dla tekstury. Device-> SetTexture () to wirtualna funkcja, której nie możesz po prostu rzucić i uzyskać adresu. Musisz dokładnie wiedzieć, co robisz, zanim spróbujesz zrobić to samemu.
Reply
#10
Po pierwsze: Dziękuję za wszystkie odpowiedzi. Opublikowalem to na kilku forach i jesteś jedynym, z którego otrzymuję odpowiedzi. Dostałem go do pracy przy użyciu haka do obsługi EndScene i stamtąd użyłem wskaźnika urządzenia do zapisania adresów moich funkcji (SetTexture i DIP) do jego vtable (vtable hook). Działa jak marzenie. Okazało się, że PB nie blokuje haków vtable. Nadal występują drobne problemy, ale przycięta wersja hacka już działa. W każdym razie, dzięki za przypomnienie mi vtable haka.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)