VisualC++情報セキュリティプログラミング(1)インラインアセンブリNT下読みMBRを実現


MBR,   Master Boot Record,         。 

理解を容易にするために、MBRは一般に一般化と狭義の2つに分けられる.一般化されたMBRは、セクタ全体(ブートプログラム、パーティションテーブル、および区切り識別)、すなわち、上述した主ブート記録を含む.狭義のMBRは、ブートプログラムのみを指す.  
ハードディスク(HDD)の0柱面、0磁気ヘッド、1セクタをメインガイドセクタ(メインガイド記録MBRとも呼ばれる)と呼ぶ.メインブート、ハードディスクパーティションテーブルDPT(Disk Partition table)、ハードディスク有効フラグ(55 AA)の3つの部分から構成されています.合計512バイトのマスタブートセクタにはマスタブートプログラムが446バイト、第2部はパーティションテーブル(パーティションテーブル)、すなわちDPTが64バイト、ハードディスク(HDD)におけるパーティションの数、および各パーティションのサイズが記載されている.第3部はmagic  numberは、2バイトを占め、55 AAに固定されている.
 
VC++の下でMBRの読み取りを実現します.
C++インラインアセンブリ
C++コードに__を挿入asm{}でよい
 
 
 
 
;**************************************************
.386p
.model flat, stdcall      ;      
option casemap :none   ;      
;***************************************************
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
      
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib

ShowError proto :DWORD
ShowBuffer proto 

.data                            ;   
	FileName db '\\.\PHYSICALDRIVE0',0  ;         
	align 4				;    
	readed	dd  0          ;        
	Buffer    db  512 dup (0)  ;           
	hFile	     dd  0          ;     
	
	Caption		db 'NT       ',0      ;Caption    
	ErrCreate	db   '    ,      Win9X   !',0   ;    
	ErrRead		db '    !',0                           ;    
	
	ShowText	db   4096*3 dup (0)               ;           
	Number	db '0123456789ABCDEF'           ;16      ACSII       

.code                                                ;   
main:
	;    
	invoke CreateFile,offset FileName,\
GENERIC_READ,FILE_SHARE_READ OR FILE_SHARE_WRITE,\
NULL,OPEN_EXISTING,NULL,NULL
	mov  [hFile],eax
	cmp  eax,INVALID_HANDLE_VALUE
	jnz  read
	invoke ShowError,offset ErrCreate            ;      
read:                                           	;   
	invoke ReadFile,eax,offset Buffer,512,offset readed,NULL
	cmp  eax,0
	jnz  show
	invoke ShowError,offset ErrRead		    ;      
show:                                           	
	invoke ShowBuffer                           ;       
	invoke CloseHandle ,[hFile] 	               ;      
	invoke ExitProcess,0                        	;  
ShowError  proc ,MESSAGE:DWORD		               ;         
	invoke MessageBoxA,NULL,MESSAGE,offset Caption,MB_OK
	cmp  [hFile],0
	jz   ShowErrorEnd
	invoke CloseHandle ,[hFile]	;    
ShowErrorEnd:
	invoke ExitProcess,0		;  
ShowError  endp

ShowBuffer  proc				            ;        
	                                        ; 16       ASCII    
	mov  esi,offset Buffer		;  
	mov  edi,offset ShowText 	;      
	mov  ebx,offset Number
	mov  ecx,0
	xor  eax,eax
Again:
	cmp  [readed],0
	jz   ConversionEnd
	dec  [readed]
	mov  al,[esi]
	push eax
	         shr  eax,4			         ; 4 
	mov  al,[ebx+eax]
	mov  byte ptr[edi],al
	         inc  edi
	pop  eax
	and  eax,0FH			    ; 4 
	         mov  al,[ebx+eax]
	mov  byte ptr[edi],al
inc  edi
	         mov  byte ptr[edi],' '		;  
	inc  edi
	         inc  esi
	         inc  ecx
	cmp  ecx,16
	jnz  Again
	xor  ecx,ecx
	mov  byte ptr[edi-1],13		;   
	jmp  Again
ConversionEnd:
;         
	invoke MessageBoxA,NULL,offset ShowText,offset Caption,MB_OK
	ret
ShowBuffer  endp
	end main