OptionalEntropy는 데이터 암호화를 더 복잡하게 만든 값으로 CryptProtectData와 같은 값으로 하셔야 합니다.
Reserved는 지금은 쓰지 않지만 언제가 사용할 때를 대비한 인자로써 반드시 none이어야 합니다.
PromptStruct는 UI를 위한 옵션으로 PyCRPYTPROTECT_PROMPTSTRUCT 구조체를 사용합니다.
* PyCRPYTPROTECT_PROMPTSTRUCT 은 3개의 자료를 갖는 튜플형 변수입니다.
[0] int : flags
- CRYPTPROTECT_PROMPT_PROTECT = 0x1
- CRYPTPROTECT_PROMPT_UNPROTECT = 0x2
- 위 2개의 인자값의 컴비네이션을 플래그로 갖습니다. 근데 제가 아무리 써봐도 무슨 차이가 있는지 모르겠습니다;;
[1] int : hwndApp
- 부모 프로세스의 핸들로 0으로 두시면 됩니다.
[2] PyUnicode : prompt
- UI 프롬프트 창의 이름입니다. None으로 두셔도 상관없습니다.
Flags는 암호화 옵션입니다.
Flags
설명
CRYPTPROTECT_UI_FORBIDDEN = 0x1
PromptStruct를 통해 UI 창을 호출할 수 있었는데 이 Flag가 활성화되있으면, PromptStruct 설정 시 에러가 발생합니다.(UI 금지)
CRYPTPROTECT_VERIFY_PROTECTION = 0x40
복호화시 보호 레벨이 암호화시의 보호 레벨보다 낮으면 재암호화를 요구한다고 합니다. 아마 제 생각에는 윈도우 버전별로 암복호화 알고리즘이 다른데 그 때 사용하는 게 아닌가 합니다.
CryptProtectData 함수와 Flags 가 차이가 나는데, CRYPTPROTECT_LOCAL_MACHINE, CRYPTPROTECT_AUDIT 같은 경우 CryptProtectData 함수 사용 시 설정되어 있었으면 CryptUnprotectData 함수 시 자동으로 설정되기 때문입니다.
import win32evtlog
pHandle = win32evtlog.OpenEventLog(None, "Application")
# Application 로그를 오픈
flag = win32evtlog.EVENTLOG_SE | win32evtlog.EVENTLOG_BACKWARDS_READ
num = win32evtlog.GetNumberOfEventLogRecords(pHandle)
# Application 로그의 현재 갯수 출력
print(f"{num}")
for i in range(num): # 로그의 현재 갯수 만큼 호출
x = win32evtlog.ReadEventLog(pHandle, flag, 0)
# 로그 Read
for j in x:
print(f"{j.TimeGenerated}")
# 편의상 시간 정보만 출
win32evtlog.CloseEventLog(pHandle)
# 로그 핸들 반환
예제를 실행한 결과로 227개의 로그를 최신거 부터 순서대로 시간 정보만을 출력한 결과입니다.
import win32evtlog
evHandle = win32evtlog.RegisterEventSource(None, "Application")
# 로그 이벤트 소스 등록
# 레지스트리에 있어야함
win32evtlog.DeregisterEventSource(evHandle)
# 등록한 이벤트 소스 해제
위 코드의 실행 결과는 아무것도 띄우지 않지만 에러가 나오지 않았다면 제대로 등록이 되고 해제되었을 겁니다.
RegisterEventSource() 함수의 리턴값은 int 형식의 handle 값이며, 이는 추후 등록된 이벤트 소스를 해제할 때 사용합니다.
자신만의 이벤트 소스 명을 만들 수 있지만 이번에는 기존에 있는 걸로 해보겠습니다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\Application 의 이름으로 이벤트 소스를 등록해보겠습니다.
import win32evtlog
evHandle = win32evtlog.RegisterEventSource(None, "Application")
# 로그 이벤트 소스 등록
# 레지스트리에 있어야함
"""
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
Services
EventLog
Application
AppName(여기에 있어야 함)
"""
win32evtlog.DeregisterEventSource(evHandle)
# 등록한 이벤트 소스 해제
위 코드의 실행 결과는 아무것도 띄우지 않지만 에러가 나오지 않았다면 제대로 등록이 되고 해제되었을 겁니다.