Xbox 360, функция PPC Крюк падает, когда я вызываю функцию в ловушке. PowerPC

Я сталкиваюсь с проблемой, которую не могу решить, поэтому мне нужно обратиться к сообществу, чтобы помочь мне. Проблема связана с перехватом функции PPC.

Это место, где я ловлю.

.text:8220D810                 mflr      r12
.text:8220D814                 bl        __savegprlr_20
.text:8220D818                 stfd      f31, var_70(r1)
.text:8220D81C                 stwu      r1, -0x100(r1)
.text:8220D820                 lis       r11, off_82A9CCC0@ha   // => This is where i am hooking the function
.text:8220D824                 lis       r22, dword_82BBAE68@ha // These 4 instructions are overwritt
.text:8220D828                 lis       r10, 8 # 0x87700       //Patched
.text:8220D82C                 mr        r26, r3                //Patched
.text:8220D830                 li        r20, 0
.text:8220D834                 lwz       r9, off_82A9CCC0@l(r11)
.text:8220D838                 ori       r23, r10, 0x7700 # 0x87700
.text:8220D83C                 lwz       r11, dword_82BBAE68@l(r22)
.text:8220D840                 cmplwi    cr6, r11, 0
.text:8220D844                 stw       r9, 0x100+var_7C(r1)
.text:8220D848                 bne       cr6, loc_8220D854
.text:8220D84C                 mr        r30, r20
.text:8220D850                 b         loc_8220D85C

Здесь он переходит к моей пещере кода, которая упоминается ниже. Исправленные инструкции правильно написаны в функции PredictPlayerHook и не являются проблемой.

Проблема здесь в том, что если я вызываю функцию в хуке, например, здесь я вызываю "GetCurrentCmdNumber(0);" это приводит к сбою игры. Теперь без вызова каких-либо функций игра не вылетает, а кодовая пещера работает без проблем. но если я пытаюсь вызвать какую-либо функцию в кодовой пещере (PredictPlayerHook), она просто падает. Я не могу отладить его, поэтому я не знаю, где он падает.

void __declspec(naked) PredictPlayerHook(){
    DWORD R11,Return,cmdNumber;

    __asm lis r11, 0x82AA //patched instructions
    __asm lis r22, 0x82BC //patched instructions
    __asm lis r10, 0x8    //patched instructions
    __asm mr r26, r3      //patched instructions


     __asm mflr   r0 ; //mflr grabs the link register, and stores it into the first operand. r0 is now the link register
     __asm stw  r0, -0x14(r1) ; //Save the link register inside the stack frame
     __asm stwu  r1, -0x90(r1) ;// This is pushing the stack (hence push)

    // cmdNumber = GetCurrentCmdNumber(0);

     __asm addi r1, r1, 0x90 ;//popping the stack frame
     __asm lwz r0,-0x14(r1) ; //Reading the link register from the sack
     __asm mtlr r0

    __asm stw r11,R11
    //Return = 0x82200230;
    __asm lis r11,0x8220  //Return Address is correct. The difference is in IDA segment, it is +0xD600 ahead of the original address.
    __asm ori r11,r11,0x0230
    __asm mtctr r11
    __asm lwz r11,R11
    __asm bctr
}

Вот сама функция и ее правильная. Я могу использовать его в ловушке, расположенной в другом месте игры, чтобы у него не было проблем.

typedef int (__cdecl* CL_GetCurrentCmdNumber)(int localClientNum);
CL_GetCurrentCmdNumber GetCurrentCmdNumber = (CL_GetCurrentCmdNumber)0x82261F90;

0 ответов

Другие вопросы по тегам