'전체보기'에 해당되는 글 126건

  1. 2009.05.26 [프로그램] cygwin 설치법
  2. 2009.05.20 [프로그래밍 일반] PE 파일 분석 - 헤더분석 2
  3. 2009.05.19 [프로그래밍 일반] PE구조란?
  4. 2009.05.14 [어셈블리어] push와 pop의 구분동작
  5. 2009.05.14 [어셈블리어] PUSHA와 POPA
  6. 2009.05.11 [어셈블리어] 데이터 전송 명령어 mov, movzx, movsx
  7. 2009.05.08 [어셈블리어] 곱셈 - MUL, IMUL
  8. 2009.05.07 QPTS 2.7
  9. 2009.05.07 네온사인폰 양방향 통신하기(동영상전송) 14
  10. 2009.05.06 [어셈블리어] 나눗셈
2009. 5. 26. 10:03

[프로그램] cygwin 설치법

cygwin이란 윈도우에서 gnu 프로그램들을 사용할 수 있게 해주는 한마디로 윈도우 상에서 돌아가는 리눅스라고 할 수 있다. 오늘은 이 cygwin의 설치법에 대해 알아보자.

먼저 cygwin 홈페이지에 접속한다.



홈페이지 중간쯤에 보면 위의 그림과 같은 곳을 클릭하면 설치 파일을 받을 수 있다. 실행시키자.

다음을 누르자.

설치 파일을 다운로드 받아야 하므로 인터넷으로부터 설치를 선택하고 다음.

설치될 경로를 지정해주고 다음(디폴트는 c:\cygwin).

설치 패키지를 임시저장할 장소를 지정해주고 다음.

인터넷 설정에 맞게 선택하고(일반적으로 직접연결하면 됨) 다음.

파일을 받을 서버를 선택하고 다음(daum이 가장 빠른듯).

다운로드가 끝나면 gnu 유틸리티를 어떤걸 설치할지 묻는데 기본적으로 모두 skip으로 되있다.

+Devel을 펼쳐보면 gcc나 cvs같은 개발도구들이 있고 +Editors를 펼쳐보면 vi와 emacs같은 편집기들이 있다.
원하는 패키지가 있다면 Default를 한번 클릭하면 install로 바뀐다(몇 초정도 걸릴 수도 있다.)
인스톨할 패키지를 선택해주고 다음.


패키지를 다운 받는다. (앞에서 모두 선택했다면 1시간 정도 걸린다.)


설치가 모두 끝났다. vi와 gcc가 제대로 설치됐는지 확인해보면 끝.


윈도우의 C드라이브를 찾으려면 /cygdrive에 가면 볼수 있다.

2009. 5. 20. 09:20

[프로그래밍 일반] PE 파일 분석 - 헤더분석

원문 : kkamagui의 프로그래밍 작업실 http://kkamagui.springnote.com/pages/401262

개요

 윈도우 시스템 프로그래밍한다는 사람치고 PE 파일에 대해서 모르는 사람은 아마 거의 없을 것이다. 윈도우 실행 파일 및 DLL, 그리고 드라이버 파일까지도 PE 파일 형태를 따르고 있으니 뭘 해도 따라다니는게 이 PE(Portable Executable) 파일 포맷이니까 말이다. PE 파일 포맷은 크게 헤더, 섹션, 데이터의 세부분으로 나뉘는데 기존 DOS 시절 사용하던 COFF(Common Object File Format)과 거의 비슷한 구조를 가지며 기본 뼈대에서 확장된 듯한 형태를 가진다.

 PE 실행파일이 가지고 있는 헤더를 분석함으로써 실제 데이터가 있는 위치를 파일에서 찾고 해당 영역을 분석할 수 있다.

 PE 파일 구조에 대해서 자세히 알아보기 전에 참고할 좋은 프로그램 몇가지를 소개한다.

  • PE Explorer :  유료다. ㅡ,.ㅡ;;; 공짜 버전도 있는데 30일 한정이라서... 그렇지만 강력하다 @0@)/~
  • PE Browser : 공짜다. 하지만 역시 뭔가 부족하다는 거... 그냥 쓰기에는 괜찮다.

 

 앞으로 Relative Virtual Address(RVA)라는 용어가 많이 나올텐데, 잠깐 알아보자.

 RVA 는 실행파일이 메모리에 로드되었을 때, 그 시작 주소를 0으로 생각하고 계산하는 주소이다. 즉 RVA의 값이 0x40 이고 실행파일이 로드되었을 때, 그 시작위치가 0x1000 이라면 실제 그 영역이 메모리에 로드되었을 때 위치는 0x1040이 된다. 실행파일 시작 위치를 0으로 하는 상대적 주소라는 것만 알면 같단하다. 뒤에 설명하면서 계속 사용될 용어이므로 알아두자.


PE 파일 포맷 전체 구조

 PE 파일 포맷은 크게 아래와 같이 구성된다.

 

 위에서 보는 것과 같이 크게는 붉은 색 부분과  푸른색 부분으로 나눌 수 있다. 붉은 색 부분은 헤더나 데이터가 위치하는 영역의 속성과 크기 등등을 나타내는 정보이고, 푸른 색 부분은 실제 데이터들이 위치하는 영역을 나타낸다.

 

  • IMAGE_DOS_HEADER : PE 파일의 처음에 위치하며 뒷부분에 DOS에서 실행했을 때,  에러 메시지(This program cannot be run in DOS mode)를 표시하는 스텁(Stub) 코드를 포함하고 있음. MAGIC Number와 다음에 오는 IMAGE_NT_HEADER의 위치를 표시
  • IMAGE_NT_HEADER : PE 파일 포맷에 대한 정보를 포함. 아래의 두 부분으로 구성 
    • IMAGE_FILE_HEADER :  Section의 수 및 속성과 같은 정보 포함
    • IMAGE_OPTIONAL_HEADER : PE 파일에 대한 속성 또는 이미지 베이스와 같은 정보 포함
      • Data Directory : 어떤 영역의 Virtual Address와 Size 정보를 포함
  • IMAGE_SECTION_HEADER : 섹션에 대한 실질적인 정보를 포함
  • Section(섹션) : 실제 데이터가 위치하는 영역

 

 각 영역에 대해 세부적으로 알아보자.

 

