Advertisement
Guest User

Untitled

a guest
Feb 1st, 2015
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. VOID __declspec(naked) GLPR(VOID)
  2. {
  3.     __asm
  4.     {
  5.         std     r14, -0x98(sp)
  6.         std     r15, -0x90(sp)
  7.         std     r16, -0x88(sp)
  8.         std     r17, -0x80(sp)
  9.         std     r18, -0x78(sp)
  10.         std     r19, -0x70(sp)
  11.         std     r20, -0x68(sp)
  12.         std     r21, -0x60(sp)
  13.         std     r22, -0x58(sp)
  14.         std     r23, -0x50(sp)
  15.         std     r24, -0x48(sp)
  16.         std     r25, -0x40(sp)
  17.         std     r26, -0x38(sp)
  18.         std     r27, -0x30(sp)
  19.         std     r28, -0x28(sp)
  20.         std     r29, -0x20(sp)
  21.         std     r30, -0x18(sp)
  22.         std     r31, -0x10(sp)
  23.         stw     r12, -0x8(sp)
  24.         blr
  25.     }
  26. }
  27.  
  28. DWORD RelinkGPLR(DWORD SFSOffset, PDWORD SaveStubAddress, PDWORD OriginalAddress)
  29. {
  30.     DWORD Instruction = 0, Replacing; PDWORD Saver = (PDWORD)GLPR;
  31.     if(SFSOffset & 0x2000000){ SFSOffset = SFSOffset | 0xFC000000; }
  32.     Replacing = OriginalAddress[SFSOffset / 4];
  33.     for(int i = 0; i < 20; i++){
  34.         if(Replacing == Saver[i]){
  35.                 int NewOffset = (int)&Saver[i]-(int)SaveStubAddress;
  36.                 Instruction = 0x48000001 | (NewOffset & 0x3FFFFFC);
  37.         }
  38.     }
  39.     return Instruction;
  40. }
  41.  
  42. void HookFunctionStart(PDWORD Address, PDWORD SaveStub, DWORD Destination)
  43. {
  44.     if((SaveStub != NULL) && (Address != NULL))
  45.     {
  46.         DWORD AddressRelocation = (DWORD)(&Address[4]);
  47.  
  48.         if(AddressRelocation & 0x8000)
  49.             SaveStub[0] = 0x3D600000 + (((AddressRelocation >> 16) & 0xFFFF) + 1);
  50.         else
  51.             SaveStub[0] = 0x3D600000 + ((AddressRelocation >> 16) & 0xFFFF);
  52.  
  53.         SaveStub[1] = 0x396B0000 + (AddressRelocation & 0xFFFF);
  54.         SaveStub[2] = 0x7D6903A6;
  55.  
  56.         for(int i = 0; i < 4; i++)
  57.             if((Address[i] & 0x48000003) == 0x48000001)
  58.                 SaveStub[i + 3] = RelinkGPLR((Address[i] & ~0x48000003), &SaveStub[i + 3], &Address[i]);
  59.             else
  60.                 SaveStub[i + 3] = Address[i];
  61.  
  62.         SaveStub[7] = 0x4E800420;
  63.         __dcbst(0, SaveStub);
  64.         __emit(0x7C0004AC);
  65.         __emit(0x4C00012C);
  66.  
  67.         PatchInJump(Address, Destination, false);
  68.     }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement