閱讀336 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[原創]和DriverStudio過不去之加強版:)

和DriverStudio"過不去"之加強版 

(<<搶先DriverStudio奪取機器控製權>>係列2)

 

        a. 使用 MmMapIoSpace

        內核已經進入保護模式,並且開了分頁。要想讀寫物理地址必須做

        這樣的映射(我的

Windows 核心編程研究係列之二:讀取指定物理內存地址中的內容

        一篇中有更為詳細的說明)。

      該函數原形如下:

      PVOID 
    MmMapIoSpace(
    IN PHYSICAL_ADDRESS  PhysicalAddress,
    IN ULONG  NumberOfBytes,
    IN MEMORY_CACHING_TYPE  CacheType

Screen_W equ 50h
Screen_H equ 19h ;1ch
Show_Pos_Line0 equ (Screen_W * (Screen_H - 2) + 5) * 2
Show_Pos_Line1 equ (Screen_W * (Screen_H - 1) + 5) * 2

           ;*************************************************************************
_DisplayString proc _lpstr,_pos
 local pa:qword
 local lpvmem:dword

 ;mov dword ptr [pa+1],Video_Addr
 ;mov dword ptr [pa+5],0

 mov dword ptr [pa],Video_Addr
 mov dword ptr [pa+4],0

 push 0 ;MmNonCached
 push 8000h ;NumberOfBytes
 ;push dword ptr [pa+5]
 ;push dword ptr [pa+1]
 push dword ptr [pa+4]
 push dword ptr [pa]
 call MmMapIoSpace

 mov lpvmem,eax
 mov esi,_lpstr
 mov edi,lpvmem
 add edi,_pos
 mov bh,84h  ;char show_attribute

 .while TRUE
  .if byte ptr [esi] != 0
   mov bl,byte ptr [esi]
   mov word ptr [edi],bx
   inc esi
   inc edi
   inc edi
  .else
   .break
  .endif
 .endw

_DisplayString endp

 

             KeDelayExecutionThread,其原形如下:

NTSTATUS 
  KeDelayExecutionThread(
    IN KPROCESSOR_MODE  WaitMode,
    IN BOOLEAN  Alertable,
    IN PLARGE_INTEGER  Interval
    );

            其中 WaitMode選擇KernelMode,將可報警置為FALSE.值得注意的

        是第3個參數Interval,這個參數說明如下:

Interval

Specifies the absolute or relative time, in units of 100 nanoseconds, for which the wait is to occur. A negative value indicates relative time. Absolute expiration times track any changes in system time; relative expiration times are not affected by system time changes.

 

  我們最好是用相對時間的延時方式,這就需要寫成負數的形式將前導位

 

  全部置1。為了達到捕獲鍵盤輸入,需要直接訪問IO端口64h和60h,

  這在ring0種都不成問題 。我同樣寫了一個子函數方便使用,代碼如下:

 

;*************************************************************************
_WaitForInput proc
 local al_tmp:byte
 local interval:LARGE_INTEGER
 local turnsNow:dword

 mov dword ptr [interval],0ffffe000h
 mov dword ptr [interval+4],0ffffffffh

 mov turnsNow,0

 .while TRUE
  .if turnsNow == Turns
   .break
  .else
   inc turnsNow
   
   in al,64h
   test al,1
   jz Delay

   in al,60h
   mov al_tmp,al
   movzx eax,al_tmp
   cmp eax,1
   jz ExitWhile

   cmp eax,1eh
   jz ExitWhile

   cmp eax,0b0h
   jz ExitWhile

   cmp eax,1ch
   jnz Delay
   
  ExitWhile:
   .break
 
  Delay:
   invoke KeDelayExecutionThread,0,0,addr interval
  .endif
 .endw

 xor eax,eax
 mov al,al_tmp
 ret

_WaitForInput endp

;*************************************************************************

        d. 剩下來做的事就是在Main中判斷用戶輸入的鍵碼:

 invoke _DisplayString,addr szhopysay,Show_Pos_Line0
 invoke _DisplayString,addr szchoose,Show_Pos_Line1
 invoke _WaitForInput


  .if al == 01h
  ;do nothing
 .elseif al == 0b0h
  invoke _TryBS
 .else
  ;do nothing
 .endif

        運行的效果如圖3所示:

圖3

最後更新:2017-04-02 00:06:21

  上一篇:go [原創]匯編初學者問題合集
  下一篇:go 《互聯網領域Java從來就不是主流》一個完全錯誤的標題!炒作短時間帶來了流量,卻損害了作者的聲譽,推薦人的信譽,以及讀者對於網站的期待。