IMAGE_DOS_HEADER

 IMAGE_DOS_HEADER는 PE 실행파일 첫부분에 위치하며 아래와 같이 WinNT.h에 정의되어 있다.

      #define IMAGE_DOS_SIGNATURE                 0x4D5A      // MZ
      #define IMAGE_OS2_SIGNATURE                 0x4E45      // NE
      #define IMAGE_OS2_SIGNATURE_LE              0x4C45      // LE
      #define IMAGE_NT_SIGNATURE                  0x50450000  // PE00
      typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
          WORD   e_magic;                     // Magic number <MZ>
          WORD   e_cblp;                      // Bytes on last page of file
          WORD   e_cp;                        // Pages in file
          WORD   e_crlc;                      // Relocations
          WORD   e_cparhdr;                   // Size of header in paragraphs
          WORD   e_minalloc;                  // Minimum extra paragraphs needed
          WORD   e_maxalloc;                  // Maximum extra paragraphs needed
          WORD   e_ss;                        // Initial (relative) SS value
          WORD   e_sp;                        // Initial SP value
          WORD   e_csum;                      // Checksum
          WORD   e_ip;                        // Initial IP value
          WORD   e_cs;                        // Initial (relative) CS value
          WORD   e_lfarlc;                    // File address of relocation table
          WORD   e_ovno;                      // Overlay number
          WORD   e_res[4];                    // Reserved words
          WORD   e_oemid;                     // OEM identifier (for e_oeminfo)
          WORD   e_oeminfo;                   // OEM information; e_oemid specific
          WORD   e_res2[10];                  // Reserved words
          LONG   e_lfanew;                    // File address of new exe header
        } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

  크게 주의해서 볼 부분은 실행파일인지 판단하는데 사용되는 e_magic 부분과 다음에 오는 IMAGE_NT_HEADER의 위치를 표시해 주는 e_lfanew 부분이다. 다른 부분은 크게 중요한 정보를 가지고 있지 않으니 일단 패스~


IMAGE_NT_HEADER

 IMAGE_NT_HEADER는 실제 PE 파일 포맷에 대한 정보를 포함하는 헤더로써 IMAGE_FILE_HEADER와 IMAGE_OPTIONAL_HEADER로 구성된다.

typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature; <PE00>
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

 IMAGE_NT_HEADER는 위와 같이 Signature와 File 헤더, 그리고 Optional Header로 구성되어있다. Signature는 IMAGE_NT_SIGNATURE 로 <PE00>의 값을 가진다. 그럼 첫번째에 해당하는 FileHeader를 알아보자.

 

IMAGE_FILE_HEADER

typedef struct _IMAGE_FILE_HEADER {
    WORD    Machine;
    WORD    NumberOfSections;
    DWORD   TimeDateStamp;
    DWORD   PointerToSymbolTable;
    DWORD   NumberOfSymbols;
    WORD    SizeOfOptionalHeader;
    WORD    Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

 IMAGE_FILE_HEADER는 위와 같이 구성된다. 각 항목에 대해서 알아보면 아래와 같다.

  • Machine : CPU ID를 나타내는데, 간단히 보면 Intel 인지, MIPS 인지 등등의 정보가 들어있음
  • NumberOfSections : PE 파일에 포함된 총 섹션의 수를 나타냄
  • TimeDateStamp : 컴파일러 또는 링커가 파일을 생성한 시간. 1970년 1월 1일 GMT 기준으로 지나온 초
  • PointerToSymbolTable :  COFF 파일의 심볼 테이블의 오프셋을 나타냄. 없는 경우가 대부분
  • NumberOfSymbols : 심볼의 개수를 나타냄
  • SizeOfOptionalHeader : 뒤에 이어서 나오는 Optional Header의 크기를 나타낸다. 32Bit/64Bit에 따라서 그 크기가 다름
  • Characteristics : 파일의 특성

 

 Machine에 대한 매크로는 WinNT.h에 정의되어있는데 아래와 같다. Intel32 or Intel64가 대부분일테니까 위의 파란색만 보면 될것 같다.

#define IMAGE_FILE_MACHINE_UNKNOWN           0
#define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.
#define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian
#define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian
#define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian
#define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169  // MIPS little-endian WCE v2
#define IMAGE_FILE_MACHINE_ALPHA             0x0184  // Alpha_AXP
#define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian
#define IMAGE_FILE_MACHINE_SH3DSP            0x01a3
#define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian
#define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian
#define IMAGE_FILE_MACHINE_SH5               0x01a8  // SH5
#define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian
#define IMAGE_FILE_MACHINE_THUMB             0x01c2
#define IMAGE_FILE_MACHINE_AM33              0x01d3
#define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1
#define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64
#define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS
#define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64
#define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS
#define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64
#define IMAGE_FILE_MACHINE_TRICORE           0x0520  // Infineon
#define IMAGE_FILE_MACHINE_CEF               0x0CEF
#define IMAGE_FILE_MACHINE_EBC               0x0EBC  // EFI Byte Code
#define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8)
#define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian
#define IMAGE_FILE_MACHINE_CEE               0xC0EE

  다음은 Characteristics에 대한 부분인데 WinNT.h에 아래와 같이 정의되어있다. 역시나 파란색 부분만 보면 될 것 같다.

// Relocation info stripped from file.
#define IMAGE_FILE_RELOCS_STRIPPED      0x0001 
// File is executable  (i.e. no unresolved externel references).
#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002
// Line nunbers stripped from file.
#define IMAGE_FILE_LINE_NUMS_STRIPPED    0x0004 
// Local symbols stripped from file.
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008
// Agressively trim working set 
#define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010 
// App can handle >2gb addresses
#define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020
// Bytes of machine word are reversed. 
#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080
// 32 bit word machine. 
#define IMAGE_FILE_32BIT_MACHINE             0x0100 
// Debugging info stripped from file in .DBG file
#define IMAGE_FILE_DEBUG_STRIPPED            0x0200 
// If Image is on removable media, copy and run from the swap file.
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400 
// If Image is on Net, copy and run from the swap file.
#define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800 
// System File.
#define IMAGE_FILE_SYSTEM                    0x1000 
// File is a DLL.
#define IMAGE_FILE_DLL                       0x2000 
// File should only be run on a UP machine
#define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000 
// Bytes of machine word are reversed.
#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000 

IMAGE_OPTIONAL_HEADER

  typedef struct _IMAGE_OPTIONAL_HEADER {
          //
          // Standard fields.
          //
          WORD    Magic;
          BYTE    MajorLinkerVersion;
          BYTE    MinorLinkerVersion;
          DWORD   SizeOfCode;
          DWORD   SizeOfInitializedData;
          DWORD   SizeOfUninitializedData;
          DWORD   AddressOfEntryPoint;
          DWORD   BaseOfCode;
          DWORD   BaseOfData;
          //
          // NT additional fields.
          //
          DWORD   ImageBase;
          DWORD   SectionAlignment;
          DWORD   FileAlignment;
          WORD    MajorOperatingSystemVersion;
          WORD    MinorOperatingSystemVersion;
          WORD    MajorImageVersion;
          WORD    MinorImageVersion;
          WORD    MajorSubsystemVersion;
          WORD    MinorSubsystemVersion;
          DWORD   Win32VersionValue;
          DWORD   SizeOfImage;
          DWORD   SizeOfHeaders;
          DWORD   CheckSum;
          WORD    Subsystem;
          WORD    DllCharacteristics;
          DWORD   SizeOfStackReserve;
          DWORD   SizeOfStackCommit;
          DWORD   SizeOfHeapReserve;
          DWORD   SizeOfHeapCommit;
          DWORD   LoaderFlags;
          DWORD   NumberOfRvaAndSizes;
       IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
  } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

 Optional Header는 꽤나 중요한 정보를 가지고 있다. 위에서 보면 알 수 있듯이 PE 파일의 전반적이 내용들에 대한 정보를 포함한다. 항목이 꽤나 많은데 중요한 정보만 추리면 아래와 같다.

  • Magic : Signature로 32Bit의 경우 0x10b를 가짐
  • SizeOfCode : 섹션 중에 IMAGE_SCN_CNT_CODE 속성을 가진 섹션들 전체의 합
  • SizeOfInitializedData : 섹션 중에 IMAGE_SCN_CNT_INITIALIZED_DATA 속성을 가진 섹션들 전체의 합
  • SizeOfUninitializedData : 섹션 중에 IMAGE_SCN_CNT_UNINITIALIZED_DATA 속성을 가진 섹션들 전체의 합
  • AddressOfEntryPoint : Entry Point의 주소. 실제 로더가 제일 먼저 실행할 코드의 시작점
  • BaseOfCode : 코드가 시작되는 상대 주소(RVA)
  • BaseOfData : 데이터가 시작되는 상대 주소(RVA)
  • ImageBase : 이미지가 로딩되는 메모리의 Base 주소. 일반적으로 실행파일의 경우 0x400000(4Mbyte) 위치에 로딩
  • SectionAlignment : 섹션이 정렬되는 크기. PE 파일 자체가 메모리 맵 파일이기 때문에 0x1000(4Kbyte) 보다 크거나 같아야 함
  • SizeOfImage : 모든 섹션들의 합. 이미지 실행을 위해 메모리를 할당해야 하는 총 크기
  • NumberOfRvaAndSizes : 뒤에 오는 DataDirectory의 개수. 무조건 16개
  • Data Directory : 총 16개가 있으며 각 항목은 특정 데이터에 대한 정보를 가지고 있음. 뒤에서 설명

 

 Magic은 아래와 같이 WinNT.h에 정의되어있다.

#define IMAGE_NT_OPTIONAL_HDR32_MAGIC      0x10b
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20b
#define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107


IMAGE_DATA_DIRECTORY

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;
    DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;


 데이터 디렉토리는 위와 같은 구조로 이루어져있으며 IMAGE_OPTIONAL_HEADER에 총 16개가 있다. 각각에 Index에 대한 매크로는 WinNT.h에 아래와 같이 정의되어있다.

#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // Export Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // Import Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // Resource Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // Exception Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // Security Directory
#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // Debug Directory
//      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage)
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP
#define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers
#define IMAGE_DIRECTORY_ENTRY_IAT            12   // Import Address Table
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor

 이미지 디렉토리 정보는 굉장히 중요하다. 경우에 따라서 섹션이 합쳐질 수 있기 때문에 통합된 섹션에서 원하는 정보를 찾는 방법은 이미지 디렉토리에 포함된 정보를 이용하는 방법 밖에는 없다. 여러모로 많이 쓰이는 인덱스는 아래와 같은 역할을 한다.

  • IMAGE_DIRECTORY_ENTRY_EXPORT : Export 함수들에 대한 Export Table의 시작 위치와 크기를 나타냄
  • IMAGE_DIRECTORY_ENTRY_IMPORT : Import 함수들에 대한 Import Table의 시작 위치와 크기를 나타냄
  • IMAGE_DIRECTORY_ENTRY_RESOURCE : IMAGE_RESOURCE_DIRECTORY 구조체의 시작 위치를 나타냄
  • IMAGE_DIRECTORY_ENTRY_TLS : Thread Local Storage에 대한 포인터
  • IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG : IMAGE_LOAD_CONFIG_DIRECTORY 구조체애 대한 포인터
  • IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT : IMAGE_BOUND_IMPORT_DESCRIPTOR 구조체의 배열을 가리키는 포인터
  • IMAGE_DIRECTORY_ENTRY_IAT : Import Address Table의 시작 위치를 나타냄

 실제 위의 값중에서 변경하면 OS의 로더에 의해 로딩이 되지 않는 부분이 있는데, 붉은 색으로 표시된 IMAGE_DIRECTORY_ENTRY_TLSIMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 부분이다. 이 부분은 미리 로더가 읽어서 초기 작업을 실행하는 부분이라 이부분이 포함된 영역을 이상하게 조작하게되면 로더가 로딩에 실패하게 된다(PE파일 암호화 과제를 하면서 온몸으로 느꼈다.. ㅡ_ㅡ;;;). 조작을 하려면 신중히 해야될 듯 싶다.

 

 여기까지 IMAGE_NT_HEADER에 대해서 알아보았다. 일단 지금은 특정영역의 크기와 위치를 표시한다는 정도만 알아놓고 다음으로 넘어가자.

 

IMAGE_SECTION_HEADER

 PE 헤더의 뒷부분에 연속해서 IMAGE_SECTION_HEADER가 위치하게 된다. 섹션은 뒤에 올 코드나 데이터가 위치하는 영역에 대한 구체적인 정보를 포함하고 있으므로 굉장히 중요하다. 섹션의 개수는 앞서 IMAGE_FILE_HEADER에 포함된 NumberOfSections에서 얻을 수 있으며 해당 개수만큼 얻어오면 된다. IMAGE_SECTION_HEADER는 WinNT.h에 아래와 같이 정의되어있다.

#define IMAGE_SIZEOF_SHORT_NAME              8
typedef struct _IMAGE_SECTION_HEADER {
          BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
          union {
                  DWORD   PhysicalAddress;
                  DWORD   VirtualSize;
          } Misc;
          DWORD   VirtualAddress;
          DWORD   SizeOfRawData;
          DWORD   PointerToRawData;
          DWORD   PointerToRelocations;
          DWORD   PointerToLinenumbers;
          WORD    NumberOfRelocations;
          WORD    NumberOfLinenumbers;
          DWORD   Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

  중요한 항목에 대한 의미는 아래와 같다.

  • VirtualSize : 실제 코드나 데이터 영역의 크기를 표시
  • VirtualAddress : 메모리에 로드되었을 때 RVA를 표시
  • SizeOfRawData : VirtualSize의 크기를 IMAGE_OPTIONAL_HEADER에 포함된 FileAlignment의 단위로 올림한 크기
  • PointerToRawData : 실제 섹션 데이터가 파일 내에 존재하는 오프셋. Virtual Address와 같을 수도 있고 다를 수도 있음
  • Characteristics : 섹션의 속성 표시. 자세한 것은 뒤를 참조

 위의 VirtualSize와 SizeOfRawData는 영역의 크기를 나타낸다는 공통점이 있으나 라운드 업된 크기와 실제 크기를 나타낸다는 차이가 있다. 만약 섹션의 크기를 조작했다면 위의 두부분 모두 손을 봐야 한다.

 Virtual Address와 Pointer To Raw Data의 값이 다를 수 있다고 했는데, 왜그럴까? 이것은 실행 파일의 크기를 줄이기 위해서이다. 만약 로드 되었을 때 크기가 0x2000 정도인 섹션이 있다고 하자. 그런데 이 섹션은 메모리의 값이 초기화 될 필요도 없고 값도 들어있지 않다면? 실행 시에 영역만 할당해주면 끝이라면? 이런 경우라면 굳이 이 섹션이 실행파일에서 영역을 가지고 있을 필요가 없다. 따라서 Virtual Address는 0이 아닌 값을 갖겠지만 파일 내에 위치를 의미하는 Pointer To Raw Data의 값은 0이 된다.

 즉 실제 파일 내에는 존재하지 않는 영역이 생김으로써 Virtual Address와 Pointer To Raw Data의 값이 달라질 수 있으며, 기타 다른 이유로도 충분히 다를 수 있다. 따라서 실행파일을 조작하기위해서는 Pointer To Raw Data의 값을 위주로 작업을 해야 한다.

 

 Characteristics는 해당 영역의 속성을 나타내는데, WinNT.h에 정의되어있고 아주 흥미로운 값을 가지고 있다.

//      IMAGE_SCN_TYPE_REG                   0x00000000  // Reserved.
//      IMAGE_SCN_TYPE_DSECT                 0x00000001  // Reserved.
//      IMAGE_SCN_TYPE_NOLOAD                0x00000002  // Reserved.
//      IMAGE_SCN_TYPE_GROUP                 0x00000004  // Reserved.
#define IMAGE_SCN_TYPE_NO_PAD                0x00000008  // Reserved.
//      IMAGE_SCN_TYPE_COPY                  0x00000010  // Reserved.
#define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.
#define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.
#define IMAGE_SCN_LNK_OTHER                  0x00000100  // Reserved.
#define IMAGE_SCN_LNK_INFO                   0x00000200  // Section contains comments or some other type of information.
//      IMAGE_SCN_TYPE_OVER                  0x00000400  // Reserved.
#define IMAGE_SCN_LNK_REMOVE                 0x00000800  // Section contents will not become part of image.
#define IMAGE_SCN_LNK_COMDAT                 0x00001000  // Section contents comdat.
//                                           0x00002000  // Reserved.
//      IMAGE_SCN_MEM_PROTECTED - Obsolete   0x00004000
#define IMAGE_SCN_NO_DEFER_SPEC_EXC          0x00004000  // Reset speculative exceptions handling bits in the TLB entries for this section.
#define IMAGE_SCN_GPREL                      0x00008000  // Section content can be accessed relative to GP
#define IMAGE_SCN_MEM_FARDATA                0x00008000
//      IMAGE_SCN_MEM_SYSHEAP  - Obsolete    0x00010000
#define IMAGE_SCN_MEM_PURGEABLE              0x00020000
#define IMAGE_SCN_MEM_16BIT                  0x00020000
#define IMAGE_SCN_MEM_LOCKED                 0x00040000
#define IMAGE_SCN_MEM_PRELOAD                0x00080000
#define IMAGE_SCN_ALIGN_1BYTES               0x00100000  //
#define IMAGE_SCN_ALIGN_2BYTES               0x00200000  //
#define IMAGE_SCN_ALIGN_4BYTES               0x00300000  //
#define IMAGE_SCN_ALIGN_8BYTES               0x00400000  //
#define IMAGE_SCN_ALIGN_16BYTES              0x00500000  // Default alignment if no others are specified.
#define IMAGE_SCN_ALIGN_32BYTES              0x00600000  //
#define IMAGE_SCN_ALIGN_64BYTES              0x00700000  //
#define IMAGE_SCN_ALIGN_128BYTES             0x00800000  //
#define IMAGE_SCN_ALIGN_256BYTES             0x00900000  //
#define IMAGE_SCN_ALIGN_512BYTES             0x00A00000  //
#define IMAGE_SCN_ALIGN_1024BYTES            0x00B00000  //
#define IMAGE_SCN_ALIGN_2048BYTES            0x00C00000  //
#define IMAGE_SCN_ALIGN_4096BYTES            0x00D00000  //
#define IMAGE_SCN_ALIGN_8192BYTES            0x00E00000  //
// Unused                                    0x00F00000
#define IMAGE_SCN_ALIGN_MASK                 0x00F00000
#define IMAGE_SCN_LNK_NRELOC_OVFL            0x01000000  // Section contains extended relocations.
#define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  // Section can be discarded.
#define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.
#define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.
#define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.
#define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.
#define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.
#define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.

  중요한 플래그 별로 의미를 보면 아래와 같다.

  • IMAGE_SCN_CNT_CODE : 섹션에 코드가 포함되어있음. IMAGE_SCN_MEM_EXECUTE와 보통 같이 지정됨
  • IMAGE_SCN_CNT_INITIALIZED_DATA : 섹션이 초기화된 데이터를 포함하고 있음
  • IMAGE_SCN_CNT_UNINITIALIZED_DATA : 섹션이 초기화 되지 않은 데이터를 포함하고 있음
  • IMAGE_SCN_MEM_DISCARDABLE : 섹션이 버려질 수 있음. 한번 사용되고 필요없는 섹션들(relocation 데이터 같은 경우)이 이 속성을 가짐
  • IMAGE_SCN_MEM_SHARED : 섹션이 이 모듈을 사용하는 모든 프로세스에 의해서 공유될 수 있음을 의미
  • IMAGE_SCN_MEM_EXECUTE : 섹션이 실행 가능함
  • IMAGE_SCN_MEM_READ : 섹션이 읽기 가능함
  • IMAGE_SCN_MEM_WRITE : 섹션이 쓰기 가능함

 위 의 값을 보면 섹션에 대한 속성이 미리 정의되어있다는 것을 알 수 있다. 즉 데이터 섹션 같은 경우 IMAGE_SCN_MEM_READ/WRITE 속성을 가지고 있으리라 유추할 수 있고, 코드가 포함된 섹션의 경우 IMAGE_SCN_MEM_EXECUTE 속성을 가지고 있다고 유추할 수 있다.

 섹션의 경우 섹션 이름을 가지고 있는데, VC로 실행파일을 만들면 .text, .data, .idata와 같은 이름의 섹션들이 생긴다. 이름 그대로 코드, 데이터와 같은 정보가 포함된 섹션이라는 것을 알 수 있는데, 여기서 속지 말아야 할 것은 섹션 이름은 권장값이므로 섹션 이름으로 섹션이 포함하는 내용을 판단하면 안된다는 것이다. 특히 파일의 크기를 줄이는 릴리즈 옵션 같은 경우는 섹션들이 합쳐져서 하나의 섹션으로 존재하는 경우도 있기 때문에 섹션 이름을 이용해서 찾아서는 안되며 IMAGE_NT_HEADER에 있는 Data Directory의 값을 참조해서 찾도록 해야 한다.


실제 구현

 설명이 굉장히 길었다. 이제 실제로 이 헤더 정보를 분석하는 간단한 코드를 작성해 보자. RVA와 PointerOfRawData의 관계를 생각하면 약간 복잡한데, 이것은 추후에 다시 보도록 하고 헤더 정보만 표시해 보자.

 분석하는 클래스를 작성하여 간단히 헤더 정보를 추출하고 이를 화면에 표시하는 테스트 프로그램을 작성하였다.

  • PEAnalyzer.h : PE 파일을 분석하는 클래스의 헤더 파일
  • PEAnalyzer.cpp : PE 파일을 분석하는 클래스의 소스 파일
  • main.cpp : 실제 사용하는 예제

 

 아래는 실행 결과이다.


<IMAGE_DOS_HEADER의 값>


<IMAGE_SECTION_HEADER의 값>

 

마치면서...

 지금까지 PE 파일의 헤더 정보에 대해서 알아보았다. 다음에는 실행에 필요한 함수들과 외부로 노출된 함수들을 찾는 것에 대해서 알아보자.

2007/10/09 01:00:16 추가 

 아래는 Win CE용 실행파일 헤더를 분석한 부분이다. IMAGE_FILE_HEADER의 Machine 필드 부분이 다른 것을 알 수 있다. 


첨부


2009. 5. 19. 15:17

[프로그래밍 일반] PE구조란?

 PE(Portable Excutable)란 1993년 Microsoft사에서 표준화한 형식으로 이식성이 좋은(Portable) 실행구조(Excutable)를 의미하며 32bit 혹은 64bit의 Window OS에서 사용되는 실행 File, Object code, DLL등이 이러한 구조를 갖는다.

 PE는 API Export, Import table, data를 관리하기 위한 Resource, TLS(Thread Local Storage)들이 포함된 구조체로 이루어져 있다.

 그림에서 SESSION 영역을 보면 여러 영역들이 있는데 이중 전역변수는 .data영역에 위치하며 output 함수처럼 사용자가 만든 함수들은 .text영역에 들어간다 그리고 지역변수는 TLS에 들어가게 된다. 이처럼 PE구조에는 실행file에서 필요한 모든 정보들이 들어가 있다.

2009. 5. 14. 17:27

[어셈블리어] push와 pop의 구분동작

push eax
 1. --esp
 2. mov [esp], eax

스택 포인터를 하나 감소 시키고(즉, 스택포인터를 올리고) 값을 넣는다.(스택은 아래서부터 저장되므로 스택이 쌓일수록 스택 포인터가 가르키는 주소의 숫자는 감소한다.)


pop eax
 1. mov eax, [esp]
 2. ++esp

 스택 포인터가 가르키는 메모리 주소의 값을 레지스터에 저장하고, 스택포인터를 증가 시킨다.(즉, 스택포인터를 내린다.)
2009. 5. 14. 14:07

[어셈블리어] PUSHA와 POPA

PUSHA : Push All
스택에 EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순으로 모두 저장한다.

POPA: Pop All
스택에서 EDI, ESI, EBP, EBX, EDX, ECX, EAX 순으로 꺼낸다.
(ESP는 복원하지 않는다.)
2009. 5. 11. 16:10

[어셈블리어] 데이터 전송 명령어 mov, movzx, movsx

MOV 명령

소스 피연산자로부터 도착점 피연산자로 데이터를 이동시킨다.

데이터 전송 명령으로 알려진 이 명령은 실질적으로 모든 프로그램에서 사용된다.

이 명령의 기본 포멧은 첫 번째 피연산자가 도착점이고 두 번째 피연산자가 소스이다.

MOV destination,source

오른쪽에서 왼쪽으로의 데이터 이동은 C++ 이나 자바에서의 할당 문과 유사하다

dest=source;

[거의 모든 어셈블리 언어 명령에서,

왼쪽 피연산자는 도착점이고,

오른쪽 피연산자는 소스이다.]

MOV는 피연산자의 사용에 있어서 다음의 규칙만을 따르면 된다.

1. 피연산자는 같은 크기여야 한다.

2. 피연산자는 모두 메모리 피연산자일 수 없다.

3. CS, EIP, IP는 도착점 피연산자가 될 수 없다.

4. 즉시값은 세그먼트 레지스터로 이동될 수 없다.

 

세그먼트 레지스터는 프로그램이 실제 주소 모드로 동작될 때만 사용할 수 있다.

CS가 도착점 피연산자로 사용될 수 없다는 것을 제외하고 다음과 같은 옵션이 가능하다.

MOV r/m16, sreg

MOV sreg,r/m16

 

메모리에서 메모리로 MOV 명령은 하나의 메모리 위치에서 다른 위치로 데이터를 이동시키는 데 사용할 수 없다.

대신에 도착점 피연산자로 이동하기 전에 소스 피연산자를 레지스터로 이동시킬 수 있다.

.data

var1 WORD ?

var2 WORD ?

.code

mov ax,var1

mov var2,ax

 

변수나 레지스터로 이동될 때 정수 상수가 몇 바이트가 필요한지를 먼저 고려해야만 한다.

 

작은 피연산자에서 큰 피연산자로 정수를 복사하기 위하여 MOV 명령을 사용하는 것은 오류를 발생시킨다.

그러나 때때로 그렇게 할 필요성이 있을 때가 있다.

count(부호가 없는 16비트)를 ECX(32비트)로 옮겨야 한다고 가정하자. 간단한 해결방법은 ECX를 0으로 지정하고 난 후 count를 CX로

옮기는 것이다.

.date

count WORD 1

.code

MOV ecx, 0

MOV cx, count

 

만약 부호가 있는 정수 -16을 같은 방법으로 시도한다면 어떤일이 일어나는가?

.data

signedVal SWORD -16                          ; FFF0h(-16)

.code

MOV ecx, 0

MOV cx, signedVal                              ; ECX = 0000FFF0h (+65520)

 

ECX(+65520)값은 -16 과 완전히 다른 값이다. 반면에, ECX를 FFFFFFFFh로 채운 후 signedVal을 CX에 복사한다면 마지막 값은 올바를 것이다.

 

MOV ecx, 0FFFFFFFFh                         //0FFFFFFFFh

MOV cx, sigendVal                              ; ECX=FFFFFFF0h

 

이것은 부호가 있는 정수를 다룰 때 문제를 야기한다. 도착점 피연산자를 어떻게 채울지 결정하기 위하여 그 수가 양수인지 음수인지를 점검해야 하는 것은 불편하다. 다행스럽게도 인텔 공학자들은 인텔 386 프로세서를 설계할 때 이 문제를 고려하였고 부호가 없는 정수와 부호가 있는 정수를 다루기 위한 명령어로 <OVZX와 MOVSX 명령어를 도입하였다.

예제)  aaa.asm 파일

TITLE move
INCLUDE Irvine32.inc
.data
             signedVal SWORD -16
.code
main PROC
             mov ecx,0FFFFFFFFh
             mov cx,signedVal
             call DumpRegs
             exit
main ENDP
END main

 

MOVZX 명령 (부호가 없는)

소스 피연산자를 도착점 피연산자로 복사하고 그 값을 16비트나 32비트로 확장한다. 이 명령은 부호가 없는 정수에만 사용된다.

3개의 변형이 가능하다.

 

MOVZX      r32, r/m8                                    //[32비트 범용 레지스터], [8비트 피연산자,8비트 범용레지스터나 메모리 바이트]

MOVZX      r32,r/m16

MOVZX      r16,r/m8

 

첫 번째 피연산자는 도착점이고 두 번째가 소스이다. 도착점은 레지스터여야만 한다.

다음 그림은 8비트 소스 피연산자가 제로 확장되어 16비트 도착점으로 이동하는 모습을 보여 준다.

 

 


다음 예는 피연산자가 모두 레지스터일 때 크기의 변형을 보여 준다.

MOV bx,0A69Bh

MOVZX EAX, BX                                     ; EAX = 0000A69Bh          //16비트 BX의 값이 이동

MOVZX EDX, BL                                     ; EDX = 0000009Bh           //8비트 BL(BX의 하위 8비트)값이 이동

MOVZX CX, BL                                       ; CX = 009Bh                   //8비트 BL값이 이동

 

다음의 에는 소스를 메모리 피연산자를 사용한 경우로서 같은 결과를 만든다.

 

.data

byte1 BYTE 9Bh

word1 WORD 0A69Bh

.code

MOVZX EAX, word1                       ; EAX = 0000A69Bh

MOVZX EDX, byte1                        ; EDX = 0000009Bh

MOVZX CX, byte1                          ; CX = 009Bh

 

MOVSX 명령 (부호가 있는)

 

소스 피연산자의 내용을 도착점 피연산자로 복사 후 16비트 혹은 32비트로 값을 부호 확장한다.

이 명령어는 부호가 있는 정수에만 사용된다. 3개의 변형이 있다.

 

MOVSX r32, r/m8

MOVSX r32, r/m16

MOVSX r16, r/m8

 

작은 피연산자의 최상위 비트를 취하고 이를 도착점 피연산자의 확장 비트에 반복적으로 복사하여 부호 확장을 한다.

예를 들어, 8비트 값 10001111b 가 16비트 도착점으로 이동한다면, 하위 8비트는 그대로 복사된다. 다음에 다음 그림에서

보는 것처럼 소스의 최상위 비트는 도착점의 상위 8비트에 복사된다.

 


다음의 예는 피연산자가 모두 레지스터일 때의 경우이다.

 

MOV BX, 0A69Bh

MOVSX EAX, BX                                       ; EAX = FFFFA69Bh

MOVSX EDX, BL                                       ; EDX = FFFFFF9Bh

MOVSX CX, BL                                         ; CX = FF9Bh

 

예제)  bbb.asm 파일

