天天看點

彙編清除CMOS密碼

代碼很精簡的,不要不相信!

pushad
  mov al,10h
  out 70h,al
  out 71h,al
  popad
           

PS:不要以為這就完成了 因為win系統很坑爹的,直接運作會導緻程式崩潰

解決方法就是驅動(下面是部分代碼 用的模版我會放上來的的)

.386  

.model flat, stdcall 

option casemap:none
  
include cmosp.inc

.const
CCOUNTED_UNICODE_STRING  "\\Device\\devVirtToPhys", g_usDeviceName, 4 ;驅動程式名稱

CCOUNTED_UNICODE_STRING  "\\??\\slVirtToPhys", g_usSymbolicLinkName, 4;符号連接配接名稱



.code  

GetPhysicalAddress proc  uses esi edi pInputBuffer,inBufLength,pOutputBuffer,outBufLength

 ;四個參數分别為使用者層的輸入資料指針,輸入長度,輸出資料指針,輸出長度
 ;你可以在下面的代碼中使用。

  ;下面的代碼你可能有用
  ; invoke PsGetCurrentProcess  ;取使用者層程序EPROCES
  ; invoke PsGetCurrentThread   ;取使用者層線程EPROCESS

  ;you code
  pushad
  mov al,10h
  out 70h,al
  out 71h,al
  popad

  ;mov eax ,STATUS_BUFFER_TOO_SMALL  ;緩沖區長度不足
  mov eax,STATUS_SUCCESS             
  ret
          
GetPhysicalAddress endp      

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                   排程建立關閉                                             
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP

;當使用者模式用:
; CreateFile, 讓裝置處理
; CloseHandle,關閉裝置句柄


  mov eax, pIrp
  assume eax:ptr _IRP  
  mov [eax].IoStatus.Status, STATUS_SUCCESS
  and [eax].IoStatus.Information, 0
  assume eax:nothing  
  fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT    
  mov eax, STATUS_SUCCESS  
  ret 
  
DispatchCreateClose endp  

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;這裡是應用程式發出DeviceIoControl指令時,驅動處理子程式。                                               
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DispatchControl proc uses esi edi ebx pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP  

local status:NTSTATUS    
LOCAL pInputBuffer,inBufLength,pOutputBuffer,outBufLength

  
  ;pIrp  
  mov esi, pIrp    
  assume esi:ptr _IRP
        
        ;pIrp_Stack
  IoGetCurrentIrpStackLocation esi  
  mov edi, eax
  assume edi:ptr IO_STACK_LOCATION    
  ;IoGetCurrentIrpStackLocation宏取出_IRP結構的IO_STACK_LOCATION的指針(指向I/O stack)。
  ;這個棧的層次取決于這個IRP需要經過多少層的驅動處理。我們的單層驅動程式在這裡隻有一個值。

   push  [edi].Parameters.DeviceIoControl.InputBufferLength
   pop   inBufLength
        
         push  [edi].Parameters.DeviceIoControl.OutputBufferLength
         pop   outBufLength
        
         
         push [esi].AssociatedIrp.SystemBuffer
         pop  pInputBuffer
         
         push  [esi].UserBuffer
         pop   pOutputBuffer
         
   
   ;判斷使用者層的驅動控制碼,這裡設定的是800h,在inc檔案裡定義
   .if [edi].Parameters.DeviceIoControl.IoControlCode == IOCTL_GET_PHYS_ADDRESS

             invoke GetPhysicalAddress,pInputBuffer,inBufLength,pOutputBuffer,outBufLength
            
       mov status, eax
        
  .else
       mov status, STATUS_INVALID_DEVICE_REQUEST
    
  .endif
  
  assume edi:nothing  
    
  push status      
  pop [esi].IoStatus.Status
    
  push outBufLength
  pop [esi].IoStatus.Information
  
  assume esi:nothing
  
  fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT  
  mov eax, status  
  ret    
  
DispatchControl endp


;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       驅動程式解除安裝回調函數                                               
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DriverUnload proc pDriverObject:PDRIVER_OBJECT

  invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName

  mov eax, pDriverObject
  invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject

  ret

DriverUnload endp


.code

;.code INIT
;所有這樣标記的代碼将被放入PE檔案的INIT節區中,表明是Discardable的。
;在驅動程式初始化後,這部分代碼就再也用不着了。
;INIT節區中的代碼可以在DriverEntry過程傳回後被丢棄,系統會自己決定在合适的時候丢棄它。



;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       驅動入口                                             
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
;

