|
Verfasser |
Nachricht |
anmabagima
Ex-Developer
Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 530
|
Hooken/Patchen von Subroutinen eines Spiels
Hallo zusammen,
ich schlage mich gerade mal wieder mit dem Thema Hooking/Patchen von Subroutinen rum.
Nach einigen Recherchen im iNet bin ich immer noch nicht 100% sicher.
Ich habe erfolgreich SysCalls in meinem KernelMode-Plugin auf eigene Funktionen umgeleitet...nun möchte ich gerne Subroutinen eines Spiels, dessen Adresse ich kenne ebenfalls in mein Plugin umleiten...
Mein erster Versuch war es die original aufrufstellen j sub_original zu patchen und die adresse sub_original mit einer funtkionsaddresse aus meinem plugin zu ersetzen hat nur zu einem crash geführt...
ich hab nun viele beispiele für user-user und kernel-kernel patching gefunden...geht das auch user->kernel ? Wenn ja, wie groß ist dann der aufwand ?
was ich bisher gefunden hab ist das hier:
http://forums.ps2dev.org/viewtopic.php?p=79947&sid=591de60badca0c59eb8513bbf608949f
bin mir aber nicht sicher ob das meine Lösung wäre..
Hoffe ihr könnt mir folgen und habt Tipps für mich...
Danke schonmal im vorraus
|
|
16.09.2011 19:22 |
|
|
|
Total_Noob
Developer
Beiträge: 496
Gruppe: Developer
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 2208
|
RE: Hooken/Patchen von Subroutinen eines Spiels
user->kernel ist nur möglich, wenn in der gepachte subroutine keine kernel funktionen gecallt wird. ansonsten kann man syscalls brauchen.
|
|
16.09.2011 19:42 |
|
|
|
anmabagima
Ex-Developer
Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 530
|
RE: Hooken/Patchen von Subroutinen eines Spiels
ok...danke...ist für dieses zweck der auf forums.ps2dev gepostete code der richtige ansatz um das zu bewerkstelligen ?
|
|
16.09.2011 20:45 |
|
|
|
Total_Noob
Developer
Beiträge: 496
Gruppe: Developer
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 2208
|
RE: Hooken/Patchen von Subroutinen eines Spiels
Wenn du einen Call patchest, kannst du nicht PatchSyscall benutzen, sondern MAKE_SYSCALL
|
|
16.09.2011 20:58 |
|
|
|
anmabagima
Ex-Developer
Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 530
|
RE: Hooken/Patchen von Subroutinen eines Spiels
Hi,
MAKE_SYSCALL ist ein Makro...hast du den Quelltext dafür oder ist das in einem HeaderFile drin ?
Einige tests zeigen mir dass die Adresse die nach meinen Patchversuchen an der originalen Stelle stehen irgendwie nicht aus dem Adressbereich meines Plugins kommt...
Beispiel:
Mein Plugin startet hier:
Entry: 0x88243810 - GP: 0x88257DC0 - TextAddr: 0x88243800
das Spiel in dem ich die Sub-Routine patchen will hat diesen Adressbereich:
Entry: 0x08ACC4AC - GP: 0x00000000 - TextAddr: 0x08804000
Nach dem patchen geht der Jump auf folgende addresse:
fehlt da nicht irgendeine Umrechnung in den plugin-Address bereich ? Muss ich das in meinem Plugin selbst machen ?
Oder mach ich da noch was falsch?
|
|
16.09.2011 21:48 |
|
|
|
Total_Noob
Developer
Beiträge: 496
Gruppe: Developer
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 2208
|
RE: Hooken/Patchen von Subroutinen eines Spiels
Zeig mal den code...ich check nicht was du versuchst..ein jump von user->kernel kann nicht funktionieren, hab ich ja gesagt..ausser man patcht HW registern...
Dieser Beitrag wurde zuletzt bearbeitet: 16.09.2011 22:23 von Total_Noob.
|
|
16.09.2011 22:17 |
|
|
|
anmabagima
Ex-Developer
Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 530
|
RE: Hooken/Patchen von Subroutinen eines Spiels
Klaro,
hier der Patch-Teil:
SceModule2* game = (SceModule2*)sceKernelFindModuleByName("LogansShadow"); if (game != 0){ unsigned int function = game->text_addr + 0x0041088C;
sprintf(txt, "Syphon Filter found. Original function at %X\r\n", function); debuglog(txt,0); patchJump(function, gameFunction3D, gameFunction_Stub); }
Hier der Aufruf der die Sub-Routine "ändert" so dass mein eigener Code aufgerufen wird...dabei wird der geänderte Code in einen Stub ausgelagert:
void *patchJump(int* originalFunc, int* patchFunc, int* patchStub){
/* copy the first instructions to the stub and than call back original */ patchStub[0] = originalFunc[0]; MAKE_JUMP(&patchStub[1], (int)(originalFunc+2)); patchStub[2] = originalFunc[1];
MAKE_JUMP(&originalFunc[0], patchFunc); originalFunc[1] = 0x0; //nop sceKernelDcacheWritebackInvalidateAll(); sceKernelIcacheInvalidateAll();
return patchStub; }
und hier die eigentliche Funktion:
extern int gameFunction_Stub(int, int);
void gameFunction3D(int a0, int a1){
char txt[100]; sprintf(txt, "GameFunction %X, %X, %X\r\n", a0, a1); debuglog(txt, 0);
gameFunction_Stub(a0, a1); }
Dis stub-Funktion ist in einem .S-File:
.global gameFunction_Stub .ent gameFunction_Stub
gameFunction_Stub: j $ra nop nop nop nop nop nop nop .end gameFunction_Stub
Meine Exports sehen so aus:
PSP_EXPORT_START(3dPlugin, 0, 0x4001) PSP_EXPORT_FUNC_HASH(gameFunction3D) PSP_EXPORT_FUNC_HASH(gameFunction_Stub) PSP_EXPORT_END
Hoffe es hilft dir ein wenig
|
|
16.09.2011 22:27 |
|
|
|
Total_Noob
Developer
Beiträge: 496
Gruppe: Developer
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 2208
|
RE: Hooken/Patchen von Subroutinen eines Spiels
Das ist klar, man kann keine Kernel Funktionen im User Mode aufrufen. Entweder du recherchierst über MAKE_SYSCALL oder erstellst eine User Module
|
|
16.09.2011 22:36 |
|
Folgende User bedanken sich: |
|
anmabagima
Ex-Developer
Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 530
|
RE: Hooken/Patchen von Subroutinen eines Spiels
Ok...danke...ich versuche mein Glück, weil das Plugin im Kernel-Mode laufen muss, sonst klappt der ganze andere Rest nicht mehr
Danke
|
|
16.09.2011 22:38 |
|
|
|
Total_Noob
Developer
Beiträge: 496
Gruppe: Developer
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 2208
|
RE: Hooken/Patchen von Subroutinen eines Spiels
Schau dir mal Ultimate VSH Menu Final Source Code an, da sind Beispiele wie du user->kernel patchen kannst
|
|
17.09.2011 10:24 |
|
Folgende User bedanken sich: |
|
anmabagima
Ex-Developer
Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 530
|
RE: Hooken/Patchen von Subroutinen eines Spiels
Hi,
danke für die Unterstützung...
|
|
17.09.2011 11:47 |
|
|
|
anmabagima
Ex-Developer
Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009
Status:
Offline
Danke erhalten: 530
|
RE: Hooken/Patchen von Subroutinen eines Spiels
Hi,
so...der SysCall funktioniert nun. Das heißt meine Routine in dem kernel plugin wird angesprungen, jedoch scheint noch ein Fehler bei der Rückkehr zum original-Code drin zu sein...
Es sieht so aus, dass ich den context das aufrufers nicht korrekt wiederhergestellt bekomme...
Wenn der SysCall durchgeführt wurde scheint der Stack-Pointer nicht mehr sauber zu sein...was ja eigentlich auch klar ist, da das ende der funktion die den stack pointer wieder sauber setzt nie erreicht wird, da ja vorher der jump zurück zum original code passiert...gibt's da noch einen Trick ?
|
|
17.09.2011 20:28 |
|
|
|