TITLE move
INCLUDE Irvine32.inc
.code
main PROC 
             MOV BX, 0A69Bh
             MOVSX EAX, BX
             MOVSX EDX, BL
             MOVSX CX, BL
             call DumpRegs 
             exit
main ENDP
END main

2009. 5. 8. 15:01

[어셈블리어] 곱셈 - MUL, IMUL

mul source

mul(부호없는 곱셈)
source 자리에는 레지스터나 주소가 올 수 있으며, 즉시값(상수)은 올 수 없다.
source에 1바이트가 오면 AL(1바이트)과 곱해서 AX(2바이트)에 저장된다. source에 2바이트가 오면 AX와 곱해서 DX:AX에 저장한다. source가 4바이트라면, EAX와 곱해서 EDX:EAX에 저장된다.
(1자리의 숫자 두개를 곱하면 최고 2자리의 숫자가 나올 수 있다. 따라서 1바이트를 2개 곱하면 2바이트의 저장공간이 필요하다.)



imul  dest, source1
imul  dest, source1, source2

imul(부호있는 곱셈)
dest
source1
source2
Action

reg/mem8

AX = AL*source1

reg/mem16

DX:AX = AX*source1

reg/mem32

EDX:EAX=EAX*source1
reg16
reg/mem16

dest *= source1
reg32
reg/mem32

