Antwort schreiben  Thema schreiben 
Verfasser Nachricht
anmabagima
Ex-Developer
****


Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 530
Beitrag: #1
xPSP  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 Wink und habt Tipps für mich...

Danke schonmal im vorraus

16.09.2011 19:22
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Total_Noob
Developer
*


Beiträge: 496
Gruppe: Developer
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 2208
Beitrag: #2
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
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
anmabagima
Ex-Developer
****


Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 530
Beitrag: #3
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
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Total_Noob
Developer
*


Beiträge: 496
Gruppe: Developer
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 2208
Beitrag: #4
RE: Hooken/Patchen von Subroutinen eines Spiels

Wenn du einen Call patchest, kannst du nicht PatchSyscall benutzen, sondern MAKE_SYSCALLSmile

16.09.2011 20:58
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
anmabagima
Ex-Developer
****


Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 530
Beitrag: #5
xPSP  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:

PHP-Code:
Entry0x88243810 GP0x88257DC0 TextAddr0x88243800 

das Spiel in dem ich die Sub-Routine patchen will hat diesen Adressbereich:

PHP-Code:
Entry0x08ACC4AC GP0x00000000 TextAddr0x08804000 


Nach dem patchen geht der Jump auf folgende addresse:

PHP-Code:
j          0x082466B4 

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
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Total_Noob
Developer
*


Beiträge: 496
Gruppe: Developer
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 2208
Beitrag: #6
xPSP  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
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
anmabagima
Ex-Developer
****


Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 530
Beitrag: #7
xPSP  RE: Hooken/Patchen von Subroutinen eines Spiels

Klaro,

hier der Patch-Teil:

PHP-Code:
    SceModule2game = (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, gameFunction3DgameFunction_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:

PHP-Code:
void *patchJump(intoriginalFuncintpatchFuncintpatchStub){

    
/* 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:

PHP-Code:
extern int gameFunction_Stub(intint);

void gameFunction3D(int a0int a1){

    
char txt[100];
    
sprintf(txt"GameFunction %X, %X, %X\r\n"a0a1);
    
debuglog(txt0);

    
gameFunction_Stub(a0a1);


Dis stub-Funktion ist in einem .S-File:

PHP-Code:
.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:

PHP-Code:
PSP_EXPORT_START(3dPlugin00x4001)
PSP_EXPORT_FUNC_HASH(gameFunction3D)
PSP_EXPORT_FUNC_HASH(gameFunction_Stub)
PSP_EXPORT_END 


Hoffe es hilft dir ein wenig Wink

16.09.2011 22:27
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Total_Noob
Developer
*


Beiträge: 496
Gruppe: Developer
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 2208
Beitrag: #8
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 ModuleWink

16.09.2011 22:36
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Folgende User bedanken sich:
~Hook~ (Sep-17-2011), anmabagima (Sep-16-2011)
anmabagima
Ex-Developer
****


Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 530
Beitrag: #9
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 Sad

Danke

16.09.2011 22:38
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Total_Noob
Developer
*


Beiträge: 496
Gruppe: Developer
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 2208
Beitrag: #10
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 kannstWink

17.09.2011 10:24
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Folgende User bedanken sich:
anmabagima (Sep-17-2011)
anmabagima
Ex-Developer
****


Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 530
Beitrag: #11
RE: Hooken/Patchen von Subroutinen eines Spiels

Hi,

danke für die Unterstützung...

17.09.2011 11:47
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
anmabagima
Ex-Developer
****


Beiträge: 348
Gruppe: User
Registriert seit: Dec 2009

Status: Offline
Danke erhalten: 530
Beitrag: #12
xPSP  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
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Antwort schreiben  Thema schreiben 

Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
xPSP Lesen eines Filestreams mit C Chaosduckman 5 1.908 27.07.2011 11:04
Letzter Beitrag: PSP_Lord
xPSP Speicherstatus eines Ordners erhalten PSP_Lord 1 1.124 20.02.2011 23:07
Letzter Beitrag: Ceikor
xPSP [Hilfe] Erstellen eines Ordners in C Littlefighter19 12 3.193 01.02.2011 19:02
Letzter Beitrag: pspbricker
xPSP [PSP-C]Patchen von schreibgeschützen dateien? dx3m 12 2.835 29.10.2010 20:26
Letzter Beitrag: dx3m
xPSP 5.00 M33-6 patchen superman 10 2.549 22.11.2009 16:26
Letzter Beitrag: Raiden1996

Druckversion anzeigen
Thema einem Freund senden
Thema abonnieren | Thema zu den Favoriten hinzufügen




» zum Seitenanfang