반응형

[발췌:Windows 시스템 실행파일의 구조와 원리 중]

 

비주얼 스튜디오 제공 DumpBin.exe

Viual Studio.NET 2003 명령 프롬프트 > BumpBin

- COFF 형태의 이전 PE 포맷을 비롯한 모든 실행 파일을 비롯하여 임포트 라이브러리 파일(.lib), 익스포트 라이브러리 파일(.exp), 그리고 .obj 등의 가능한 모든 형태의 PE 포맷을 다 지원함.

DumpBin.exe 옵션 들

 옵션  설명
 /ALL  PE 이미지를 위 리스트에 기술된 모든 옵션을 통해서 상세히 그 정보를 보여준다.
 /CLRHEADER  해당 PE가 관리 PE(.NET 기반 PE)인 경우 CLR  헤더의 내용을 출력한다.  
 /DISASM[:{BYTES|NOBYTES}]  텍스트 섹션의 코드 덤프를 역어셈블링해서 어셈블리어로 보여준다.
 /EXPORTS  DLL일 경우 이 DLL이 익스포트한 함수나 변수의 정보를 출력한다.
 /HEADERS  PE 파일의 헤더 정보를 출력한다.
 /IMPORTS[:filename]  임포트한 함수들이나 변수에 대한 정보를 출력한다.
 /RELOCATIONS  기준 재배치 섹션을 통해 재배치 정보를 출력한다.
 /SECTION:name  name 속성에 지정된 이름을 가진 섹션의 정보를 출력한다.


Smidgeonsoft 제공 PEBrowse Professional Interactive(freeware)

[관련사이트:smidgeonsoft]

- GUI를 가지며 비주얼하게 PE의 내용을 볼 수 있는 것이 장점.

  해당 PE를 로드시켜 디버깅도 가능하기 때문에 해당 PE가 실제 가상 주소 공간에 매핑된 상태를 눈으로 직접 확인할 수 있는 유용한 툴.


참고 : PE 이미지를 대상으로 하는 라이브러리인 ImageHelp 라이브러리가 있다

         디폴트로 제공되는 이 라이브러리는 PE 파일을 대상으로 작업 가능한 많은 기능들을 제공한다.

         자세한 설명은 MSDN 을 참고.

반응형

1. PE Format 완전 분석

http://hdp.null2root.org/reversing/PE_analysis_anesra.pdf


2.  Once Upon A Time In PE (번역) - 충실하게 역자주를 달아서 설명이 더 쉽게 되어 있다.(어셈블리어를 좀 알면 더 좋다)

http://web.kaist.ac.kr/~taekwonv/pe_icezlion.htm


원문: (윗글의 링크가 깨어져서 필요할 경우 참조.)

http://win32assembly.online.fr/


http://win32assembly.online.fr/pe-tut1.html (1. Overview Of PE File Format)

http://win32assembly.online.fr/pe-tut2.html (2. Detecting a Valid PE File)

http://win32assembly.online.fr/pe-tut3.html (3. File Header)

http://win32assembly.online.fr/pe-tut4.html (4. Optional Header)

http://win32assembly.online.fr/pe-tut6.html (5. Section Table)

http://win32assembly.online.fr/pe-tut7.html (6. Import Table)

http://win32assembly.online.fr/pe-tut7.html (7. Export Table )


Import Table에 대해 자세히 설명.

http://web.kaist.ac.kr/~taekwonv/pe_iat.htm


3. PE 파일 분석 - 쉬운 설명과 함께 C++ 예제로 어떻게 구현할수 있는지도 알수 있다.

http://kkamagui.springnote.com/pages/407001


4. Peering Inside the PE: A Tour of the Win32 Portable Executable File Format (by Matt Pietrek) - 1994년 (오래되었지만, 고전같이 한번 볼만한 글)

http://msdn.microsoft.com/en-us/magazine/ms809762.aspx


번역:http://blog.naver.com/gekigang/140016674843 


5. An In-Depth Look into the Win32 Portable Executable File Format (by Matt Pietrek) - 2002년