dest *= source1
reg16
immed8

dest *= immed8
reg32
immed8

dest *= immed8
reg16 immed16

dest *= immed16
reg32 immed32

dest *= immed32
reg16 reg/mem16
immed8
dest=source1*source2
reg32 reg/mem32 immed8 dest=source1*source2
reg16 reg/mem16 immed16 dest=source1*source2
reg32 reg/mem32 immed32 dest=source1*source2

reg = 레지스터, mem = 메모리 주소내의 값, immed = 즉시값(상수)
2009. 5. 7. 19:29

QPTS 2.7


뭐...알만한 사람들은 다 아는 프로그램=ㅅ=;
2009. 5. 7. 19:27

네온사인폰 양방향 통신하기(동영상전송)

출처: 스사모

네온사인 완전정복 메뉴얼

[너희가 아무리 막아도 나는 뚫는다 Ver1.00]

 

안녕하세요. S110 양방향 뚫기 강좌 후 내내 쓰다가 2년만에 네온사인으로 바꾸고

다시 돌아온 로쏘사미입니다~^-^; 요새 네온사인폰 클럽들을 보니 다들 뚫지 못하시고

계신거
같아서..쓰는게 귀찮아 이래저래 미루다가...ㅜ이렇게 매뉴얼을 작성하게 되었습니다.
 
