Не удивляйтесь, что я начну с С++. Задача - сделать перехват функции. Простая функция, выглядеть должна примерно так: Code (Text): static void HookCG_RGBForSaberColor( saber_colors_t color, vec3_t rgb ) { switch( color ) { case SABER_RED: VectorSet( rgb, 1.0f, 0.2f, 0.2f ); break; case SABER_ORANGE: VectorSet( rgb, 1.0f, 0.5f, 0.1f ); break; case SABER_YELLOW: VectorSet( rgb, 1.0f, 1.0f, 0.2f ); break; case SABER_GREEN: VectorSet( rgb, 0.2f, 1.0f, 0.2f ); break; case SABER_BLUE: VectorSet( rgb, 0.2f, 0.4f, 1.0f ); break; case SABER_PURPLE: VectorSet( rgb, 0.9f, 0.2f, 1.0f ); break; } } saber_colors_t = int, vec3_t = float[3]. Как видно, функция возвращает цвет (почему-то в массиве float). Моя задача - добавить еще один вариант. Проблема в том, что я плохо знаю асм - раньше с помощью IDA и чутья справлялся. Функцию в dll я нашел, но что-то в перехвате не работает. Притом я не вижу, чтобы использовался стек. То ли функция на самом деле другая, то ли компилятор что изменил... В общем - просьба такая - помогите интерпретировать функцию, чтобы понять, как правильно выполнить замену. Code (Text): _text:20136500 CG_RGBForSaberColor proc near ; CODE XREF: sub_0_201365A0+D0p _text:20136500 ; CG_DoSaber+E3p _text:20136500 cmp ecx, 5 ; switch 6 cases _text:20136503 ja short locret_0_20136583 ; default _text:20136505 jmp ds:off_0_20136584[ecx*4] ; switch jump _text:2013650C _text:2013650C loc_0_2013650C: ; DATA XREF: _text:off_0_20136584o _text:2013650C mov ecx, 2.0e-1 ; jumptable 20136505 case 0 _text:20136511 mov dword ptr [eax], 1.0 _text:20136517 mov [eax+4], ecx _text:2013651A mov [eax+8], ecx _text:2013651D retn _text:2013651E ; --------------------------------------------------------------------------- _text:2013651E _text:2013651E loc_0_2013651E: ; CODE XREF: CG_RGBForSaberColor+5j _text:2013651E ; DATA XREF: _text:off_0_20136584o _text:2013651E mov dword ptr [eax], 1.0 ; jumptable 20136505 case 1 _text:20136524 mov dword ptr [eax+4], 5.0e-1 _text:2013652B mov dword ptr [eax+8], 1.0e-1 _text:20136532 retn _text:20136533 ; --------------------------------------------------------------------------- _text:20136533 _text:20136533 loc_0_20136533: ; CODE XREF: CG_RGBForSaberColor+5j _text:20136533 ; DATA XREF: _text:off_0_20136584o _text:20136533 mov dword ptr [eax], 1.0 ; jumptable 20136505 case 2 _text:20136539 mov dword ptr [eax+4], 1.0 _text:20136540 mov dword ptr [eax+8], 2.0e-1 _text:20136547 retn _text:20136548 ; --------------------------------------------------------------------------- _text:20136548 _text:20136548 loc_0_20136548: ; CODE XREF: CG_RGBForSaberColor+5j _text:20136548 ; DATA XREF: _text:off_0_20136584o _text:20136548 mov ecx, 2.0e-1 ; jumptable 20136505 case 3 _text:2013654D mov [eax], ecx _text:2013654F mov dword ptr [eax+4], 1.0 _text:20136556 mov [eax+8], ecx _text:20136559 retn _text:2013655A ; --------------------------------------------------------------------------- _text:2013655A _text:2013655A loc_0_2013655A: ; CODE XREF: CG_RGBForSaberColor+5j _text:2013655A ; DATA XREF: _text:off_0_20136584o _text:2013655A mov dword ptr [eax], 2.0e-1 ; jumptable 20136505 case 4 _text:20136560 mov dword ptr [eax+4], 4.0000001e-1 _text:20136567 mov dword ptr [eax+8], 1.0 _text:2013656E retn _text:2013656F ; --------------------------------------------------------------------------- _text:2013656F _text:2013656F loc_0_2013656F: ; CODE XREF: CG_RGBForSaberColor+5j _text:2013656F ; DATA XREF: _text:off_0_20136584o _text:2013656F mov dword ptr [eax], 8.9999998e-1 ; jumptable 20136505 case 5 _text:20136575 mov dword ptr [eax+4], 2.0e-1 _text:2013657C mov dword ptr [eax+8], 1.0 _text:20136583 _text:20136583 locret_0_20136583: ; CODE XREF: CG_RGBForSaberColor+3j _text:20136583 retn ; default _text:20136583 CG_RGBForSaberColor endp
Какой-то нестандартный вариант fastcall'а - первый параметр (color) в ecx, второй (указатель на rgb) в eax
leo Спасибо, запомню. Вот только перехватить нормально не удается. В MSVC++, если не ошибаюсь, в __fastcall аргументы передаются в ECX, EDX и EAX по порядку. Попробовал изменить заголовок подменяемой функции на void __fastcall HookCG_RGBForSaberColor( saber_colors_t color, int, vec3_t rgb ). Теперь программа стала выдавать "кто я? Где я?" и вообще глючила конкретно. Подозреваю, потому что я использовал метод замены первых шести байт функции на push xxxx ret, xxxx - адрес перезаписываемой функции.
Zlyden [modnote=Clerk]Специально для вас создан этот топик http://www.wasm.ru/forum/viewtopic.php?id=38110[/modnote]