punxer 0. Протрассируйте (своим обработчегом в SEH) первые 5 команд пролога процедуры начало которой вы хотите заменить на jmp. Таким образом вы выясните сколько и какие инструкции нужно будет выполнить перед возвратом в перехваченный код; 1. Возьмите дизассемблер длин и сделайте то же самое; 2. Небольшой байт-скан: прологи функций мало отличаются разнообразием: обычно это однобайтовые push reg32 (50h-57h), команды загрузки регистров из переданных параметров (mov reg32,[esp+XX] / mov reg32,[ebp+XX]), стандартное начало оформления локального фрейма push ebp/mov ebp, esp и некоторые немногие другие; 3. После выполнения джампа на свой код [атомарно?] восстановите испорченные байты а также поменяйте в стеке адрес возврата на свою вторую процедуру, адрес запомните и после отработки функи прыгнете на него; 4. Поиск первого call (e8 ?? ?? ?? ??) с фильтрацией на условные переходы используя техники выше для вычисления длин инструкций. 5. И другие, числом бесконечные, методы...
punxer Калбэк это то, что вызывает код: Код (Text): .text:00552E54 call edx Вы должны его заменить в стуктуре, на которую передаются ссылки в вашу процедуру.
punxer Я не силен в терминах - че у нас там такое "сплайсенг"? Трассировка/эмуляция перехватываемой функии до некоторого момента с целью внесения перехватывающей инструкции НЕ в самое начало? Что значит - плох или неплох? Какие цели? Если нет цели избежать детекта перехвата то простой джамп или колл в самое начало должен работать.
punxer Пока особо делать нечего опишу кратко как перехватывать этот кодес. Первый параметр в strOut() это ссылка на переменную(тоесть адрес переменной, которая также может быть структурой), содержащую ссылку на какуюто структуру, условно назовём ENVIRONMENT: Код (Text): typedef struct _ENVIRONMENT { ... ; Не известные поля. PREFERENCE_NOTIFICATION_FUNCTION PreNotify; // +0x44, Reference routine ? ... PDEREFERENCE_NOTIFICATION_FUNCTION PostNotify; // +0x68, Dereference routine ? ... } ENVIRONMENT, *PENVIRONMENT; typedef VOID (*PREFERENCE_NOTIFICATION_ROUTINE)( IN PENVIRONMENT Environment, OUT PHANDLE hDC ); typedef VOID (*PDEREFERENCE_NOTIFICATION_ROUTINE)( IN PENVIRONMENT Environment, IN HANDLE hDC ); Нужно заменить калбэк(для этого нужно знать где хранится ссылка на структуру или на переменную, содержащую ссылку на структуру ENVIRONMENT) например так: Код (Text): .data OldRoutine PVOID ? .code ReferenceRoutine proc uses ebx pEnv:PENVIRONMENT, hDC:PHANDLE push hDC push pEnv Call OldRoutine mov ebx,eax ... mov eax,ebx ret ; или вначале обрабатываем перехват и возвращаемся: ; pop ebx ; leave ; jmp OldRoutine ReferenceRoutine endp ; Устанавливаем перехват: ; pEnv:PENVIRONMENT mov eax,pEnv lea ecx,ReferenceRoutine lock xchg dword ptr [eax + 44H],ecx ; ENVIRONMENT.PreNotify mov OldRoutine,ecx Используя технику IDP, делается не валидной ссылка на структуру в переменной: Код (Text): ; INIT %CALLIDP IDP_INITIALIZE_ENGINE %NTERR ; ADDVEH %GET_GRAPH_ENTRY $VEH push eax push 0 %CALLIDP IDP_ADD_VEH .if !Eax mov eax,STATUS_INTERNAL_ERROR %BREAK .endif ; BADREF push sizeof(ENVIRONMENT) push Reference ; адрес переменной, содержащей ссылку на ENVIRONMENT. %CALLIDP IDP_ADD_REFERENCE %NTERR Шаблон VEH: Код (Text): $GET_GRAPH_REFERENCE $VEH: %GET_CURRENT_GRAPH_ENTRY VEH proc uses ebx esi edi ExceptionPointers:PEXCEPTION_POINTERS mov eax,ExceptionPointers mov esi,EXCEPTION_POINTERS.ExceptionRecord[eax] assume esi:PEXCEPTION_RECORD mov edi,EXCEPTION_POINTERS.ContextRecord[eax] assume edi:PCONTEXT cmp [esi].ExceptionFlags,NULL jnz Chain cmp [esi].ExceptionCode,IDP_BREAKPOINT je Load cmp [esi].ExceptionCode,IDP_SINGLE_STEP jne IsTrap [...] jmp Load IsTrap: cmp [esi].ExceptionCode,STATUS_SINGLE_STEP jne Chain [...] Load: mov eax,EXCEPTION_CONTINUE_EXECUTION Exit: ret Chain: xor eax,eax jmp Exit VEH endp Собственно двиг: Код (Text): ; o IDP Engine v3.1 ; o MI, UM. IDP_INITIALIZE_ENGINE equ 0 ; typedef NTSTATUS (*PENTRY)( ; ); IDP_ADD_REFERENCE equ 1 ; typedef NTSTATUS (*PENTRY)( ; IN OUT PVOID *Reference ; IN ULONG SpaceSize ; ); ; typedef LONG (*PVECTORED_EXCEPTION_HANDLER)( ; IN OUT PEXCEPTION_POINTERS *ExceptionInformation ; ); IDP_ADD_VEH equ 2 ; typedef PVOID (*PENTRY)( ; IN ULONG First, ; IN PVECTORED_EXCEPTION_HANDLER Handler ; ); IDP_REMOVE_VEH equ 3 ; typedef ULONG (*PENTRY)( ; IN PVOID Handle ; ); IDP_QUERY_ENTRY equ 4 ;typedef NTSTATUS (*PENTRY)( ; IN PVOID ImageBase OPTIONAL, ; IN PVOID HashOrFunctionName, ; IN PCOMPUTE_HASH_ROUTINE HashRoutine OPTIONAL, ; IN ULONG PartialCrc, ; OUT *PVOID Entry ; ); ;typedef ULONG (*PCOMPUTE_HASH_ROUTINE)( ; IN ULONG UserParameter, ; IN PVOID Buffer, ; IN ULONG Length ; ); IDP_QUERY_ENTRIES equ 5 ; typedef NTSTATUS (*PENTRY)( ; IN PVOID ImageBase OPTIONAL, ; IN ULONG PartialCrc, ; IN PULONG Crc32List, ; OUT *PVOID EntriesList ; ); SEGMENT_ENTRY struct SegmentBase PVOID ? SegmentLimit PVOID ? SegmentAddress PVOID ? Reference PVOID ? SEGMENT_ENTRY ends PSEGMENT_ENTRY typedef ptr SEGMENT_ENTRY IDP_SEGMENT_ENTRY_OFFSET equ (PAGE_SIZE - 4) THREAD_STATE struct rEFlags DWORD ? Entry PSEGMENT_ENTRY ? THREAD_STATE ends PTHREAD_STATE typedef ptr THREAD_STATE IDP_THREAD_STATE_OFFSET equ (X86_PAGE_SIZE - 2*4) IDP_BREAKPOINT equ 80FE0001H IDP_SINGLE_STEP equ 80FE0002H %CALLIDP macro Service mov eax,Service Call IDP endm %GET_CURRENT_GRAPH_ENTRY macro Call GetGraphReference endm %GET_GRAPH_ENTRY macro PGET_CURRENT_GRAPH_ENTRY Call PGET_CURRENT_GRAPH_ENTRY endm $GET_GRAPH_REFERENCE macro GetGraphReference:: pop eax ret endm IDP:: ; ~~~~~~~~~~~~~~~~~~ Autogenerated dump ~~~~~~~~~~~~~~~~~~~~~ DB 085H, 0C0H, 00FH, 084H, 016H, 006H, 000H, 000H, 048H, 00FH DB 084H, 0BEH, 002H, 000H, 000H, 048H, 00FH, 084H, 03EH, 002H DB 000H, 000H, 048H, 00FH, 084H, 055H, 002H, 000H, 000H, 048H DB 00FH, 084H, 0ABH, 000H, 000H, 000H, 048H, 00FH, 084H, 0AAH DB 001H, 000H, 000H, 0B8H, 00DH, 000H, 000H, 0C0H, 0C3H, 059H DB 055H, 050H, 0E8H, 01FH, 000H, 000H, 000H, 050H, 064H, 0FFH DB 035H, 000H, 000H, 000H, 000H, 064H, 089H, 025H, 000H, 000H DB 000H, 000H, 0FFH, 0E1H, 059H, 064H, 08FH, 005H, 000H, 000H DB 000H, 000H, 08DH, 064H, 024H, 00CH, 0FFH, 0E1H, 0E8H, 012H DB 000H, 000H, 000H, 08BH, 044H, 024H, 004H, 08BH, 064H, 024H DB 008H, 08BH, 000H, 08BH, 06CH, 024H, 00CH, 0FFH, 064H, 024H DB 008H, 058H, 0C3H, 055H, 08BH, 0ECH, 08BH, 055H, 008H, 0B8H DB 07BH, 000H, 000H, 0C0H, 066H, 081H, 03AH, 04DH, 05AH, 075H DB 02AH, 003H, 052H, 03CH, 081H, 03AH, 050H, 045H, 000H, 000H DB 075H, 01FH, 066H, 081H, 07AH, 014H, 0E0H, 000H, 075H, 017H DB 066H, 081H, 07AH, 004H, 04CH, 001H, 075H, 00FH, 066H, 0F7H DB 042H, 016H, 000H, 001H, 074H, 007H, 08BH, 04DH, 00CH, 033H DB 0C0H, 089H, 011H, 0C9H, 0C2H, 008H, 000H, 055H, 08BH, 0ECH DB 053H, 08BH, 04DH, 008H, 08BH, 055H, 00CH, 033H, 0DBH, 08AH DB 004H, 00BH, 038H, 004H, 013H, 075H, 005H, 043H, 084H, 0C0H DB 075H, 0F3H, 05BH, 0C9H, 0C2H, 008H, 000H, 055H, 08BH, 0ECH DB 083H, 0C4H, 0F4H, 053H, 056H, 057H, 0E8H, 0D9H, 000H, 000H DB 000H, 0E8H, 04FH, 0FFH, 0FFH, 0FFH, 064H, 0A1H, 030H, 000H DB 000H, 000H, 08BH, 05DH, 008H, 08BH, 040H, 00CH, 085H, 0DBH DB 08BH, 040H, 00CH, 075H, 005H, 08BH, 000H, 08BH, 058H, 018H DB 08DH, 045H, 0F8H, 050H, 053H, 0E8H, 06DH, 0FFH, 0FFH, 0FFH DB 085H, 0C0H, 08BH, 055H, 0F8H, 00FH, 085H, 0B8H, 000H, 000H DB 000H, 08BH, 042H, 078H, 085H, 0C0H, 00FH, 084H, 0ADH, 000H DB 000H, 000H, 003H, 0C3H, 089H, 045H, 0FCH, 08BH, 070H, 020H DB 085H, 0F6H, 00FH, 084H, 0A4H, 000H, 000H, 000H, 08BH, 040H DB 018H, 085H, 0C0H, 00FH, 084H, 099H, 000H, 000H, 000H, 089H DB 045H, 0F4H, 003H, 0F3H, 033H, 0FFH, 0FCH, 08BH, 006H, 003H DB 0C3H, 083H, 07DH, 010H, 000H, 074H, 024H, 057H, 08BH, 0F8H DB 0B9H, 004H, 001H, 000H, 000H, 08BH, 0D7H, 033H, 0C0H, 0F2H DB 0AEH, 0F7H, 0D1H, 05FH, 081H, 0C1H, 004H, 001H, 000H, 000H DB 051H, 052H, 0FFH, 075H, 014H, 0FFH, 055H, 010H, 039H, 045H DB 00CH, 0EBH, 009H, 050H, 0FFH, 075H, 00CH, 0E8H, 03DH, 0FFH DB 0FFH, 0FFH, 075H, 030H, 08BH, 04DH, 0FCH, 08BH, 041H, 024H DB 003H, 0C3H, 00FH, 0B7H, 03CH, 078H, 00BH, 0FFH, 074H, 009H DB 03BH, 079H, 010H, 072H, 003H, 02BH, 079H, 010H, 047H, 08BH DB 071H, 01CH, 003H, 0F3H, 08BH, 00CH, 0BEH, 085H, 0C9H, 08BH DB 055H, 018H, 074H, 029H, 003H, 0CBH, 033H, 0C0H, 089H, 00AH DB 0EBH, 015H, 083H, 0C6H, 004H, 047H, 0FFH, 04DH, 0F4H, 075H DB 08EH, 0B8H, 07AH, 000H, 000H, 0C0H, 0EBH, 005H, 0E8H, 0B4H DB 0FEH, 0FFH, 0FFH, 0E8H, 08AH, 0FEH, 0FFH, 0FFH, 05FH, 05EH DB 05BH, 0C9H, 0C2H, 014H, 000H, 0B8H, 07BH, 000H, 000H, 0C0H DB 0EBH, 0EDH, 0B8H, 0FFH, 000H, 000H, 0C0H, 0EBH, 0E6H, 055H DB 08BH, 0ECH, 083H, 0C4H, 0ECH, 056H, 057H, 0E8H, 062H, 000H DB 000H, 000H, 0E8H, 04AH, 0FEH, 0FFH, 0FFH, 08DH, 04DH, 0FCH DB 033H, 0C0H, 051H, 08DH, 055H, 0ECH, 050H, 050H, 052H, 050H DB 02DH, 0AEH, 08BH, 093H, 0BCH, 089H, 045H, 0ECH, 005H, 01DH DB 0F9H, 003H, 032H, 089H, 045H, 0F0H, 035H, 01BH, 008H, 033H DB 007H, 089H, 045H, 0F4H, 035H, 017H, 056H, 071H, 072H, 089H DB 045H, 0F8H, 0E8H, 0B6H, 0FEH, 0FFH, 0FFH, 085H, 0C0H, 08BH DB 075H, 010H, 075H, 029H, 08BH, 07DH, 014H, 0ADH, 057H, 0FFH DB 075H, 00CH, 0FFH, 075H, 0FCH, 050H, 0FFH, 075H, 008H, 0E8H DB 09BH, 0FEH, 0FFH, 0FFH, 085H, 0C0H, 075H, 011H, 0ADH, 083H DB 0C7H, 004H, 085H, 0C0H, 075H, 0E4H, 033H, 0C0H, 0EBH, 005H DB 0E8H, 026H, 0FEH, 0FFH, 0FFH, 0E8H, 0FCH, 0FDH, 0FFH, 0FFH DB 05FH, 05EH, 0C9H, 0C2H, 010H, 000H, 033H, 0C0H, 064H, 08BH DB 00DH, 030H, 000H, 000H, 000H, 0F0H, 00FH, 0B1H, 081H, 0FCH DB 00FH, 000H, 000H, 075H, 008H, 0B8H, 001H, 000H, 000H, 0C0H DB 0C2H, 008H, 000H, 0FFH, 060H, 028H, 033H, 0C0H, 064H, 08BH DB 00DH, 030H, 000H, 000H, 000H, 0F0H, 00FH, 0B1H, 081H, 0FCH DB 00FH, 000H, 000H, 075H, 008H, 0B8H, 001H, 000H, 000H, 0C0H DB 0C2H, 008H, 000H, 0FFH, 060H, 02CH, 055H, 08BH, 0ECH, 08BH DB 045H, 008H, 08BH, 055H, 00CH, 08BH, 0C8H, 081H, 0E2H, 000H DB 000H, 00FH, 000H, 0C1H, 0E8H, 010H, 081H, 0E1H, 000H, 000H DB 000H, 0FFH, 025H, 0FFH, 000H, 000H, 000H, 08DH, 094H, 002H DB 000H, 0F2H, 0C0H, 000H, 00BH, 0D1H, 08BH, 045H, 00CH, 08BH DB 04DH, 008H, 025H, 0FFH, 0FFH, 000H, 000H, 0C1H, 0E1H, 010H DB 08DH, 00CH, 008H, 0C9H, 0C2H, 008H, 000H, 055H, 08BH, 0ECH DB 083H, 0C4H, 0F4H, 053H, 056H, 057H, 033H, 0C0H, 064H, 08BH DB 01DH, 030H, 000H, 000H, 000H, 0F0H, 00FH, 0B1H, 083H, 0FCH DB 00FH, 000H, 000H, 08BH, 0D8H, 075H, 00AH, 0B8H, 001H, 000H DB 000H, 0C0H, 0E9H, 0D0H, 000H, 000H, 000H, 08DH, 04BH, 034H DB 089H, 05DH, 0F8H, 051H, 0FFH, 053H, 020H, 08DH, 073H, 050H DB 08BH, 07DH, 008H, 08BH, 04BH, 04CH, 08BH, 03FH, 089H, 07DH DB 0FCH, 081H, 0FFH, 000H, 000H, 001H, 000H, 00FH, 086H, 0B3H DB 000H, 000H, 000H, 08BH, 0C7H, 08BH, 055H, 00CH, 081H, 0E7H DB 0FFH, 00FH, 000H, 000H, 085H, 0D2H, 00FH, 084H, 0A0H, 000H DB 000H, 000H, 003H, 0D7H, 089H, 075H, 0F4H, 0E3H, 037H, 081H DB 0F9H, 080H, 000H, 000H, 000H, 072H, 01AH, 0B8H, 09AH, 000H DB 000H, 0C0H, 0EBH, 07AH, 039H, 016H, 076H, 01FH, 081H, 0C7H DB 000H, 010H, 000H, 000H, 04AH, 074H, 0ECH, 08BH, 075H, 0F4H DB 08BH, 04BH, 04CH, 039H, 046H, 008H, 074H, 058H, 039H, 03EH DB 074H, 0E8H, 073H, 0E2H, 039H, 07EH, 004H, 073H, 0E1H, 083H DB 0C6H, 010H, 0E2H, 0EBH, 08BH, 045H, 0FCH, 0BAH, 0FFH, 0FFH DB 0FEH, 07FH, 056H, 02BH, 0D0H, 02BH, 075H, 0F4H, 02BH, 0C7H DB 0D1H, 0EEH, 025H, 000H, 0F0H, 0FFH, 0FFH, 0C1H, 0EAH, 00CH DB 08DH, 076H, 00FH, 052H, 050H, 0E8H, 002H, 0FFH, 0FFH, 0FFH DB 06AH, 000H, 06AH, 000H, 06AH, 000H, 052H, 051H, 056H, 0FFH DB 053H, 00CH, 05EH, 085H, 0C0H, 08BH, 04DH, 008H, 075H, 01AH DB 089H, 03EH, 089H, 04EH, 00CH, 089H, 039H, 0FFH, 075H, 0FCH DB 0FFH, 043H, 04CH, 08FH, 046H, 008H, 08BH, 055H, 00CH, 033H DB 0C0H, 003H, 0D7H, 089H, 056H, 004H, 08DH, 04BH, 034H, 050H DB 051H, 0FFH, 053H, 024H, 058H, 05FH, 05EH, 05BH, 0C9H, 0C2H DB 008H, 000H, 0B8H, 00DH, 000H, 000H, 0C0H, 0EBH, 0E9H, 055H DB 08BH, 0ECH, 083H, 0C4H, 0F0H, 053H, 056H, 057H, 08BH, 075H DB 008H, 033H, 0DBH, 0C7H, 045H, 0FCH, 011H, 000H, 000H, 000H DB 0C7H, 045H, 0F0H, 0F0H, 0F2H, 066H, 067H, 0C7H, 045H, 0F4H DB 0F3H, 02EH, 03EH, 036H, 0C7H, 045H, 0F8H, 026H, 064H, 065H DB 000H, 08DH, 055H, 0F0H, 0FFH, 04DH, 0FCH, 074H, 02BH, 0ACH DB 08BH, 0FAH, 0B9H, 00BH, 000H, 000H, 000H, 0F2H, 0AEH, 075H DB 00AH, 083H, 0F9H, 006H, 073H, 0EAH, 00FH, 0B6H, 0D8H, 0EBH DB 0E5H, 08BH, 0D0H, 02CH, 0A4H, 074H, 004H, 0FEH, 0C8H, 075H DB 00BH, 08BH, 0C2H, 08BH, 0CBH, 05FH, 05EH, 05BH, 0C9H, 0C2H DB 004H, 000H, 033H, 0C0H, 0EBH, 0F3H, 0E8H, 036H, 0FCH, 0FFH DB 0FFH, 055H, 08BH, 0ECH, 083H, 0C4H, 0FCH, 053H, 056H, 057H DB 08BH, 055H, 008H, 033H, 0C0H, 08BH, 032H, 08BH, 07AH, 004H DB 083H, 07EH, 004H, 000H, 064H, 08BH, 01DH, 030H, 000H, 000H DB 000H, 075H, 05EH, 0F0H, 00FH, 0B1H, 083H, 0FCH, 00FH, 000H DB 000H, 074H, 054H, 08BH, 0D8H, 08DH, 04BH, 034H, 051H, 0FFH DB 053H, 020H, 081H, 03EH, 005H, 000H, 000H, 0C0H, 00FH, 085H DB 0E1H, 000H, 000H, 000H, 083H, 07EH, 014H, 000H, 08BH, 046H DB 018H, 00FH, 095H, 0C1H, 083H, 07EH, 010H, 002H, 00FH, 0B6H DB 0C9H, 00FH, 085H, 093H, 000H, 000H, 000H, 089H, 04DH, 0FCH DB 03DH, 000H, 000H, 001H, 000H, 00FH, 083H, 085H, 000H, 000H DB 000H, 08BH, 04BH, 04CH, 08DH, 073H, 050H, 08BH, 0D0H, 0E3H DB 07BH, 039H, 006H, 077H, 005H, 039H, 046H, 004H, 077H, 00BH DB 083H, 0C6H, 010H, 0E2H, 0F2H, 0EBH, 06BH, 033H, 0C0H, 0EBH DB 072H, 02BH, 0D0H, 0FFH, 0B7H, 0C0H, 000H, 000H, 000H, 081H DB 08FH, 0C0H, 000H, 000H, 000H, 000H, 001H, 000H, 000H, 064H DB 08FH, 005H, 0F8H, 00FH, 000H, 000H, 064H, 089H, 035H, 0FCH DB 00FH, 000H, 000H, 08DH, 034H, 0D5H, 00FH, 000H, 000H, 000H DB 0FFH, 0B7H, 0B8H, 000H, 000H, 000H, 0E8H, 0E6H, 0FEH, 0FFH DB 0FFH, 085H, 0C0H, 075H, 01AH, 089H, 0B7H, 090H, 000H, 000H DB 000H, 089H, 0B7H, 08CH, 000H, 000H, 000H, 089H, 0B7H, 094H DB 000H, 000H, 000H, 089H, 0B7H, 098H, 000H, 000H, 000H, 0EBH DB 00CH, 083H, 07DH, 0FCH, 000H, 074H, 023H, 089H, 0B7H, 094H DB 000H, 000H, 000H, 08BH, 045H, 008H, 08BH, 000H, 0C7H, 000H DB 001H, 000H, 0FEH, 080H, 033H, 0C0H, 08DH, 04BH, 034H, 050H DB 051H, 0FFH, 053H, 024H, 058H, 05FH, 05EH, 05BH, 0C9H, 0C2H DB 004H, 000H, 085H, 0C9H, 089H, 0B7H, 098H, 000H, 000H, 000H DB 074H, 0D9H, 080H, 0F9H, 026H, 075H, 008H, 089H, 0B7H, 094H DB 000H, 000H, 000H, 0EBH, 0CCH, 089H, 0B7H, 090H, 000H, 000H DB 000H, 089H, 0B7H, 08CH, 000H, 000H, 000H, 0EBH, 0BEH, 081H DB 03EH, 004H, 000H, 000H, 080H, 00FH, 085H, 096H, 000H, 000H DB 000H, 08BH, 003H, 08BH, 04EH, 00CH, 085H, 0C0H, 08DH, 053H DB 004H, 074H, 029H, 083H, 0F8H, 001H, 074H, 006H, 03BH, 0C1H DB 075H, 020H, 0EBH, 00DH, 03BH, 0CAH, 072H, 007H, 083H, 0C2H DB 008H, 03BH, 0CAH, 072H, 09BH, 089H, 00BH, 081H, 0A7H, 0C0H DB 000H, 000H, 000H, 0FFH, 0FEH, 0FFH, 0FFH, 0B8H, 0FFH, 0FFH DB 0FFH, 0FFH, 0EBH, 08AH, 064H, 0A1H, 0F8H, 00FH, 000H, 000H DB 085H, 0C0H, 00FH, 084H, 07AH, 0FFH, 0FFH, 0FFH, 064H, 0C7H DB 005H, 0F8H, 00FH, 000H, 000H, 000H, 000H, 000H, 000H, 0C7H DB 006H, 002H, 000H, 0FEH, 080H, 025H, 000H, 001H, 000H, 000H DB 0C7H, 087H, 08CH, 000H, 000H, 000H, 000H, 000H, 000H, 000H DB 081H, 0A7H, 0C0H, 000H, 000H, 000H, 0FFH, 0FEH, 0FFH, 0FFH DB 0C7H, 087H, 090H, 000H, 000H, 000H, 03BH, 000H, 000H, 000H DB 0C7H, 087H, 094H, 000H, 000H, 000H, 023H, 000H, 000H, 000H DB 0C7H, 087H, 098H, 000H, 000H, 000H, 023H, 000H, 000H, 000H DB 009H, 087H, 0C0H, 000H, 000H, 000H, 0E9H, 027H, 0FFH, 0FFH DB 0FFH, 081H, 03EH, 096H, 000H, 000H, 0C0H, 00FH, 085H, 01BH DB 0FFH, 0FFH, 0FFH, 08DH, 043H, 00AH, 039H, 046H, 00CH, 00FH DB 085H, 00FH, 0FFH, 0FFH, 0FFH, 0FFH, 087H, 0B8H, 000H, 000H DB 000H, 0E9H, 06BH, 0FFH, 0FFH, 0FFH, 055H, 08BH, 0ECH, 083H DB 0C4H, 0A8H, 053H, 056H, 057H, 0E8H, 0EEH, 000H, 000H, 000H DB 0E8H, 000H, 0FAH, 0FFH, 0FFH, 033H, 0C0H, 064H, 08BH, 01DH DB 030H, 000H, 000H, 000H, 0F0H, 00FH, 0B1H, 083H, 0FCH, 00FH DB 000H, 000H, 08DH, 04DH, 0BCH, 074H, 00AH, 0B8H, 001H, 000H DB 000H, 0C0H, 0E9H, 0CEH, 000H, 000H, 000H, 051H, 033H, 0C0H DB 08DH, 07DH, 0BCH, 02DH, 0A5H, 0E0H, 068H, 0D6H, 057H, 0FCH DB 0ABH, 035H, 02FH, 0BAH, 0B7H, 0F1H, 0ABH, 005H, 060H, 080H DB 059H, 021H, 0ABH, 02DH, 030H, 02CH, 003H, 06CH, 0ABH, 035H DB 0F8H, 018H, 055H, 0EDH, 0ABH, 005H, 008H, 06FH, 0DBH, 0F8H DB 0ABH, 02DH, 013H, 031H, 007H, 0B9H, 0ABH, 035H, 059H, 01DH DB 053H, 025H, 0ABH, 005H, 02EH, 0FFH, 02CH, 044H, 0ABH, 033H DB 0C0H, 0ABH, 050H, 050H, 0E8H, 03CH, 0FBH, 0FFH, 0FFH, 085H DB 0C0H, 0C7H, 045H, 0A8H, 050H, 002H, 000H, 000H, 075H, 07BH DB 089H, 045H, 0ACH, 08DH, 04DH, 0ACH, 08DH, 055H, 0A8H, 06AH DB 040H, 068H, 000H, 010H, 000H, 000H, 052H, 06AH, 000H, 051H DB 06AH, 0FFH, 0FFH, 055H, 0C0H, 085H, 0C0H, 08DH, 055H, 0E4H DB 075H, 05BH, 052H, 0FFH, 055H, 0C8H, 085H, 0C0H, 075H, 06AH DB 0E8H, 063H, 0FDH, 0FFH, 0FFH, 050H, 06AH, 001H, 0FFH, 055H DB 0D8H, 085H, 0C0H, 0FCH, 074H, 04DH, 0B9H, 010H, 000H, 000H DB 000H, 089H, 045H, 0E0H, 08BH, 07DH, 0ACH, 08DH, 075H, 0B0H DB 033H, 0C0H, 08BH, 0D7H, 089H, 045H, 0B0H, 0C7H, 045H, 0B4H DB 068H, 000H, 001H, 000H, 0C7H, 045H, 0B8H, 000H, 09DH, 0F4H DB 0C3H, 0F3H, 0A5H, 0F0H, 00FH, 0B1H, 093H, 0FCH, 00FH, 000H DB 000H, 075H, 01EH, 033H, 0C0H, 08DH, 04AH, 004H, 0C7H, 002H DB 001H, 000H, 000H, 000H, 0FFH, 0D1H, 0EBH, 005H, 0E8H, 050H DB 0F9H, 0FFH, 0FFH, 0E8H, 026H, 0F9H, 0FFH, 0FFH, 05FH, 05EH DB 05BH, 0C9H, 0C3H, 08DH, 045H, 0E4H, 068H, 001H, 000H, 000H DB 0C0H, 050H, 0FFH, 055H, 0CCH, 058H, 050H, 08DH, 04DH, 0A8H DB 068H, 000H, 080H, 000H, 000H, 08DH, 055H, 0ACH, 051H, 052H DB 06AH, 0FFH, 0FFH, 055H, 0C4H, 058H, 0EBH, 0D3H ; ~~~~~~~~~~~~~~~~~~~~~~~~~ 0x74C ~~~~~~~~~~~~~~~~~~~~~~~~~~~ o Обработчик должен проверить откуда происходит вызов. Для этого нужно распарсить strOut(), определив адрес инструкции (.text:00552E54 call edx), если используется замена калбэка, либо определить места обращения к ENVIRONMENT из этой процедуры. Обработчик должен проверять адрес возврата и пропускать сторонние вызовы. С этим всё понятно думаю. o Если целевой код находится выше чем код, на котором обработчик получил управление. В этом случае следует выполнить трассировку. При трассировке определяется процедурное ветвление, если оно обнаружено, то ветвление выполняется, после чего адрес возврата из процедуры гдето сохраняется, заменяется на стаб, трассировка прекращается. При этом процедура отработает и при возврате управление получит стаб. Он должен сгенерировать #DB и выполнить переход на сохранённый адрес возврата. Таким образом все процедуры будут пропущены(не будут трассироваться). При достижении целевого кода трассировка прекращается, также как и при переходе на адрес возврата из strOut(). При использовании трассировки необходимо пофиксить трассировочный баг, иначе возникнет деадлок. В случае использования IDP движка он этот баг фиксит сам. o Использование IDP в данном случае не приемлимо, достаточно изменить ссылку на калбэк. Так как про структуру ENVIRONMENT ничего более не известно, то утверждать точно нельзя, возможно гдето есть проверки или ссылки на калбэки перезагружаются.
Clerk может накатаешь статью? Интересно будет почитать и посмотреть рабочие примеры особенно на си. Сорри что такой назойливый) И как ИДП расшифровывается)
Clerk Что такое и как ИДП я прозрел. Спасибо. Знал и ранее но до использования не доходило - задачи не те.
Intercept of the Destruction of Pointers. Какбэ так, мб криво но суть понятна. Как я назвал так назвал, это техника захвата кода разрушением ссылок. Альтернативы этому нет на данный момент. Статьй куча, используйте поиск. Единственный нуанс это проблема енума SFC, ваша процедура не формирует стековый фрейм. Енум их является проблемой. Данный вопрос будет рассмотрен на виртеке в виде статьи в ближайшее время.