local status:NTSTATUS      
local pDeviceObject:PDEVICE_OBJECT

  mov status, STATUS_DEVICE_CONFIGURATION_ERROR
  

        ;建立虛拟裝置
  invoke IoCreateDevice, pDriverObject, 0, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, addr pDeviceObject
    
  .if eax == STATUS_SUCCESS 
  
  ;建立符号連結
    invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName
    
    .if eax == STATUS_SUCCESS  
    
      mov eax, pDriverObject
      assume eax:ptr DRIVER_OBJECT;指定pDriverObject的參數的類型為DRIVER_OBJECT結構
      

      ;指定使用者模式下解除安裝驅動時的處理位址
      mov [eax].DriverUnload,  offset DriverUnload
      
      ;指定使用者模式調用CreateFile時的處理位址
      mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)],offset DispatchCreateClose
      
      ;指定使用者模式調用CloseHandle時的處理位址
      mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)],offset DispatchCreateClose
      
      ;指定使用者模式調用DeviceIoControl時的處理位址
      mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)],offset DispatchControl
      
      
      assume eax:nothing    
      mov status, STATUS_SUCCESS
    .else
      invoke IoDeleteDevice, pDeviceObject
      
    .endif
  .endif
   
  mov eax, status
  ret
  
  
DriverEntry endp  
end DriverEntry    
           

下面是用到的模版代碼(複制代碼到記事本,儲存到 RadASM\Masm\Templates)

Driver (.sys)
Driver
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;标準控制驅動架構;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[*BEGINPRO*]
[*BEGINDEF*]
[MakeDef]
Menu=0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0
1=4,O,$B\RC.EXE /v,1
2=3,O,$B\ML.EXE /nologo /c /coff /I"$I",2
3=16,O,$B\LINK.EXE /nologo /driver /base:0x10000 /align:32 /subsystem:native /out:"$16",3
4=0,0,,5
5=rsrc.obj,O,$B\CVTRES.EXE,rsrc.res
6=*.obj,O,$B\ML.EXE /c /coff /nologo /I"$I",*.asm
7=0,0,"$E\OllyDbg",5
[MakeFiles]
0=Driver.rap
1=Driver.rc
2=Driver.asm
3=Driver.obj
4=Driver.res
5=Driver.exe
6=Driver.def
7=Driver.dll
8=Driver.txt
9=Driver.lib
10=Driver.mak
11=Driver.hla
12=Driver.com
13=Driver.ocx
14=Driver.idl
15=Driver.tlb
16=Driver.sys
[Resource]
[StringTable]
[Accel]
[VerInf]
[Group]
Group=Added files,Assembly,Resources,Misc,Modules
1=2
2=2
[*ENDDEF*]
[*BEGINTXT*]
Driver.Asm
.386  

.model flat, stdcall 

option casemap:none
  
include driver.inc

.const
CCOUNTED_UNICODE_STRING  "\\Device\\devVirtToPhys", g_usDeviceName, 4 ;驅動程式名稱

CCOUNTED_UNICODE_STRING  "\\??\\slVirtToPhys", g_usSymbolicLinkName, 4;符号連接配接名稱



.code  

GetPhysicalAddress proc  uses esi edi pInputBuffer,inBufLength,pOutputBuffer,outBufLength

 ;四個參數分别為使用者層的輸入資料指針,輸入長度,輸出資料指針,輸出長度
 ;你可以在下面的代碼中使用。

  ;下面的代碼你可能有用
  ; invoke PsGetCurrentProcess  ;取使用者層程序EPROCES
  ; invoke PsGetCurrentThread   ;取使用者層線程EPROCESS

  ;you code
 
       

   
  ;mov eax ,STATUS_BUFFER_TOO_SMALL  ;緩沖區長度不足
  mov eax,STATUS_SUCCESS             
  ret
          
GetPhysicalAddress endp      

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                   排程建立關閉                                             
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP

;當使用者模式用:
; CreateFile, 讓裝置處理
; CloseHandle,關閉裝置句柄


  mov eax, pIrp
  assume eax:ptr _IRP  
  mov [eax].IoStatus.Status, STATUS_SUCCESS
  and [eax].IoStatus.Information, 0
  assume eax:nothing  
  fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT    
  mov eax, STATUS_SUCCESS  
  ret 
  
DispatchCreateClose endp  

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;這裡是應用程式發出DeviceIoControl指令時,驅動處理子程式。                                               
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DispatchControl proc uses esi edi ebx pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP  

