Уроки Iczelion'а




Анализ - часть 2


Так как int 21h, 440Dh, minor code 66h принимает указатель на структуру MID в ds:dx, мы должны разделить пару "сегмент:смещение" в edx'е на две части и поместить их в соответствующие образы регистров.

mov eax,21h VMMCall Exec_Int VMMCall End_Nest_Exec Pop_Client_State

Когда все готово, мы вызываем Exec_Int, чтобы произвести вызов прерывания.

mov ecx,AllocSize stc mov ebx,Handle push esi mov esi,OFFSET32 MediaID push ds pop fs VxDCall V86MMGR_Free_Buffer pop esi

После возвращения Exec_Int, зарезервированный буфер будет заполнен необходимой нам информацией. Следующий шаг - это получить информацию. Мы достигнем этой цели, вызвав V86MMGR_Free_Buffer. Этот сервис освобождает блок памяти, зарезервированный V86MMGR_Allocate_Memory и копирует данные в зарезервированном блоке в указанный блок ring0-памяти. Как и в случае с V86MMGR_Allocate_Memory, если вы хотите скопировать операцию, вы должны установить флаг переноса перед вызовом сервиса.

mov edx,esi assume edx:ptr DIOCParams mov edi,[edx].lpvOutBuffer mov esi,OFFSET32 MediaID.midVolLabel mov ecx,11 rep movsb mov byte ptr [edi],0 mov ecx,[edx].lpcbBytesReturned mov dword ptr [edx],11

Теперь информация находится в ring0-буфере, мы копируем метку тома в буфер, предоставленный win32-приложением. Мы можем получить доступ к этому буферу, используя поле lрvOutBuffer структуры DIOCParams.

[C] Iczelion, пер. Aquila.






Содержание  Назад