이미 기존에 뚫고 알고 계신분들도 계신걸
로 아는데..아직까지 올려주시는 분들이 없어,

조금이나마 힘써 매뉴얼을 쓰게 되었으니..많은 분들께 도움되시길 바랍니다^_^

 

네온사인 완전정복하기에 들어가기에 앞서 몇 가지 주의사항입니다. 반드시 읽고 지켜주세요.

1. 반드시 네온사인폰(U300K)드라이버(isky.co.kr) 및 QPST 2.7(네이버서 찾아보세요)이 컴퓨터에
 설치되어 있어야 합니다. (QPST 2.7 다운)

2. 익숙해지기 전에는 꽤 시간이 들어가는 작업입니다. 안된다 짜증내지 말고 천천히 해보시기 바랍니다.

3. 이 방법은 엄연히 제조사에서 금지된 방법이므로, QPST를 통한
휴대폰 조작을 하다가
발생한 모든 사고에 대해서는 본인이 책임을 지셔야 함을 꼭 염두하시기 바랍니다.

4. 이 양방향 메뉴얼을 통해 막혔던 할 수 있는 대표적인 것들

-데이터매니져(이하 데매)에서 막혔던 파일들의 양방향 전송 및 파일크기제한해제
-인터넷 등에서 구한 휴대폰 게임 입력 가능
-고용량의 원음벨 및 동영상, 동영상벨, 동영상바탕화면 등 사용가능

5. 네온사인의 내부메모리 남은용량을 확인후 항상 사용하시기 바랍니다.(휴대폰←,5,3)