An In-Depth Look into the Win32 Portable Executable File Format, Part 2

(위의 글을 Win32의 변화에 맞추어 같은 저자가 다시 쓴 글)

http://msdn.microsoft.com/en-us/magazine/bb985992.aspx

http://msdn.microsoft.com/en-us/magazine/cc301805.aspx


http://msdn.microsoft.com/en-us/magazine/cc301808.aspx


6. Physical Layout of a .NET Assembly

http://www.informit.com/articles/article.aspx?p=25350


7. PE 레퍼런스(The PE file format by LUEVELSMEYER)

http://webster.cs.ucr.edu/Page_TechDocs/pe.txt


http://win32assembly.online.fr/files/pe1.zip


8. PE 파일 구조 다이어그램

(그림으로 PE 파일이 어떻게 구성되어 있는지 한눈에 볼수 있게 되어 있다)

http://www.openrce.org/reference_library/files/reference/PE%20Format.pdf


9. Wikipedia

http://ko.wikipedia.org/wiki/PE_%ED%8F%AC%EB%A7%B7


* PE 파일을 수정하는 여러 가지 방법들 소개

http://web.kaist.ac.kr/~taekwonv/


* 무료 PE 에디터 - Explorer Suite

http://www.ntcore.com/exsuite.php


* Visual Studio 안에 있는 툴 (...\vc\bin 폴더) - dumpbin


i.e. dumpbin /header "실행 파일"


그 파일안의 파일 헤더, Optional 헤더 등의 내용을 보여준다.

반응형
IDA Pro는 OllyDbg보다 시각적인 부분과 Symbol 찾는 것 등에 장점이 있다.
하지만, 기능이 많고, 메뉴가 숨어있는 탓에 사용법이 어렵고, 익숙해지기 힘든 점이 있다.
나에게도 여전히 OllyDbg가 익숙하며, IDA는 코드의 흐름을 보거나 Symbol에 대한 정리가 필요할 때 잠깐씩 이용한다.
하지만, 잡스럽게 여러 도구들을 이용하는 것보다, 하나의 도구에 익숙해지려 했다.
그래서 간략히 IDA에 대해 정보를 찾던 중 Hex-Ray라는 좋은 플러그인이 있다길래 공부하는 겸 해서 정리한다.

Hex-Ray는 http://www.hex-rays.com/ 의 프로젝트 페이지를 갖고 있으며,
주요 메뉴얼에 대한 정보는 http://www.hex-rays.com/manual/ 에 나와있다.

Hex-Ray에 대해 짧게 기술을 한다면, De-Compiler이다.
OllyDbg나 IDA Pro는 기본적으로 Dis-Assembler의 속성을 갖고 있다.
그래서, Assembly 코드를 잘 표현하는데에 기능이 치중되어있다.
하지만, 그 정보를 활용해 De-Compiler의 기능을 플러그인으로 구현한 것이 Hex-Ray이다.

Hex-Ray를 이용하면, 우리에게 보다 친숙한 C 코드로 변환된 바이너리를 볼 수 있다.

(아래 : 기본적인 Dis-Assemble된 코드)
사용자 삽입 이미지

위 그림은 프로세스를 숨기기 위해 작성된 DKOM 드라이버 코드를 나타내고 있다.

아래 그림은 위 코드를 F5 단축키를 통해 Psuedo C Code로 변환된 드라이버의 모습을 나타내고 있다.

사용자 삽입 이미지

이를 텍스트로 옮기면 아래와 같다.

NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, int a2)
{
  NTSTATUS result; // eax@1
  PDRIVER_OBJECT v3; // esi@1
  NTSTATUS v4; // ebx@2
  int v5; // eax@3
  NTSTATUS v6; // eax@2
  PDEVICE_OBJECT DeviceObject; // [sp+14h] [bp-4h]@1
  LSA_UNICODE_STRING DestinationString; // [sp+Ch] [bp-Ch]@1
  LSA_UNICODE_STRING SymbolicLinkName; // [sp+4h] [bp-14h]@1
  DeviceObject = 0;
  RtlInitUnicodeString(&DestinationString, &word_1078A);
  RtlInitUnicodeString(&SymbolicLinkName, &word_107B2);
  v3 = DriverObject;
  result = IoCreateDevice(DriverObject, 0, &DestinationString, 0x22u, 0x100u, 0, &DeviceObject);
  if ( result >= 0 )
  {
    v6 = IoCreateSymbolicLink(&SymbolicLinkName, &DestinationString);
    v4 = v6;
    if ( v6 >= 0 )
    {
      v3->DriverUnload = (PDRIVER_UNLOAD)DriverUnload;
      gProcessNameOffset = GetProcessNameOffset();
      v5 = FindProcessByName("notepad.exe");
      pHidenProc = v5;
      if ( v5 )
      {
        hHidenProc = v5 + 132;
        HideProcess(v5);
      }
      __asm { mov     eax, cr0 }
      _EAX &= 0xFFFEFFFFu;
      __asm { mov     cr0, eax }
      oldZwQuerySystemInformation = (int)*(&imp__KeServiceDescriptorTable
                                         + *(_DWORD *)((char *)ZwQuerySystemInformation + 1));
      *(&imp__KeServiceDescriptorTable + *(_DWORD *)((char *)ZwQuerySystemInformation + 1)) = NewZwQuerySystemInformation;
      oldZwTerminateProcess = (int)*(&imp__KeServiceDescriptorTable + *(_DWORD *)((char *)ZwTerminateProcess + 1));
      *(&imp__KeServiceDescriptorTable + *(_DWORD *)((char *)ZwTerminateProcess + 1)) = NewZwTerminateProcess;
      __asm { mov     eax, cr0 }
      _EAX |= 0x10000u;
      __asm { mov     cr0, eax }
    }
    result = v4;
  }
  return result;
}

