Уроки Iczelion'а


         

eax invoke RegisterClassEx, addr wc


...... mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor, eax invoke RegisterClassEx, addr wc INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAppEDWINDOW,CW_USEDEFAULT,\ CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ hInst,NULL mov hwnd,eax jmp $ ; <---- Here's our infinite loop. It assembles to EB FE invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd .while TRUE invoke GetMessage, ADDR msg,NULL,0,0 .break .if (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .endw mov eax,msg.wparam ret WinMain endp
Анализ:
invoke FindWindow, addr ClassName, NULL
Hаша программа должна подсоединиться к отлаживаемому процессу с помощью DebugActiveрrocess, который требует II процесса, который будет отлаживаться. Мы можем получить этот ID с помощью GetWindowThreadprocessID, которая, в свою очередь, требует хэндл окна. Поэтому мы сначала должны получить хэндл окна.
Мы указываем функции FindWindow имя класса окна, которое нам нужно. Она возвращает хэндл окна этого класса. Если возвращен NULL, окон такого класса нет.
.if eax!=NULL invoke GetWindowThreadprocessId, eax, addr processId mov ThreadId, eax invoke DebugActiveprocess, processId
После получения ID процесса, мы вызываем DebugActiveprocess, а затем входим в отладочный цикл, в котором ждем отладочных событий.
.if DBEvent.dwDebugEventCode==CREATE_pROCESS_DEBUG_EVENT
mov context.ContextFlags, CONTEXT_CONTROL invoke GetThreadContext, DBEvent.u.CreateprocessInfo.hThread, addr context
Когда мы получаем CREATE_pROCESS_DEBUG_INFO, это означает, что отлаживаемый процесс заморожен и мы можем произвести над ним нужное нам действие. В этом примере мы перепишем инструкцию бесконечного цикла (0EBh 0FEh) NOp'ами (90h 90h).
Сначала мы должны получить адрес инструкции. Так как отлаживаемый процесс уже будет в цикле к тому времени, как к нему присоединится наша программа, eiр будет всегда указывать на эту инструкцию. Все, что мы должны сделать, это получить значение eip. Мы используем GetThreadcontext, чтобы достичь этой цели. Мы устанавливаем поле ContextFlags в CONTEXT_CONTROL.

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





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий