1. 종류

2. 디컴파일

.... 2.1 AutoHotKey_B

.... 2.2 AutoHotKey_L





1. 종류

  오토핫키의 경우 여러 종류가 있다. 공식 홈페이지에서 다운로드 받을 수 있는 공식 버전들부터 살펴보면 버전 1.01.1이 나뉜 것을 볼 수 있다. 이 외에도 아직 알파 버전이지만 2.0도 존재하며 공식 버전은 아니지만 H 버전도 존재한다. 여기서는 B, L 버전만 다룰 것이며 H 버전 및 2.0 버전은 L 버전을 기반으로 하는 것으로 보아 디컴파일 방식은 동일할 것으로 추측하여 제외하기로 한다.


  버전 1.0은 AutoHotKey Basic 또는 AutoHotKey_B로 불린다. 그리고 버전 1.1은 AutoHotKey_L로 불린다. 굳이 같은 공식 버전인데도 이렇게 나뉘는데는 이유가 있다. 2003년 경 원래 개발자가 개발한 버전이 있었는데 조금씩 업데이트 되다 2009년을 마지막으로 안정화되어 이제 추가적인 기능 추가는 없는 상태이다. 이것이 현재 AutoHotKey_B로 불리는 버전이다. AutoHotKey_L 즉 버전 1.1은 다른 개발자가 AutoHotKey_B를 기반으로 기능을 추가해 가고 있는 버전으로서 이후 공식 버전이 되었고 현재도 지속적으로 업데이트 중이다. L 버전은 B 버전을 포함한다.


  공식 버전들 외에도 AutoHotKey_H 버전도 존재한다. [ https://hotkeyit.github.io/v2/ ] 이것은 또 다른 개발자가 AutoHotKey_L 버전을 기반으로 멀티 쓰레딩 등의 기능을 추가한 버전으로서 L 버전의 업데이트에 맞추어 업데이트된다. 또한 L 버전을 포함한다. 


  참고로 H 버전은 이러한 특징 외에도 다른 특징이 있다. C나 파이썬 같은 다른 언어를 이용해 개발하면서 H 버전에서 제공되는 AutoHotKey.dll을 임포트하여 함수를 사용할 수 있는데 이를 통해 타 언어 개발 환경에서도 오토핫키를 사용할 수 있다.





2. 디컴파일

2.1 AutoHotKey_B

  오토핫키는 오토잇(AutoIt)과 비슷하게 Ahk2Exe.exe를 이용해 ahk 소스 코드를 exe 바이너리로 변환할 수 있다. 그리고 변환 시 비밀번호를 입력하여 디컴파일을 방해할 수 있다. 그리고 PE 적인 특징을 보자면 자동으로 upx를 이용해 압축해 준다.


  변환된 바이너리는 exe2aut라는 도구를 이용해 디컴파일을 할 수 있다. 만약 비밀번호가 걸려 있다면 인자로 넣어야 한다. 하지만 구조 상 cmp 문으로 비밀번호를 비교하는 부분을 디버깅을 통해 어셈블리에서 찾을 수 있기 때문에 exe2aut를 수정하여 비밀번호를 추출하는 도구도 존재한다.


[ https://github.com/Kalamity/Exe2AhkPatched ]


  결론적으로 B 버전은 위의 Exe2AhkReturnPassword.exe 또는 Exe2AhkAnyPassword.exe를 통해 디컴파일을 쉽게 진행할 수 있다. 바이너리가 비밀번호에 걸려있지 않은 경우 인자로 바이너리를 넣으면 두 프로그램 모두 ahk 파일을 반환한다. 비밀번호에 걸려있는 경우에는 exe2aut 처럼 두 번째 인자로 비밀번호를 넣으면 된다. 여기까지는 exe2aut와 사용법이 같다.


  Exe2AhkReturnPassword.exe는 바이너리에 비밀번호가 걸려있는 경우 비밀번호를 반환해 준다. 이 비밀번호를 가지고 두 번째 인자로 넣어서 스크립트를 추출할 수 있다. Exe2AhkAnyPassword.exe는 더 간단한데 비밀번호에 걸려있다고 하더라도 비밀번호를 반환하는 것이 아니라 바로 스크립트 추출까지 진행해 준다. 그렇기 때문에 비밀번호의 유무에 상관없이 스크립트를 추출하고 싶다면 Exe2AhkAnyPassword.exe를, 비밀번호를 확인하고 싶다면 Exe2AhkReturnPassword.exe를 사용하면 된다.


  참고로 바이너리는 upx로 패킹된 상태 그대로여야 인식되며 그렇지 않으면 notarc라는 에러가 발생한다.



2.2 AutoHotKey_L

  현재 가장 많이 사용되는 버전으로 보인다. 이 버전은 과거 버전과 달리 PE 파일에, 정확히 말하자면 리소스 섹션의 RCDATA에 스크립트가 그대로 존재하기 때문에 쉽게 추출할 수 있다. 이것은 ANSI 및 Unicode 버전 모두 호환된다. 다음 링크의 파이썬 코드를 이용하자.


[ http://anch0vy.tistory.com/21 ]


  Ahk2exe 사용 시 추가 옵션으로 mpress 패커를 이용한 패킹이 지원된다. mpress.exe를 같은 폴더에 넣고 이 옵션을 체크하면 바이너리 생성 및 생성된 바이너리를 패킹까지 해준다.


  Mpress로 패킹된 경우 리소스 섹션의 RCDATA도 같이 패킹되기 때문에 스크립트를 추출할 수 없으며 mpress를 언패킹해야 가능하다. 먼저 mpress 용 언패커를 찾아보니 찾을 수 없었고 버전도 다양하기 때문에 자동화는 포기했다. 대신 간단하게 바이너리를 실행시킨 후 Attach하면 이미 언패킹이 끝나 있기 때문에 Dump하고 여기서 추출하면 된다.


  또는 간단한 패커이기 때문에 H/W Breakpoint를 이용하여 언패킹 후 덤프를 뜨면 된다. (PUSHAD 이후 스택의 주소들 중 하나에 H/W BP를 걸고 F9를 누르면 JMP문에서 BP가 걸리는 것을 확인할 수 있다. JMP문 바로 위가 POPAD이기 때문. 이후 JMP문 다음부터가 진짜 OEP이다. 여기서는 단지 소스 코드가 위치한 부분만 언패킹되면 되기 때문에 간단하게 덤프 후 스크립트를 추출하면 된다)


  참고로 Dump 한 바이너리의 rcdata를 살펴봐도 보이지 않는다. 그 이유는 일반적으로 패킹 시 리소스 섹션은 제외되며 (rcdata 말고) 언패킹 이후에는 rcdata가 리소스 섹션의 rcdata 부분이 아닌 데이터가 영역 부분에 언패킹되기 때문이다. 하지만 링크의 파이썬 스크립트는 시그니처를 기반으로 하기 때문에 위치와 상관없이 간단하게 스크립트를 추출해 준다.



Posted by SanseoLab

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함