아래는 실제의 드라이버 코드를 나타내고 있다.
보다시피 거의 유사하다는 것을 확인할 수 있다.

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) {
 NTSTATUS status = 0;
 PDEVICE_OBJECT DevObj = NULL;
 UNICODE_STRING DeviceNameUnicodeString; // 생성될 장치의 이름
 UNICODE_STRING DeviceLinkUnicodeString; // 생성될 장치의 심볼릭 링크
 PEPROCESS pCurProc = NULL, pNotepadProc = NULL;
 UINT i = 0;
 KdPrint(("\n\n>-------------------------------\n\n"));
 KdPrint(("\n\n------------Init Driver---------\n\n"));
 KdPrint(("\n\n--------------------------------\n\n"));
 RtlInitUnicodeString(&DeviceNameUnicodeString, DEVICENAME);
 RtlInitUnicodeString(&DeviceLinkUnicodeString, DEVICESYMBOLICNAME);
 //////////////////////////////////////////////////////////////////////////
 // Device 객체를 생성
 status = IoCreateDevice(DriverObject,
  0,
  &DeviceNameUnicodeString,
  FILE_DEVICE_UNKNOWN,
  FILE_DEVICE_SECURE_OPEN,
  FALSE,
  &DevObj);
 if(!NT_SUCCESS(status)) {
  KdPrint((" -[DriverEntry::IoCreateDevice] Function Fail\n"));
  return status;
 }
 else
  KdPrint((" +[DriverEntry::IoCreateDevice] Function Success\n"));
 //////////////////////////////////////////////////////////////////////////

 //////////////////////////////////////////////////////////////////////////
 // 심볼릭 링크를 생성 - 장치 이름과 Win32 이름 사이의 링크
 status = IoCreateSymbolicLink(&DeviceLinkUnicodeString, &DeviceNameUnicodeString);
 if(!NT_SUCCESS(status)) {
  KdPrint((" -[DriverEntry::IoCreateSymbolicLink] Function Fail\n"));
  return status;
 }
 else
  KdPrint((" +[DriverEntry::IoCreateSymbolicLink] Function Success\n"));
 //////////////////////////////////////////////////////////////////////////

보다시피 Hex-Ray는 Dis-Assemble 된 코드에 대해 훌륭하게 De-Compile된 코드를 제공한다. 이를 활용하면, 실제 바이너리 분석이나 어셈코드 공부에 많은 도움을 얻을 수 있다.
반응형

프로그램 디버깅 하고 분석할 때 아주 유용한 도구입니다.

OllyDBG는 Win32 API에 최고. MFC 관련은 IDA PRO Disassemble 추천.

 

OllyDbg가 디버거로써는 뛰어나지만, reverse analyzing 면에서는 IDA Pro 가 독보적이죠~

OllyDbg는 Win32 API 인 경우 충실히 label (ex: CreateFile, ExitProcess, etc) 을 달아주지만,
RunTime/MFC library 인 경우 거의 label (ex: printf, strcpy, CString::CString() etc) 정보를 주지 못합니다.


소개하는 플러그인은 IDA Pro에서 자동으로 추가되는 label 과 comment 까지 그대로 OllyDbg 에서 쓸 수 있도록 도와줍니다.


사용법은


1. 플러그인 설치
2. IDA Pro 실행 -> 원하는 파일 오픈  (=> IDA가 욜씨미 분석을 하겠죵)
3. 맵파일 생성 : File\Produce file\Create Map file 메뉴 선택 => 나타나는 dialog 의 모든 체크박스에 체크 해주시고...
4. OllyDbg 실행 -> 동일 파일 오픈
5. 맵파일 로드 : Plugins\MapConv\Replace label 메뉴 선택 => 파일오픈 dialog에서 해당 *.map 파일 선택

 

OllyDbg 단축키

출처: http://home.t-online.de/home/Ollydbg/quickst.htm

Ctrl+F2 프로그램 재실행
Alt+F2 프로그램 닫기
F3 새 프로그램 열기
F5 활성화 되어 있는 윈도우 최대화, 혹은 원복
Alt+F5 olly 디버거 윈도우를 항상 위로
F7 Step into (함수 진입)
Ctrl+F7 Animate into (entering functions)
F8 Step over (executing function calls at once)
Ctrl+F8 Animate over (executing function calls at once)
F9 실행
Shift+F9 Pass exception to standard handler and run
Ctrl+F9 Execute till return
Alt+F9 Execute till user code
Ctrl+F11 Trace into
F12 Pause
Ctrl+F12 Trace over
Alt+B Open Breakpoints window
Alt+C Open CPU window
Alt+E Open Modules window
Alt+L Open Log window
Alt+M Open Memory window
Alt+O Open Options dialog
Ctrl+T Set condition to pause Run trace
Alt+X Close OllyDbg
F2 Toggle breakpoint
Shift+F2 Set conditional breakpoint
F4 Run to selection
Alt+F7 Go to previous reference
Alt+F8 Go to next reference
Ctrl+A Analyse code
Ctrl+B Start binary search
Ctrl+C Copy selection to clipboard
Ctrl+E Edit selection in binary format
Ctrl+F Search for a command
Ctrl+G Follow expression
Ctrl+J Show list of jumps to selected line
Ctrl+K View call tree
Ctrl+L Repeat last search
Ctrl+N Open list of labels (names)
Ctrl+O Scan object files
Ctrl+R Find references to selected command
Ctrl+S Search for a sequence of commands
Asterisk (*) Origin
Enter Follow jump or call
Plus (+) Go to next location/next run trace item
Minus (-) Go to previous location/previous run trace item
Space ( ) Assemble
Colon (:) Add label
Semicolon (;) Add comment
ctrl+위, 아래 화살표키 디스어셈블 위치 지정


소프트아이스와 함께 가장 많이들 사용하시는 올리디버거입니다. 소프트아이스와 같은 커널 디버거는 아니지만 사용하기 쉽고 기능도 많들으며 보기 좋은 인터페이스를 가지고 있습니다.

※ 제가 수정한 ollydbg.ini.fix를 사용하시면 좀 더 음침한(?) 인터페이스가 됩니다. ^^;

※ 한가지 주의할 점은 다음과 같습니다.
디 버그 모드로 빌드할 경우, *.exe 파일과 함께 *.pdb 파일이 생성되는데 (물론, 릴리즈 모드로 빌드하여도 옵션을 설정하면 *.pdb 파일을 생성할 수 있습니다.) 이것은 심볼(Symbol) 파일로 OllyDbg에서는 이 파일을 참조하여 디버깅시 사용자에게 추가적인 정보를 제공합니다. 그런데 이 파일이 위치하는 디렉토리의 경로명 중에 공백이 있을 경우 OllyDbg에서는 찾질 못하네요. 따라서 디렉토리 명에 공백이 들어가지 않도록 주의하시기 바랍니다. 소스 파일의 경로 또한 마찬가지입니다.

※ 버그가 있군요.
위 내용도 그렇고 올리에서는 디버깅 심볼 관련 파일들의 패스를 잘 찾지 못하는 것 같습니다. 소스 파일의 경우 패스가 길어지니까 올리에서는 패스를 엉뚱하게 인식하네요. 아마 버그인듯 합니다. Ollydbg Users Forum에는 그런 버그 리포트가 없지만요... -_-ㅋ 암튼 해결책은 간단한 패스에서 처음부터 개발작업을 하던지 빌드할 때만 간단한 패스로 옮겨와서 빌드해야 할 것입니다.

 

이 프로그램을 가지고 원래 우리가 작성한 프로그램을 역 어셈블 할 수 있다.


처음 프로그램을 설치하고 option 의 appearance에서 두개의 폴더설정을 현재의 프로그램이 있는 폴더를 설정한다.


그리고 visual c++의 project를 설치할 때 release mode와 minimize size를 해서 프로젝트를 만들어준다.


cf ) Minimize size와 Release Mode 그리고 Maximize speed와 Release Mode의 차이점....

