Вопрос по GCC C++ компилятору

Тема в разделе "WASM.RESEARCH", создана пользователем sergegers, 3 мар 2012.

  1. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    Есть такой код

    Код (Text):
    1. ; QMetaObject *__cdecl QApplication__metaObject(QApplication *this)
    2. .text:405F4AA0                 public QApplication::metaObject(void)const ; weak
    3. .text:405F4AA0 QApplication::metaObject(void)const proc near
    4. .text:405F4AA0                                         ; DATA XREF: .data:`vtable for'QApplicationo
    5. .text:405F4AA0
    6. .text:405F4AA0 this            = dword ptr  8
    7. .text:405F4AA0
    8. .text:405F4AA0                 push    ebp
    9. .text:405F4AA1                 mov     ebp, esp
    10. .text:405F4AA3                 push    ebx
    11. .text:405F4AA4                 sub     esp, 4          ; stack
    12. .text:405F4AA7                 call    sub_401D0B37
    13. .text:405F4AAC                 add     ebx, 10FE28h
    14. .text:405F4AB2                 call    sub_401BC680
    15. .text:405F4AB7                 pop     ecx
    16. .text:405F4AB8                 pop     ebx
    17. .text:405F4AB9                 pop     ebp
    18. .text:405F4ABA                 retn
    19. .text:405F4ABA QApplication::metaObject(void)const endp
    20.  
    21. .text:401D0B37
    22. .text:401D0B37 ; int __usercall sub_401D0B37<ebx>(int stack<esp>)
    23. .text:401D0B37 sub_401D0B37    proc near              
    24. .text:401D0B37                                        
    25. .text:401D0B37                 mov     ebx, [esp]
    26. .text:401D0B3A                 retn
    27. .text:401D0B3A sub_401D0B37    endp
    28.  
    29.  
    30. .plt:401BC680 sub_401BC680    proc near              
    31. .plt:401BC680                 jmp     dword ptr [ebx+3104h]
    32. .plt:401BC680 sub_401BC680    endp
    33.  
    34. QMetaObject *__cdecl QApplication::metaObject(QApplication *this)
    35. {
    36.   return (QMetaObject *)sub_401BC680(1081100500);
    37. }
    38.  
    39. int __usercall sub_401BC680<eax>(int a1<ebx>)
    40. {
    41.   return (*(int (**)(void))(a1 + 12548))();
    42. }
    Ни Ida ни HexRay не могут вычислить переход функции sub_401BC680. Таких переходов полно. Нельзя ли как-то им помочь?
     
  2. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    используте скрипт для анализа Qt для иды.
     
  3. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    Во-первых какой скрипт?
    Во-вторых мне всё-таки интересен ответ на первоначальный вопрос, так как дело касается не только Qt.
     
  4. samuraishowdown

    samuraishowdown New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    70
    Брякнуться в отладчике на 401BC680. Посмотреть память по адресу dword ptr [ebx+3104h]. Заодно посмотреть её выше и ниже этого адреса - это скорее всего будет таблица указателей на функи (ООП, наследование, всё такое). Может для всего класса получиться jmp dword ptr [ebx+3104h] - вот такое разрешить.
     
  5. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    я не спрашиваю, как найти этот адрес, я могу вычислить его статически, без отладчика. я спрашиваю, почему ida этого не делает и как ей помочь.
     
  6. samuraishowdown

    samuraishowdown New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    70
    Тогда не знаю. Скорее всего никак ей не помочь, только самому вычислять.
     
  7. reversecode

    reversecode Guest

    Публикаций:
    0
    ну так это метод из vtbl класса
    что бы вычислить на него переход
    нужно разобрать все vtbl классов что присутствуют
    в MSVC этим скрипты занимались
    а в GCC ручками ;))
     
  8. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    Нет, проблема там была в том, что ida криво (и неправильно) загружает position independent code, если адрес загрузки отличен от дефолтного. Лечится загрузкой по дефолтному адресу, а потом ребейзом с фиксапами.