6. 파일을 복사할 경우에는 USIM칩 때문에 파일 복사 및 수정이 금지되어 있는 폴더가 있으므로 폰을 끄고
 USIM을 제거한 상태로 사용
바랍니다.

7. 기존에 QPST를 사용하신 분들이라도 네온사인이 설정이 좀 틀린부분이 있기에 첨부터 빠트리지 말고
 읽어보셔야 제대로 사용하실수 있습니다.

8. 파일을 복사하기전에는 꼭 백업해서 문제 발생시 복구 할수 있도록 해주세요~

9. 메뉴얼 작성한 제가 말씀드리기엔 아이러니하지만 게임 및 라이브벨, MP3, 동영상등의
불법복사는
모바일업체 및 휴대폰업체의 상품개발에 의욕상실의 원인이 되므로 무차별적인
컨텐츠 입력은
자제해주시기 바랍니다. 원하는 컨텐츠가 많지만 만만찮은 가격으로 인해 사용하지 못하실 분들이, 잠시
경험해 보시고
맘에 드는 컨텐츠는 꼭 구입하셔서 모두에게 이득이 될 수 있길 바랍니다


그럼 이제 양방향 전송을 위한 핸드폰 연결부터 시작하겠습니다.

1. 휴대폰을 열어 ←,4,0을 입력후 비밀번호 000000을 입력합니다. 다음 [2.통신환경설정]을 선택하여
DM포트,DS포트를 모두 USB로 바꿔줍니다.(통신속도는 최고로 선택)

2. 휴대폰과 컴퓨터를 USB로 연결합니다.(이때부턴 SIM카드를 뺀상태로 연결하시는게 좋습니다).
그리고 제어판의 시스템-하드웨어-장치관리자로
들어가서 포트(COM 및 LPT)를 클릭합니다.


여기서 COM#의 번호를 확인합니다. (포트번호를 외워둘것.제 경우에는 COM 4)



또한 포트를 더

블클릭하여 등록정보의 포트 설정에서 비트/초를 128000으로 설정합니다.
(대부분의 분들이 이부분 설정을
안하시고는 엄청 느리게 사용하고 계시더군요.)

3. 이제 QPST Configuration를 찾아서 실행합니다.


우측하단의 ADD New Port를 클릭한후 아까 외워둔 COM# 를 입력합니다.
제 경우에는 제 포트였던 COM4를 입력하는 모습입니다

4.입력이 제대로 되었다면 이제 QPST EFS Explorer를 실행시킵니다.



이러한 화면이 나오면 거의 성공한겁니다.SPC는 000000으로 놓고 OK를 선택합니다.

5.연결이 제대로 되었다면 /라는 폴더만 보일껍니다.


여기서 preferences 아이콘을(톱니) 클릭-Directories를 선택후 디폴트 디렉토리에
 /.  이라고 입력하고 확인을 선택합니다.


6.이런 화면이 나오셨다면 일단 휴대폰과의 기본적인 연결이 완료가 된겁니다.
축하드립니다~!!



그럼 이제 양방향 전송을 배우셔야 할텐데요.
네온사인은 자신이 어떤걸 할지에 따라 하는법이 상당히 차이가 납니다.
접속하는 폴더도 전부 틀리기 때문에(아래 설명드림) 목적에 따라 폴더에 접속
하시기 바랍니다.


먼저 동영상을 넣는법을 알려드리겠습니다

1. 일단 휴대폰으로 짧은 동영상을 아무렇게나 하나 찍어 저장합니다.
2.그리고 휴대폰 종료후 SIM카드를 뺀 후 다시 켜고 위의 QPST 연결하기를 실행합니다.
3. 위의 연결하기 5번에서 기본디렉토리 폴더를 /. 가 아닌 /skp로 선택합니다.


이렇게 나오면 됩니다~

4.위의 그림에서 skp/u/mdm으로들어갑니다.
엄청많은 폴더들이 나올겁니다. 이게 모두 각각의 메뉴에서 저장하는 파일폴더들입니다.
그 중에서 movie 폴더를 선택합니다.

제대로 하셨다면 위의 그림처럼 아까 저장한 동영상 파일이 보일껍니다.

5. 스사모 홈피-자료실에서 mod,3gp 자료실의 아무 동영상이나 받습니다.
자기가 원하는 동영상을 직접 인코딩해서 만들어도 좋을테구요.

6.그리고나서 파일명은 위 폴더의 파일명과 동일하게 만듭니다.확장자는 k3g로 바꾸시구요.
(확장자가 안보이시면 도구-폴더옵션-보기-알려진파일 확장자 체크해제하시면 됩니다)
위의 경우 저는 받은 동영상 파일을 mov0000_080726015137.k3g 로 바꿨습니다.
그리고 그대로 저 폴더에 마우스로 드래그하여 복사합니다.
붙여넣겠냐고 물으면 예스하시구요.

6.다되었습니다! 이제 QPST를 끄고 폰 재부팅여부를 물으면 YES를 하고 SIM카드를
꽂아 재부팅을 시킵니다.
동영상 폴더에 가면 짜잔- 동영상이 잘 실행이 됩니다.
연인 동영상 만들어 바탕화면에 깔수도 있고 뮤비를 받아서 동영상 벨로 사용할수도 있습니다.
즐감하시면 됩니다~^_^

7. 여기서 잠깐~. 그런데 동영상을 바꾸고 나시면, 휴대폰 동영상'목록'에서 볼때는 
해당 동영상의 엉뚱한 그림이 미리보기로 나와있죠?
그건 동영상 섬네일포토를 네온사인이 또 따로 저장하는 관계로..ㅡㅡ;
굳이
수정을 원하시는분은 동영상을 캡쳐하시던지,혹은 관련된 사진을 72x72픽셀의 jpg로 만드신후
동영상을 넣었던 것과 같은 방법으로 movie/tmn 폴더에 tmn이란 확장자로 변경후
넣어주시면 됩니다.
여기서 중요한건 그 동영상과 같은 이름이어야 한단 거구요.
제경우에는 귀찮아서 그냥 동영상 미리보기 스타일을 목록보기로 바꿔버리니까
신경도 안쓰이고 좋더라구요..



 이런식으로 하시는법을 한번만 해보시면 다른 파일들을 전부 응용하셔서 하실수 있을꺼라 생각합니다.
여기서 중요한건 그래서 /skp/u/mdm 폴더에서 건드려도 되는 폴더가 뭐냐..
라는건데요..그래서 정리했습니다.
캐노가다 버젼-_-로쏘사미의 네온폴더목록~!!두둥..

폴더명 폰 맵 폰 메뉴명
폰 확장자 컴 확장자

/callrec ↓,6,3 통화녹음 파일 O

통화내용을 녹음한 파일 폰->PC로 추출만 할 것
/coupon ↓,3,7 모바일쿠폰 X

무선인터넷으로 다운받는 모바일 쿠폰
/dotled ←,2,2,2 나만의 SKY ICON !

상하좌우 키조작을 통해 만드는 ICON
/dotmsg ←,2,2,3 ICON 메시지 !