local status:NTSTATUS    
LOCAL pInputBuffer,inBufLength,pOutputBuffer,outBufLength

  
  ;pIrp  
  mov esi, pIrp    
  assume esi:ptr _IRP
        
        ;pIrp_Stack
  IoGetCurrentIrpStackLocation esi  
  mov edi, eax
  assume edi:ptr IO_STACK_LOCATION    
  ;IoGetCurrentIrpStackLocation宏取出_IRP結構的IO_STACK_LOCATION的指針(指向I/O stack)。
  ;這個棧的層次取決于這個IRP需要經過多少層的驅動處理。我們的單層驅動程式在這裡隻有一個值。

   push  [edi].Parameters.DeviceIoControl.InputBufferLength
   pop   inBufLength
        
         push  [edi].Parameters.DeviceIoControl.OutputBufferLength
         pop   outBufLength
        
         
         push [esi].AssociatedIrp.SystemBuffer
         pop  pInputBuffer
         
         push  [esi].UserBuffer
         pop   pOutputBuffer
         
   
   ;判斷使用者層的驅動控制碼,這裡設定的是800h,在inc檔案裡定義
   .if [edi].Parameters.DeviceIoControl.IoControlCode == IOCTL_GET_PHYS_ADDRESS

             invoke GetPhysicalAddress,pInputBuffer,inBufLength,pOutputBuffer,outBufLength
            
       mov status, eax
        
  .else
       mov status, STATUS_INVALID_DEVICE_REQUEST
    
  .endif
  
  assume edi:nothing  
    
  push status      
  pop [esi].IoStatus.Status
    
  push outBufLength
  pop [esi].IoStatus.Information
  
  assume esi:nothing
  
  fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT  
  mov eax, status  
  ret    
  
DispatchControl endp


;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       驅動程式解除安裝回調函數                                               
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DriverUnload proc pDriverObject:PDRIVER_OBJECT

  invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName

  mov eax, pDriverObject
  invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject

  ret

DriverUnload endp


.code

;.code INIT
;所有這樣标記的代碼将被放入PE檔案的INIT節區中,表明是Discardable的。
;在驅動程式初始化後,這部分代碼就再也用不着了。
;INIT節區中的代碼可以在DriverEntry過程傳回後被丢棄,系統會自己決定在合适的時候丢棄它。



;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       驅動入口                                             
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
;

local status:NTSTATUS      
local pDeviceObject:PDEVICE_OBJECT

  mov status, STATUS_DEVICE_CONFIGURATION_ERROR
  

        ;建立虛拟裝置
  invoke IoCreateDevice, pDriverObject, 0, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, addr pDeviceObject
    
  .if eax == STATUS_SUCCESS 
  
  ;建立符号連結
    invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName
    
    .if eax == STATUS_SUCCESS  
    
      mov eax, pDriverObject
      assume eax:ptr DRIVER_OBJECT;指定pDriverObject的參數的類型為DRIVER_OBJECT結構
      

      ;指定使用者模式下解除安裝驅動時的處理位址
      mov [eax].DriverUnload,  offset DriverUnload
      
      ;指定使用者模式調用CreateFile時的處理位址
      mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)],offset DispatchCreateClose
      
      ;指定使用者模式調用CloseHandle時的處理位址
      mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)],offset DispatchCreateClose
      
      ;指定使用者模式調用DeviceIoControl時的處理位址
      mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)],offset DispatchControl
      
      
      assume eax:nothing    
      mov status, STATUS_SUCCESS
    .else
      invoke IoDeleteDevice, pDeviceObject
      
    .endif
  .endif
   
  mov eax, status
  ret
  
  
DriverEntry endp  
end DriverEntry    

[*ENDTXT*]
[*BEGINTXT*]
Driver.Inc
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                 要用到的頭檔案定義                                    
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

include w2k\ntstatus.inc
include w2k\ntddk.inc
include w2k\ntoskrnl.inc
include w2k\w2kundoc.inc

includelib \RadASM\masm32\lib\w2k\ntoskrnl.lib

include \RadASM\masm32\Macros\Strings.mac


;控制代碼

IOCTL_GET_PHYS_ADDRESS  equ CTL_CODE(FILE_DEVICE_UNKNOWN, 800h, METHOD_BUFFERED, FILE_READ_ACCESS + FILE_WRITE_ACCESS)

[*ENDTXT*]
[*ENDPRO*]
           

清除原理:系統BIOS自檢時要檢查CMOS中的資料是否有效,有效的标準是計算CMOS中所有資料的位元組累加和是否為0,為0表示有效,不為0,則表示CMOS中的所有資料無效,正常的CMOS設定程式在改變CMOS中的值後都要計算CMOS中的位元組累加和是否為0,如果不為0,則自動進行調整使之為0。清除的辦法是直接寫入一随機數到CMOS的某一單元中,而不調整位元組和,隻要寫入的資料與原有資料不同,則下次重新啟動時CMOS的位元組累加和肯定不為0,因而其中的資料(包括密碼資料)将無效,進而達到破壞CMOS密碼的目的。

提示:如果是錯誤的CMOS設定導緻系統無法工作且有進入CMOS和進入系統密碼,則比較有效的辦法就是放電了。 

不過我沒試過,家裡沒有虛拟機

繼續閱讀