Произвольный указатель на неизвестную функцию класса - недопустимое преобразование типа - PullRequest
0 голосов
/ 05 сентября 2010

У меня есть хакерская программа; он вводит некоторые функции в целевой процесс для управления им. Программа написана на C ++ со встроенной сборкой.

class GameProcMain {
 // this just a class
};

GameProcMain* mainproc; // there is no problem I can do =(GameProcMain*)0xC1EA90

Теперь я хочу определить функцию класса (которая устанавливает ecx в указатель класса) вместо написания ассемблера.

PPLYDATA GetNearblyMob(__Vector3* cordinate) {
    __asm {
    mov ecx, 0xC1EA90
    enter code here
    push cordinate
    mov edi, 0x4A8010
    call edi
    }
}

Я хочу определить его и назвать как.

PPLYDATA (DLPL::*GetNearblyMob)(__Vector3* cordinate);

mainproc->GetNearblyMob(ADDR_CHRB->kordinat)

Когда я пытаюсь GetNearblyMob=(PPLYDATA (DLPL::*)(__Vector3*)) 0x4A8010;

Там написано что-то вроде error: invalid type conversion: "int" to "PPLYDATA (DLPL::*)(int, int)"

но я могу сделать это, чтобы установить указатель:

void initializeHack() {
__asm {
LEA edi, GetNearblyMob
MOV eax, 0x4A8010
MOV [edi], eax
}
}

Теперь я хочу узнать «как я могу установить GetNearblyMob без использования ассемблера и законно в C ++».

Ответы [ 2 ]

1 голос
/ 05 сентября 2010

Проблема в том, что функции-члены автоматически получают дополнительный параметр для указателя this.Иногда вы можете выполнять приведение между функциями-членами и не-членами, но я не вижу необходимости в преобразовании чего-либо.

Как правило, обратный инжиниринг в функции C проще, чем в C ++.C обычно имеет более простой ABI, поэтому вы можете сохранять структуры данных прямыми при их обработке.

Итак, я бы порекомендовал

PPLYDATA (*GetNearblyMob)(DLPL *main_obj, __Vector3* cordinate) = 0x12345UL;

, а затем определил вашу собственную функцию

class DLPL {
    GetNearblyMob( __Vector3* cordinate ) {
        return ::GetNearblyMob( this, cordinate );
    }
    // ... other program functions
};
1 голос
/ 05 сентября 2010

Я немного удивлен, что ты не будешь так разыгрывать.

Вы можете попробовать сделать что-то вроде

GetNearblyMob=reinterpret_cast<PPLYDATA (DLPL::*)(__Vector3*)> (0x4A8010);

Если это все еще не работает, попробуйте

*(int*)(&GetNearblyMob) = 0x4A8010;
...