speed와 size의 Trade-off가 된다. 이것은 이 util을 가지고 프로그램의 내부를 들여다보면 알 수 있다.

반응형
 

도구란에 첨부되어 있는 ollydbg의 압축을 풀은 폴더의 모습이다.

실행파일 OLLYDBG.EXE (빨간색 아이콘)으로 실행해보자.

사용자 삽입 이미지

실행하자마자 아래와 같은 에러 메세지가 여러분을 반길것이다.

프로그램에 문제가 있는게 아니니 불량 파일이라고 지우는 일이 없도록하자.

하지만, 매번 실행시마다 이런 메세지와 조우하게 된다면 심각하게 짜증이 날것이다.

해결해보자.

사용자 삽입 이미지

메뉴에서 Options을 클릭하고 Appearance 클릭!
 

사용자 삽입 이미지










아래와 같은 창을 마주하게 될것이다..

다음으로 넘어가서..

사용자 삽입 이미지


UDD path 의 설정으로 설명하자면.

Browse 를 클릭하고.

자신이 설치한 ollydbg 가 있는 폴더안의 udd 폴더를 체크()한 후,

확인(설정 저장)해주면 된다.

사용자 삽입 이미지


Plugin path 도 마찬가지 방법으로 해주면 된다.


사용자 삽입 이미지

확인(ok)을 해주면.. 아래와 같은 창이 뜰건데.. 역시 확인!

이제 ollydbg 를 종료 해도 된다.

사용자 삽입 이미지


이전 올디(ollydbg)의 메뉴와..

 

사용자 삽입 이미지







위의 설정 저장 후의 메뉴이다.. Plugins 라는 메뉴가 하나 생성됬음을 알 수 있다.

사용자 삽입 이미지

 





기본적인 설정을 마쳤다..
잘 따라왔다면.. 처음의 에러 메세지가 사라졌음을 알 수 있다.
그럼 다음에..
 
 
작성자 : Yarnz.

+ Recent posts