Интерпретация функции

Тема в разделе "WASM.ASSEMBLER", создана пользователем Zlyden, 9 авг 2010.

Статус темы:
Закрыта.
  1. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Не удивляйтесь, что я начну с С++. Задача - сделать перехват функции. Простая функция, выглядеть должна примерно так:
    Код (Text):
    1. static void HookCG_RGBForSaberColor( saber_colors_t color, vec3_t rgb )
    2. {
    3.     switch( color )
    4.     {
    5.         case SABER_RED:
    6.             VectorSet( rgb, 1.0f, 0.2f, 0.2f );
    7.             break;
    8.         case SABER_ORANGE:
    9.             VectorSet( rgb, 1.0f, 0.5f, 0.1f );
    10.             break;
    11.         case SABER_YELLOW:
    12.             VectorSet( rgb, 1.0f, 1.0f, 0.2f );
    13.             break;
    14.         case SABER_GREEN:
    15.             VectorSet( rgb, 0.2f, 1.0f, 0.2f );
    16.             break;
    17.         case SABER_BLUE:
    18.             VectorSet( rgb, 0.2f, 0.4f, 1.0f );
    19.             break;
    20.         case SABER_PURPLE:
    21.             VectorSet( rgb, 0.9f, 0.2f, 1.0f );
    22.             break;
    23.     }
    24. }
    saber_colors_t = int, vec3_t = float[3]. Как видно, функция возвращает цвет (почему-то в массиве float). Моя задача - добавить еще один вариант.
    Проблема в том, что я плохо знаю асм - раньше с помощью IDA и чутья справлялся. Функцию в dll я нашел, но что-то в перехвате не работает. Притом я не вижу, чтобы использовался стек. То ли функция на самом деле другая, то ли компилятор что изменил... В общем - просьба такая - помогите интерпретировать функцию, чтобы понять, как правильно выполнить замену.
    Код (Text):
    1. _text:20136500 CG_RGBForSaberColor proc near           ; CODE XREF: sub_0_201365A0+D0p
    2. _text:20136500                                         ; CG_DoSaber+E3p
    3. _text:20136500                 cmp     ecx, 5          ; switch 6 cases
    4. _text:20136503                 ja      short locret_0_20136583 ; default
    5. _text:20136505                 jmp     ds:off_0_20136584[ecx*4] ; switch jump
    6. _text:2013650C
    7. _text:2013650C loc_0_2013650C:                         ; DATA XREF: _text:off_0_20136584o
    8. _text:2013650C                 mov     ecx, 2.0e-1     ; jumptable 20136505 case 0
    9. _text:20136511                 mov     dword ptr [eax], 1.0
    10. _text:20136517                 mov     [eax+4], ecx
    11. _text:2013651A                 mov     [eax+8], ecx
    12. _text:2013651D                 retn
    13. _text:2013651E ; ---------------------------------------------------------------------------
    14. _text:2013651E
    15. _text:2013651E loc_0_2013651E:                         ; CODE XREF: CG_RGBForSaberColor+5j
    16. _text:2013651E                                         ; DATA XREF: _text:off_0_20136584o
    17. _text:2013651E                 mov     dword ptr [eax], 1.0 ; jumptable 20136505 case 1
    18. _text:20136524                 mov     dword ptr [eax+4], 5.0e-1
    19. _text:2013652B                 mov     dword ptr [eax+8], 1.0e-1
    20. _text:20136532                 retn
    21. _text:20136533 ; ---------------------------------------------------------------------------
    22. _text:20136533
    23. _text:20136533 loc_0_20136533:                         ; CODE XREF: CG_RGBForSaberColor+5j
    24. _text:20136533                                         ; DATA XREF: _text:off_0_20136584o
    25. _text:20136533                 mov     dword ptr [eax], 1.0 ; jumptable 20136505 case 2
    26. _text:20136539                 mov     dword ptr [eax+4], 1.0
    27. _text:20136540                 mov     dword ptr [eax+8], 2.0e-1
    28. _text:20136547                 retn
    29. _text:20136548 ; ---------------------------------------------------------------------------
    30. _text:20136548
    31. _text:20136548 loc_0_20136548:                         ; CODE XREF: CG_RGBForSaberColor+5j
    32. _text:20136548                                         ; DATA XREF: _text:off_0_20136584o
    33. _text:20136548                 mov     ecx, 2.0e-1     ; jumptable 20136505 case 3
    34. _text:2013654D                 mov     [eax], ecx
    35. _text:2013654F                 mov     dword ptr [eax+4], 1.0
    36. _text:20136556                 mov     [eax+8], ecx
    37. _text:20136559                 retn
    38. _text:2013655A ; ---------------------------------------------------------------------------
    39. _text:2013655A
    40. _text:2013655A loc_0_2013655A:                         ; CODE XREF: CG_RGBForSaberColor+5j
    41. _text:2013655A                                         ; DATA XREF: _text:off_0_20136584o
    42. _text:2013655A                 mov     dword ptr [eax], 2.0e-1 ; jumptable 20136505 case 4
    43. _text:20136560                 mov     dword ptr [eax+4], 4.0000001e-1
    44. _text:20136567                 mov     dword ptr [eax+8], 1.0
    45. _text:2013656E                 retn
    46. _text:2013656F ; ---------------------------------------------------------------------------
    47. _text:2013656F
    48. _text:2013656F loc_0_2013656F:                         ; CODE XREF: CG_RGBForSaberColor+5j
    49. _text:2013656F                                         ; DATA XREF: _text:off_0_20136584o
    50. _text:2013656F                 mov     dword ptr [eax], 8.9999998e-1 ; jumptable 20136505 case 5
    51. _text:20136575                 mov     dword ptr [eax+4], 2.0e-1
    52. _text:2013657C                 mov     dword ptr [eax+8], 1.0
    53. _text:20136583
    54. _text:20136583 locret_0_20136583:                      ; CODE XREF: CG_RGBForSaberColor+3j
    55. _text:20136583                 retn                    ; default
    56. _text:20136583 CG_RGBForSaberColor endp
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Какой-то нестандартный вариант fastcall'а - первый параметр (color) в ecx, второй (указатель на rgb) в eax
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    static функция же, компилятор оптимизирует так, как хочет и на конвенции вызова никак не смотрит :)
     
  4. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    leo
    Спасибо, запомню. Вот только перехватить нормально не удается. В MSVC++, если не ошибаюсь, в __fastcall аргументы передаются в ECX, EDX и EAX по порядку. Попробовал изменить заголовок подменяемой функции на void __fastcall HookCG_RGBForSaberColor( saber_colors_t color, int, vec3_t rgb ). Теперь программа стала выдавать "кто я? Где я?" и вообще глючила конкретно. Подозреваю, потому что я использовал метод замены первых шести байт функции на push xxxx ret, xxxx - адрес перезаписываемой функции.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Zlyden
    [modnote=Clerk]Специально для вас создан этот топик http://www.wasm.ru/forum/viewtopic.php?id=38110[/modnote]
     
Статус темы:
Закрыта.