아, 밑을 보니 저렇게 써있군. 딴거 해석하지 말고 use Shift+F7/F8/F9 만 보자.
일반적으로 F7, F8, F9의 차이는 Step into, Step Over, Run의 차이이다.
너님들을 위해 해석하자면, 콜문 안으로 들어가느냐, 안들어가느냐, 그냥 실행하느냐이다.
F9를 눌렀는데 안되는걸 쉬프트 합쳐서 누르라는걸 보니 쉬프트가 존나 쌘분같다.
같이 눌러보자.
눌렀는데도 또나온다. 또나온다. 또나온다. 또나온다... 그러다가,,,
어느 순간부터인가, 두번째 줄에 보이는 코드가 다르다. 눈치빠른것들은 느꼈을 것이다.
그렇다. 여기서 한번만 더 누르면 프로그램이 실행된다. 하지만 우리가 찾아야 할 것은
프로그램이 실행되기 바로 직전 !! 바로 오리지날 엔트리 포인트이다.
헌데 저곳의 주소를 보면 003E2CD1이다. 우리가 아는 00401000이녀석이랑은 좀 많이
다르다.
부연설명을 하자면, ASProtect 1.23 RC1 이녀석이 만들어놓은 가상공간에, 프로그램이 실행될 경우 가상공간에서 프로그램의 실제 공간에 코드를 재배열한다. 우리가 찾을 곳은 재배열하고 난뒤에 프로그램을 시작하는 부분이다.
모르겠으면 닥치고 따라해라.
Alt + M이나 위의 M버튼을 클릭하면 다음 창이 뜬다.
이중에서 우리가 봐야 할 곳은 실제 코드가 배열되는 곳이 00401000부터이므로 저부분이다.
사이즈는 파일마다 다를 수 있다.
마우스 오른쪽을 클릭하여 Set memory breakpoint on access를 클릭한다.
왜냐고? 지금 가상공간에서 실제공간으로 들어가는 부분을 모르니까 이 기능을 이용하는 것이다. 굳이 해석하자면 저기에 연결될때 브레이크포인트를 건다는 것이다.
그런다음에 Shift + F9를 한번 누르면 다음과 같이 익숙한 광경이 펼쳐진다.
이래도 모르겠다면 Ctrl + A를 눌러서 Analysing해보면 된다.
이제 OEP를 찾았다. 이게 끝이다.
이제 덤프뜨자.
덤프는 올리디버거 플러그인을 이용해도 좋고 LodePE라는 프로그램을 이용해도 좋다.
참고로 LodePE를 이용할때 OEP찾았다고 디버거 끄지마라. 다시해야된다.
본인은 LodePE를 이용했다. 해당 프로세스를 찾고 마우스 오른쪽을 클릭하면 dump full이라고 있다. 이걸 클릭하면 dump.exe라는 파일명으로 저장된다.
이제 덤프도 끝났다. IAT를 복구할 차례이다. (LoadPE는 꺼도 좋다.)
이것은 IAT를 복구해주는 ImportREC라는 프로그램이다.
여기서 잠깐.
대부분 언팩 강좌에서 저기다가 OEP넣고 오토서치, 겟임포트, 오토트레이스, 픽스덤프하면 끝이에여 이러는데, 난좀 색다르게 하련다.
오토트레이스가 안되는 경우도 있기 때문이다.
우선 맨위에 프로세스를 선택한다.
그럼 Log창에 뭐가 막 뜬다.
이제 우측의 IAT Infos Needed 창이 활성화된다. 여기다가 우리가 찾은 OEP의 Address를 넣자. 우리가 찾은 OEP는 00401000-00400000=00001000이다. (Address만 넣어도 된다.)
이런 메세지가 뜰 것이다. 이제 Get Imports를 클릭하자.
(저런 메세지가 안뜰수도 있다. 그럼 OEP를 잘못 넣은 것일 가능성이 크다.)
맨 끝에 valid가 NO라고 뜬다. 정상적으로 작동하려면 YES가 떠야 한다. 물론 여기서 Auto Trace를 하면 YES가 뜬다. 하지만 안뜨는 것도 있으니 이제 그것을 찾는 방법을 쓰려 한다.
전부 펼친 다음에 하나씩 마우스 오른쪽을 클릭한 뒤에 Disassemble / HexView를 클릭하자.
감이 오냐?
그렇다. 저곳은 kernel32.dll의 GetDriveTypeA라는 함수가 적용되어야 한다.
이제 OK를 클릭하고 다시 더블클릭하면 임포트 에디터가 뜬다. 여기서 다음과 같이 해라.
그러면 다음과 같이 변할 것이다.
마찬가지 방법으로 나머지 두개도 해보자.
이제 valid가 전부 YES가 됐다. 이제 덤프한 것을 이것으로 수정하자.
우측 아래에 Fix Dump를 클릭하여 아까 덤프한 dumped.exe를 선택하면 dumped_.exe로 저장될 것이다.