VB.NET으로 엑셀 VBA 암호 파괴 및 소스 추출 자동화
엑셀 파일(xls, xlsm, xlsb, xlam 등)에 포함된 VBA 프로젝트의 암호를 제거하거나, 소스를 자동으로 추출하는 방법을 소개합니다. VB.NET과 Python 스크립트를 활용한 강력한 자동화 솔루션입니다.
VBA 암호는 VBA 코드 보호를 위해 설정되지만, 암호 분실 등으로 프로젝트 접근이 불가능한 경우도 있습니다. 이때 VB.NET을 이용하여 암호 정보를 바이너리 수준에서 제거하여 복구가 불가능하도록 파괴하거나, 다시 복원할 수도 있습니다.
Public Sub RemoveVBAProjectPassword_OfficeOpenXml(filePath As String)
' 압축된 VBA 프로젝트(bin)에서 암호 정보 삭제
End Sub
Public Sub RestoreDPBInBin(binFile As String, Optional dpbLine As String = Nothing)
' DPB 값 복원
End Sub
Public Sub ExtractVBASources(binFilePath As String, outputFolder As String)
' 압축된 VBA 스트림을 자동 해제하여 소스코드를 .bas 파일로 저장
End Sub
VB.NET만으로는 완벽한 소스 추출이 어려울 때, Python의 oletools(olevba) 라이브러리를 연동하면 간단히 해결됩니다.
# extract_vba.py
import sys
import os
from oletools.olevba import VBA_Parser
input_file = sys.argv[1]
output_dir = sys.argv[2]
vbaparser = VBA_Parser(input_file)
for (filename, stream_path, vba_filename, vba_code) in vbaparser.extract_macros():
with open(os.path.join(output_dir, vba_filename), 'w', encoding='utf-8') as f:
f.write(vba_code)
vbaparser.close()
Private Sub ExtractVbaWithPython(inputFile As String, outputDir As String)
Dim psi As New ProcessStartInfo()
psi.FileName = "python"
psi.Arguments = $"extract_vba.py ""{inputFile}"" ""{outputDir}"""
psi.UseShellExecute = False
psi.RedirectStandardOutput = True
psi.CreateNoWindow = True
Dim process As Process = Process.Start(psi)
process.WaitForExit()
MessageBox.Show("VBA 소스 추출 완료!")
End Sub
pip install oletools)위 방법을 통해 VBA 프로젝트 관리 및 복구 작업을 크게 간소화할 수 있습니다. 특히 다수의 VBA 프로젝트를 관리하는 환경에서는 효율성 향상 및 작업 자동화에 큰 도움이 됩니다.