Не забывайте обнулять вещи, на которые вам наплевать:
Выравнивание полей в структуре может быть причиной раскрытия служебной информации и памяти на машине. Возьмём структуру:
Type FileHeader
Magic1 As UByte
Data1 As Long
Magic2 As UByte
Data2 As Long
End Type
Dim fh As FileHeader Ptr = Allocate(SizeOf(FileHeader))
' заполняем память контрольным значением
memset(fh, Asc("M"), SizeOf(FileHeader))
' Заполняем структуру
fh->Magic1 = Asc("H")
fh->Data1 = Asc("A")
fh->Magic2 = Asc("h")
fh->Data2 = Asc("a")В целях оптимизации, компилятор выровнял поля в структуре по границе 4 байт. Посмотрим, что лежит в нашей памяти:
Magic1 Data1 Magic1 Data1
H M M M A \0 \0 \0 h M M M a \0 \0 \0
↑ ↑
Как видно, некоторые байты в памяти остались нетронутыми, хотя мы заполнили все поля. Это значит, что если записать такую структуру в файл или передать по сети, то эти байты может увидеть злоумышленник.
#include once "windows.bi"
Type FileHeader
dwMagic As Long
dwVersion As Long
szComment As ZString * (255 + 1)
cbData As Long
End Type
Function SafeToFile( _
ByVal hFile As HANDLE, _
ByVal pszComment As ZString Ptr, _
ByVal cbData As Long, _
ByVal bData As UByte _
)As Integer
Dim fh As FileHeader Ptr = Allocate(SizeOf(FileHeader))
fh->dwMagic = 16
fh->dwVersion = 1
lstrcpyA(@fh->szComment, pszComment)
fh->cbData = cbData
Dim cbWritten As DWORD = Any
WriteFile(hFile, fh, SizeOf(FileHeader), @cbWritten, NULL)
WriteFile(hFile, @bData, SizeOf(UByte), @cbWritten, NULL)
Return 0
End Function
Dim hFile As HANDLE = CreateFileA( _
"file.bin", _
GENERIC_WRITE, _
0, _
NULL, _
CREATE_ALWAYS, _
FILE_ATTRIBUTE_NORMAL, _
NULL _
)
Const Comment = Str("this is a comment")
If hFile <> INVALID_HANDLE_VALUE Then
SafeToFile( _
hFile, _
@Comment, _
256, _
1 _
)
CloseHandle(hFile)
End If