0046B000 > 8BC4 MOV EAX,ESP
0046B002 FF30 PUSH DWORD PTR DS:[EAX]
0046B004 8368 FC 4F SUB DWORD PTR DS:[EAX-4],4F
0046B008 68 B0714200 PUSH UnPackMe.004271B0
0046B00D FF50 FC CALL DWORD PTR DS:[EAX-4]
0046B010 83C4 08 ADD ESP,8
0046B013 FF70 F8 PUSH DWORD PTR DS:[EAX-8]
0046B016 B3 99 MOV BL,99
0046B018 B8 00104000 MOV EAX,UnPackMe.00401000
0046B01D 3D 00A24400 CMP EAX,UnPackMe.0044A200
0046B022 74 07 JE SHORT UnPackMe.0046B02B
0046B024 3018 XOR BYTE PTR DS:[EAX],BL
0046B026 D0C3 ROL BL,1
0046B028 40 INC EAX
0046B029 ^EB F2 JMP SHORT UnPackMe.0046B01D
0046B02B B3 F8 MOV BL,0F8
0046B02D B8 00704500 MOV EAX,UnPackMe.00457000
0046B032 3D 00C84500 CMP EAX,UnPackMe.0045C800
0046B037 74 07 JE SHORT UnPackMe.0046B040
0046B039 3018 XOR BYTE PTR DS:[EAX],BL
0046B03B D0C3 ROL BL,1
0046B03D 40 INC EAX
0046B03E ^EB F2 JMP SHORT UnPackMe.0046B032
0046B040 E8 00000000 CALL UnPackMe.0046B045
0046B045 C3 RETN
PUSH를 하면 ESP가 변경되게 된다. 그러면 ESP를 Dump창으로 옮겨서 최상위 4Byte에 하드웨어 엑세스 브레이크 포인트를 Dword로 건다.
그리고 Run(F9)를 몇차례 하면 아래와 같이 나온다.
004271B0 . 55 PUSH EBP
004271B1 . 8BEC MOV EBP,ESP
004271B3 ? 6A FF PUSH -1
004271B5 ? 68 600E4500 PUSH UnPackMe.00450E60
004271BA 68 DB 68 ; CHAR 'h'
004271BB C8 DB C8
004271BC 92 DB 92
004271BD 42 DB 42 ; CHAR 'B'
004271BE 00 DB 00
004271BF 64 DB 64 ; CHAR 'd'
004271C0 A1 DB A1
004271C1 00 DB 00
004271C2 00 DB 00
함수 프롤로그 부근에 도달하였으면 Analysis -> Analyse Code 메뉴를 실행하면 정상적인 코드로 보이게 된다.
004271B0 . 55 PUSH EBP
004271B1 . 8BEC MOV EBP,ESP
004271B3 . 6A FF PUSH -1
004271B5 . 68 600E4500 PUSH UnPackMe.00450E60
004271BA . 68 C8924200 PUSH UnPackMe.004292C8 ; SE handler installation
004271BF . 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
004271C5 . 50 PUSH EAX
004271C6 . 64:8925 000000>MOV DWORD PTR FS:[0],ESP
004271CD . 83C4 A8 ADD ESP,-58
004271D0 . 53 PUSH EBX
004271D1 . 56 PUSH ESI
004271D2 . 57 PUSH EDI
004271D3 . 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
004271D6 . FF15 DC0A4600 CALL DWORD PTR DS:[<&KERNEL32.GetVersion>; kernel32.GetVersion
이곳이 OEP이다.
ImpREC 툴을 사용하여 OEP에 4271B0 - 40000(ImageBase값) = 271B0를 적어준다.
IAT를 찾기 위하여 자동화 툴을 사용하지 않고 수동으로 찾는다
For Search Binary String을 통해 FF25를 검색한다.
00435CC0 $-FF25 88094600 JMP DWORD PTR DS:[<&KERNEL32.RtlUnwind>] ; ntdll.RtlUnwind
00435CC6 $-FF25 000C4600 JMP DWORD PTR DS:[<&USER32.ReuseDDElParam>] ; USER32.ReuseDDElParam
00435CCC $-FF25 040C4600 JMP DWORD PTR DS:[<&USER32.UnpackDDElParam>] ; USER32.UnpackDDElParam
00435CD2 $-FF25 D00E4600 JMP DWORD PTR DS:[<&comdlg32.ChooseFontA>] ; comdlg32.ChooseFontA
00435CD8 $-FF25 D80E4600 JMP DWORD PTR DS:[<&comdlg32.ChooseColorA>] ; comdlg32.ChooseColorA
00435CDE $-FF25 D40E4600 JMP DWORD PTR DS:[<&comdlg32.PrintDlgA>] ; comdlg32.PrintDlgA
00435CE4 $-FF25 CC0E4600 JMP DWORD PTR DS:[<&comdlg32.GetSaveFileNameA>] ; comdlg32.GetSaveFileNameA
00435CEA $-FF25 C80E4600 JMP DWORD PTR DS:[<&comdlg32.GetOpenFileNameA>] ; comdlg32.GetOpenFileNameA
00435CF0 $-FF25 C40E4600 JMP DWORD PTR DS:[<&comdlg32.GetFileTitleA>] ; comdlg32.GetFileTitleA
00435CF6 $-FF25 C00E4600 JMP DWORD PTR DS:[<&comdlg32.ReplaceTextA>] ; comdlg32.ReplaceTextA
00435CFC $-FF25 BC0E4600 JMP DWORD PTR DS:[<&comdlg32.FindTextA>] ; comdlg32.FindTextA
00435D02 $-FF25 B80E4600 JMP DWORD PTR DS:[<&comdlg32.CommDlgExtendedErro>; comdlg32.CommDlgExtendedError
00435D08 $-FF25 B00E4600 JMP DWORD PTR DS:[<&WINSPOOL.ClosePrinter>] ; WINSPOOL.ClosePrinter
00435D0E $-FF25 940E4600 JMP DWORD PTR DS:[<&WINSPOOL.EndDocPrinter>] ; WINSPOOL.EndDocPrinter
00435D14 $-FF25 AC0E4600 JMP DWORD PTR DS:[<&WINSPOOL.StartPagePrinter>] ; WINSPOOL.StartPagePrinter
위와 같은 부분을 만날수 있게 되고
Follow in Dump Memory Address 를 하게 되면 덤프 창에서 IAT를 찾을 수 있다. 이때 Dump 창을 Long의 Address 형식으로 보면 보기 수월하다.
00460818 >77F56C17 ADVAPI32.RegCloseKey
0046081C >77F57842 ADVAPI32.RegOpenKeyExA
00460820 >77F5E9E4 ADVAPI32.RegCreateKeyExA
00460824 >77F5EAD7 ADVAPI32.RegSetValueExA
00460828 >77F57AAB ADVAPI32.RegQueryValueExA
0046082C 00000000
00460830 >5C8265CF COMCTL32.InitCommonControls
00460834 >5C8303D8 COMCTL32.ImageList_Destroy
00460838 00000000
0046083C >77E26AA1 GDI32.GetClipBox
00460840 >77E290DD GDI32.ExcludeClipRect
00460844 >77E26A56 GDI32.IntersectClipRect
00460848 >77E2A20A GDI32.MoveToEx
이런 식으로 덤프창에 보이게 된다.
60818이 시작주소이고
60F2B(마지막주소)-60818(시작주소) = 713 라는 Size값을 확인할 수 있다.
그러나 IAT를 찾을 필요가 없을 수도 있다. OllyDump만으로 하여도 이미 IAT가 정상적으로 설정이 된 경우일 수 있기 때문이다.