KO : 이 프로그램은 몇 밀리세컨드 후에 종료 되는가
EN : How many milliseconds does it take for this program to terminate
프로그램을 실행시켜보면 몇 초 후에 멈추게 됩니다.
그 초를 정확히 재는 것도 한 방법이 될 거 같네요. (가능한가;;)
이 프로그램은 다른 툴로 열어 보면 위 그림처럼 오토잇이라는 것이 나타나게 됩니다.
오토잇은 스크립트 언어인데요. 저걸로 여러가지를 만들 수 있더군요. (윈도우 자동 설치 등)
선택 옵션 중에 UPX를 선택하면 자동으로 압축해주는 기능도 갖고 있습니다.
이번 문제가 그런 유형입니다.
그리고 이 프로그램은 디버깅을 하다보면 프로그램이 바로 종료되게 되는데요.
그 이유는 안티디버깅이 걸려 있기 때문에 그렇습니다. (간단한 거라서 여기서는 패스요)
한줄씩 디버깅 하다 보면 위 함수가 실행됐을 때 프로그램이 실행 되는 것을 알 수 있습니다.
이 프로그램은 오토잇으로 감싸져 있고 그 안에 우리가 원하는 프로그램이 있기 때문에
저 안으로 들어가서 더 분석을 해야 합니다.
한단계 한단계씩 가다 보면 또 위와 같은 함수가 나오고 그 안에 들어가면 안티디버깅이 들어있는 것을 볼 수 있습니다.
간단한 안티디버깅이기 때문에 쉽게 우회하실 수 있을 겁니다.
안티디버깅 우회 하시고 쭉 진행하시다 보면 위 함수가 나옵니다.
위에 주석을 보면 윈도우 리소스 등록, 트레이 아이콘 생성등 프로그램을 실행하기 위해서 하나하나 과정을 밟고 있는 것을 볼 수 있네요.
그리고 여길 분석해야 함 이라는 소스가 실제 우리가 분석해야 하는 프로그램이 됩니다.
위 함수에 들어가 보면
위와 같은 소스가 보이는 데요. 눈에 익죠? 이제 프로그램은 우리의 입력을 받기 위해 대기를 합니다.
그리고 몇 개의 초기화 과정을 더 거치는 데요. 마지막 쯤에 가보시면
위 함수가 있습니다.
다들 알다시피 WaitForSingleObject 함수는 어떤 스레드의 종료를 가리키는 함수 잖아요?
그래서 저는 다른 스레드를 만들고 그 스레드의 종료를 기다리고 있구나 라고 생각을 했습니다.
잘 찾아 보면 실제로 CreateThread를 호출 하는 것을 볼 수 있습니다.
자 위를 보죠. 우리가 봐야 할 것은 3번째 인자인 ThreadFunction인자 인데요.
그 인자에는 함수 주소가 들어가게 됩니다.
그래서 저 함수를 분석을 했습니다. 결과는… 뭐가 없더군요;; (사실 제대로 분석 못했습니다.)
저것은 고의로 만들어 두신건지…… 굉장히 어려운 함수가 안에서 실행됩니다.
나중에 저 문제를 푸시는 분은 저기서 헤메지 마세요. 답은 훨씬 가까운 곳에 있습니다.
이 문제는 이정도 까지만 해도 될거 같네요.
처음 보는 유형이라 굉장히 헤맸습니다. (오토잇 해제 하려고 하루죙일… 저 스레드 분석하는데.. 몇일 ㅠㅠ)
저를 굉장히 헷갈리게 하는 소스가 많더라구요.. 에휴ㅋㅋ;;
다들 열심히 푸세요!!
Bloger: moltak.net