알파벳을 입력해서 만드는 ICON
/flashdial ↓,3,11 플래시다이얼 !

전화걸 때 나오는 숫자입력 효과 아직 새로 나온 것 없음
/flahsmenu ↓,3,10 SKY 메인메뉴 !

스카이 메인메뉴 스타일 아직 새로 나온 것 없음
/livesbell ↓,3,3,2 리얼벨 X

128화음수준의 원음벨 필요없음(일반벨에서 대체 가능)
/livescreen ↓,3,4,1 리얼스크린 X

움직이는 배경화면 필요없음(동영상에서 대체 가능)
/membercard ↓,3,8 멤버스카드 X

KTF 모바일 멤버쉽카드 바코드
/mmsemoticon 편지,4,5 이모티콘 ? x
SMS 축하용 문자
/mmsfont 편지,4,4 글꼴 ? x
MMS 발신시 사용 글꼴
/mmsimage 편지,4,2,1 카드/사진 O x jpg MMS 수신.발신 저장된 이미지
/mmsmelody 편지,4,6 사운드 O x
MMS 수신.발신 저장된 배경음
/mmsmovie 편지,4,2,2 이미지/영상 O x k3g MMS 수신.발신 저장된 영상
/movie  ↓,2 동영상 % k3g k3g 핸드폰 동영상 동영상벨,대기화면으로도 사용가능
/movie/tmn ↓,2 동영상 % tmn jpg 동영상에 관련한 썸네일포토 위 동영상파일의 미리보기용 사진
/mp3 ↓,3,2 MP3 ! dcf mp3 전국민이 다 아는 MP3파일 전화벨로는 사용 불가능
/mp3bell ↓,3,3,1 MP3벨


벨로 사용가능한 MP3
/msgring ↓,3,5 메세지링 O

메세지 도착시 수신음
/musicroom ↓,3,6 노래방 ?

노래방 아직 새로 나온 것 없음
/mybell ↓,3,3,3 일반벨 % mmf mmf MMF로 다운받은 일반 벨소리 650KB이상 mmf파일 사용가능
/myflash ↓,3,9 나만의 플래시 !
eba,swf eba나 swf로 만들어진 배경화면
/mypic ↓,3,4,2 그림 !
ddf 각종화면에 사용가능한 그림
/photo ↓,1 사진 !
jpg 각종화면에 사용가능한 사진폴더
/subway ↑,3,6 지하철 노선도 !

전국 지하철 노선도 아직 새로 나온 것 없음
/tdmbcapture DMB,3,1 캡쳐파일 O

DMB방송 캡쳐한 파일 폰->PC로 추출만 할 것
/tdmbradio DMB,3,3 녹음파일 O

DMB라디오 녹음한 파일 폰->PC로 추출만 할 것
/tdmbrec DMB,3,2 녹화파일 O

DMB방송 녹화한 파일 폰->PC로 추출만 할 것
/text ↓,7,2 텍스트파일 !
txt 폰으로 읽고 싶은 소설,책 파일
/theme

X

폰상태 저장된 테마
/vcmovie ↓,8,1 녹화파일 O

영상통화 내용을 녹화한 파일 폰->PC로 추출만 할 것
/vcpicture ↓,8,2 캡쳐파일 O

영상통화 내용을 캡쳐한 파일 폰->PC로 추출만 할 것
/voicerec ↓,6,2 녹음파일 O

음성녹음한 파일 폰->PC로 추출만 할 것


가운데의 기호 표시들은

O=파일을 그냥 추가하여 사용가능
%=기존 설명한대로 하나 만들어놓고 파일 덮어씌우는 방식으로 사용
!=데매나 도시락플레이어로 사용가능(힘들게 QPST로 하지 마시란 말씀)
X=바꾸거나 건들지 마세요~
?=직접 해보지 못했으나 가능하다 생각되는 것들

입니다.

저도 잘 모르는 폴더는 빼놨구요. 일단 위의 것들로도
게임을 제외한 모든 양방향 통신을 용량의 제한없이 할 수 있구요.
고용량의 원음 벨을 드디어 사용할 수 있게됩니다.~
그동안 650kb 용량제한에 힘들어하신분들, 동영상 안들어가서 고생하신분들...
조금이나마 도움이 되기를 바랍니다~!!


p.s 게임넣는 방법은 qpst 연결 후 디폴트 폴더만 /brew로 바꿔준후 brew/mod/wipiplayer/w/apps
에 들어가셔서 기존에 스사모나 네이버에 나와있는 KTF,wipi게임 넣는 방법들 쳐서 그거랑 동일하게
하시면 됩니다~! 잘 모르시겠으면 게임 버젼도 제가 나중에 따로 또 올려드릴게요..ㅠ
오늘은....너무 길게썼더니 넉다운 되버렸습니다...ㅠ


'기타' 카테고리의 다른 글

NDS의 스펙  (0) 2009.08.31
[기타] 다중지능 테스트 결과  (0) 2009.08.04
블로그에 국기 카운터(flag counter)를 달자.  (0) 2009.07.22
티스토리에 UNIQLOCK 설치하기  (2) 2009.05.04
2009. 5. 6. 17:28

[어셈블리어] 나눗셈

1. 나눗셈 연산의 피젯수는(32bit의 나눗셈을 가정) 항상 edx:eax 이다.
2. cdq 는 나눗셈을 위해 피젯수의 사이즈를 확장하는 것이다.


나눗셈연산(div, idiv)은 eax와 edx에 의해서만 이루어집니다.
- 피젯수(나눔을 당하는 수) 는 eax, edx에만 들어갈 수 있다는 얘기에요
16 / 5 연산을 한다고 가정해 봅시다.

16과 5 둘다 32bit data라고 가정하구요

그럼 일단 eax에 16을 넣습니다. 그 다음 ebx(다른레지스터나 메모리도 상관없음)에

5를 넣습니다. 그 다음 div 연산을 하면.........될것 같지만 안됩니다..

일반적으로 제수(여기서는 5)가 32bit이면 피젯수(여기서는 16) 는 64bit가 되어야

32bit 값을 가지는 몫을 얻을 수 있습니다.

그래서 피젯수의 bit를 확장 시켜주는것이 바로 cdq 연산입니다

32bit 크기의 eax의 값을 64bit의 값인 edx:eax로 만들어줍니다.

여기서 edx는 상위자리가되고 eax는 하위 자리가 되죠

자..그럼 cdq 연산까지 끝났으면 edx:eax에 16이 들어가있고 ebx에 5가 들어있겠네요

그럼 idiv연산을 해봅시다(div는 부호가없는 나눗셈 idiv 부호가 있는 나눗셈)

그럼 몫과 나머지가 나와야 하겠죠? 그 결과는 다시 eax와 edx로 들어가는데

eax에는 몫이, edx에는 나머지 부분이 들어갑니다.


출처: 내 심장이 0hz가 되는 순간까지...  (http://zerohz.tistory.com/61)