Есть такой код Код (Text): ; QMetaObject *__cdecl QApplication__metaObject(QApplication *this) .text:405F4AA0 public QApplication::metaObject(void)const ; weak .text:405F4AA0 QApplication::metaObject(void)const proc near .text:405F4AA0 ; DATA XREF: .data:`vtable for'QApplicationo .text:405F4AA0 .text:405F4AA0 this = dword ptr 8 .text:405F4AA0 .text:405F4AA0 push ebp .text:405F4AA1 mov ebp, esp .text:405F4AA3 push ebx .text:405F4AA4 sub esp, 4 ; stack .text:405F4AA7 call sub_401D0B37 .text:405F4AAC add ebx, 10FE28h .text:405F4AB2 call sub_401BC680 .text:405F4AB7 pop ecx .text:405F4AB8 pop ebx .text:405F4AB9 pop ebp .text:405F4ABA retn .text:405F4ABA QApplication::metaObject(void)const endp .text:401D0B37 .text:401D0B37 ; int __usercall sub_401D0B37<ebx>(int stack<esp>) .text:401D0B37 sub_401D0B37 proc near .text:401D0B37 .text:401D0B37 mov ebx, [esp] .text:401D0B3A retn .text:401D0B3A sub_401D0B37 endp .plt:401BC680 sub_401BC680 proc near .plt:401BC680 jmp dword ptr [ebx+3104h] .plt:401BC680 sub_401BC680 endp QMetaObject *__cdecl QApplication::metaObject(QApplication *this) { return (QMetaObject *)sub_401BC680(1081100500); } int __usercall sub_401BC680<eax>(int a1<ebx>) { return (*(int (**)(void))(a1 + 12548))(); } Ни Ida ни HexRay не могут вычислить переход функции sub_401BC680. Таких переходов полно. Нельзя ли как-то им помочь?
Во-первых какой скрипт? Во-вторых мне всё-таки интересен ответ на первоначальный вопрос, так как дело касается не только Qt.
Брякнуться в отладчике на 401BC680. Посмотреть память по адресу dword ptr [ebx+3104h]. Заодно посмотреть её выше и ниже этого адреса - это скорее всего будет таблица указателей на функи (ООП, наследование, всё такое). Может для всего класса получиться jmp dword ptr [ebx+3104h] - вот такое разрешить.
я не спрашиваю, как найти этот адрес, я могу вычислить его статически, без отладчика. я спрашиваю, почему ida этого не делает и как ей помочь.
ну так это метод из vtbl класса что бы вычислить на него переход нужно разобрать все vtbl классов что присутствуют в MSVC этим скрипты занимались а в GCC ручками )
Нет, проблема там была в том, что ida криво (и неправильно) загружает position independent code, если адрес загрузки отличен от дефолтного. Лечится загрузкой по дефолтному адресу, а потом ребейзом с фиксапами.