Это необходимо для сплайсинга. Я использовал дизассемблер длин иснтрукций от Micro$oft, но сегодня возникла интересная идея. При исполнении инструкции с установленным EFLAGS.TrapFlag возникает отладочное исключение EXCEPTION_SINGLE_STEP, а контекст содержит адрес следующей инструкции. Многим будет полезно. Код (Text): _enter_ macro assume fs:nothing push ebp push esp push offset SehNext_ push offset SehHandler_ push FS:[0] mov FS:[0],esp endm _leave_ macro SehNext_: pop FS:[0] add esp,16 endm SehHandler_ proc uses edx ebx ExceptionRecord:PVOID, EstablisherFrame:PSEH, ContextRecord:PCONTEXT, DispatcherContext:PVOID mov edx,ExceptionRecord assume edx:ptr EXCEPTION_RECORD ; cmp [edx].ExceptionCode,EXCEPTION_SINGLE_STEP mov ebx,EstablisherFrame assume ebx:PSEH mov ecx,ContextRecord assume ecx:PCONTEXT mov [ecx].regEax,STATUS_INVALID_PARAMETER push [edx].ExceptionAddress pop [ecx].regEax push [ebx].SafeOffset pop [ecx].regEip push [ebx].PrevEsp sub dword ptr [esp],16 pop [ecx].regEsp push [ebx].PrevEbp pop [ecx].regEbp and [ecx].regEFlags,not EFLAGS_TF xor eax,eax ;ExceptionContinueExecution ret SehHandler_ endp QueryInstructionLength proc uses esi edi ebx Instruction:PVOID Local Buffer[32]:BYTE lea edi,Buffer lea esi,code_ mov ecx,9 mov ebx,edi cld rep movsb mov esi,Instruction mov ecx,32 rep movsb _enter_ Jmp Ebx _leave_ sub eax,ebx sub eax,9 ret code_: BYTE 9Ch, 81h, 0Ch, 24h, 00h, 01h, 00h, 00h, 9Dh ;pushfd/or dword ptr [esp],EFLAGS_TF/popfd QueryInstructionLength endp
btw, не советовал бы юзать ldasm. там куча ошибок как в таблицах, так и в коде. причем например функция IsRelativeCmd вообще корявая, точнее коряво расставленны флаги. например call reg/mem считается относительной, а jxx imm8 нет.