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