Есть такой результат работы иды, в котором я предполагяю находится "case", который в зависимости от значения вызывает CALL1, CALL2, и т.п. Но я не понимаю каким образом он действует. Что подскажете? Код (Text): ... .text:0016AEEE .text:0016AEEE var_10 = dword ptr -10h .text:0016AEEE arg_0 = dword ptr 8 .text:0016AEEE arg_8 = word ptr 10h .text:0016AEEE arg_C = dword ptr 14h .text:0016AEEE arg_10 = word ptr 18h .text:0016AEEE arg_14 = dword ptr 1Ch .text:0016AEEE .text:0016AEEE push ebp .text:0016AEEF mov ebp, esp .text:0016AEF1 push edi .text:0016AEF2 push esi .text:0016AEF3 push ebx .text:0016AEF4 push eax .text:0016AEF5 call sub_11C5D4 .text:0016AEFA add ebx, 0D8CEEh .text:0016AF00 mov esi, [ebp+arg_0] .text:0016AF03 mov ecx, [ebp+arg_C] .text:0016AF06 mov edx, [ebp+arg_14] .text:0016AF09 movzx edi, [ebp+arg_8] .text:0016AF0D movzx eax, [ebp+arg_10] .text:0016AF11 mov [ebp+var_10], eax .text:0016AF14 lea eax, [edi-1] .text:0016AF17 cmp eax, 22h .text:0016AF1A ja loc_16AFBF .text:0016AF20 mov eax, [ebx+eax*4-28A18h] .text:0016AF27 add eax, ebx .text:0016AF29 jmp eax .text:0016AF2B ; --------------------------------------------------------------------------- .text:0016AF2B push edx .text:0016AF2C push ecx .text:0016AF2D push esi .text:0016AF2E call CALL1 .text:0016AF33 jmp short loc_16AFAC .text:0016AF35 ; --------------------------------------------------------------------------- .text:0016AF35 push edx .text:0016AF36 push ecx .text:0016AF37 push esi .text:0016AF38 call CALL2 .text:0016AF3D jmp short loc_16AFAC .text:0016AF3F ; --------------------------------------------------------------------------- .text:0016AF3F push edx .text:0016AF40 push ecx .text:0016AF41 push esi .... CALL3, .... ----- sub_11C5D4 proc near .text:0011C5D4 .text:0011C5D4 mov ebx, [esp+0] .text:0011C5D7 retn .text:0011C5D7 sub_11C5D4 endp ----- .text:0016AFBF loc_16AFBF: .text:0016AFBF .text:0016AFBF xor eax, eax .text:0016AFC1 lea esp, [ebp-0Ch] .text:0016AFC4 pop ebx .text:0016AFC5 pop esi .text:0016AFC6 pop edi .text:0016AFC7 pop ebp
выбор адреса из таблицы. адрес самой таблицы видимо получается здесь: По логике это стандартный прием, например, тебе нужно (грубо говоря) сделать кейс на значение A чтобы если A==1 то возвращалось 4 из функции, если A==2 то возвращалось 536 из функции, если A==3 то делалось int3, иначе должно возвращаться 0. (к примеру надо такое написать). сишный код транслируется в нечто вида Код (Text): ourfunc: mov eax, [A] cmp eax, 3 ja ourfunc_quit jmp dword [case_table + eax*4] ourfunc_quit: xor eax, eax retn case_table: dd ourfunc_quit ; A == 0 dd case2 ; A == 1 dd case3 ; A == 2 dd case4 ; A == 3 ; A > 3 отсеяно командами (cmp eax, 3 / ja ..) case2: mov eax, 4 retn case3: mov eax, 536 retn case4: int3 jmp ourfunc_quit то есть составляется таблица адресов веток case для соответствующих значений аргумента. если значения не составляют последовательного ряда чисел, тогда используется более сложный код, но принцип тот же