위치로 진입 점

마지막 업데이트: 2022년 5월 27일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
main()은 함수의 구조를 하고 있습니다. 보통 함수라고 불리는 용어는 클래스의 멤버가 되는 경우 메서드(Method) 혹은 특정 클래스의 멤버 메서드라고 부를 수 있습니다.

Media Center에서 사용자 지정 메뉴 모양 및 느낌 얻기

MCE7 Reset Toolbox를 가장 좋아하는 용도 중 하나는 사용자 정의 메뉴 스트립을 만드는 것입니다. 이 응용 프로그램의 주요 기능 중 하나를 고려하면 새로운 HTPC로 작업 할 때 가장 먼저해야 할 일입니다. 사용하지 않는 스트립을 제거하고 사용하는 스트립을 사용자 정의하거나 새 스트립과 엔트리 포인트를 추가하여 Media Center를 이미 사용했던 것보다 훨씬 유용하게 사용할 수 있습니다.

예를 들어 TV 녹화 및보기 용 Media Center 만 사용하는 위치로 진입 점 경우 다른 모든 메뉴 모음을 완전히 제거 할 수 있습니다. 당신이 그들을 위해 쓸모가 없다면 왜 거기에있게합니까?

또 다른 예는 HTPC 에서 실행하려는 게임이나 기타 소프트웨어에 대한 사용자 지정 진입 점을 추가하는 것입니다. 이것은 대부분의 HTPC 사용자가 권장하는 관행은 아니지만 응용 프로그램에서 허용합니다.

각 유형의 메뉴 사용자 정의를 수행하는 방법에 대해 살펴 보겠습니다. 제거, 사용자 정의 및 추가 기능에 따라 이러한 기능이 손상되었습니다. 당신이하고자하는 것에 관련된 부분으로 자유롭게 이동할 수 있습니다.

진입 점 및 메뉴 스트립 제거

Media Center의 다른 기능을 제거 할 때는 말할 것도 없습니다. 일단 MCE7 Reset Toolbox를 열면, 응용 프로그램 상단의 "시작 메뉴"탭을 클릭하기를 원할 것입니다. 현재 Media Center 메뉴가 표시됩니다. 각 메뉴 항목과 스트립 옆에는 각 항목을 제거하는 데 사용할 수있는 체크 박스가 있습니다.

항목을 제거하려면 해당 항목 옆에있는 상자를 선택 취소하십시오. 이것은 개별 항목과 전체 스트립 모두에 적용됩니다. 이렇게하면 항목이 계속 남아있어 언제든지 다시 추가 할 수 있으며 나중에 다시 만들 필요가 없습니다.

확인란의 선택을 취소하면 수행 한 작업을 저장하는 것이 좋습니다. 이 시점에서 선택하지 않은 항목은 더 이상 Media Center에 표시되지 않습니다.

매번 옆에 빨간색 "X"가 표시됩니다. 원하는 경우 엔트리 포인트를 완전히 삭제하는 데 사용할 수 있습니다. 이것은 나중에 다시 원할 수도 있으므로 추천하는 것이 아닙니다. 전체 지점을 다시 만드는 것보다 상자를 다시 선택하는 것이 훨씬 쉽습니다.

진입 점 및 스트립 추가

드래그 앤 드롭만큼 쉽게 사용자 정의 메뉴 스트립과 엔트리 포인트를 추가 할 수 있습니다. 더 복잡해질 수도 있지만 쉬운 일부터 시작합시다. 진입 점을 추가하려면 맨 아래 메뉴로 가서 이미 사용할 수있는 항목 목록을 볼 수 있습니다. 이 목록에는 미리 설치된 Media Center 응용 프로그램과 미디어 브라우저와 같은 타사 응용 프로그램이 많이 포함되어 있습니다.

이 포인트를 추가하려면 원하는 포인트로 드래그하기 만하면됩니다. 일단 거기에 다시 주문하고 이름을 바꿀 수 있습니다.

사용자 정의 스트립을 추가하려면 응용 프로그램 상단의 리본에서 선택 도구를 사용합니다. 이 버튼을 클릭하면 사용자 정의 메뉴가 표준 스트립 하단에 추가됩니다. 이제 이름을 변경하거나 사용자 정의 타일을 새 스트립에 추가 할 수 있습니다. 메뉴에서 스트립을 위 또는 아래로 다른 위치로 옮기고 원하는 위치에 정확하게 배치 할 수 있습니다.

"진입 점"메뉴에 나타나지 않는 응용 프로그램을 추가하는 것은 약간 더 복잡 할 수 있습니다. 응용 프로그램을 실행하기위한 특별 지침뿐만 아니라 PC 에서 응용 프로그램에 대한 경로를 알아야합니다. 원할 경우 아이콘과 이름을 사용자 정의 할 수 있습니다.

진입 점 및 스트립 사용자 정의

마지막으로 검토 할 항목은 실제로 다른 진입 점과 메뉴 조각을 사용자 지정하는 것입니다. 삭제와 함께 MCE7 Reset Toolbox를 사용하여 수행 할 수있는 가장 쉬운 기능 중 하나 일 것입니다.

각 항목 위의 텍스트를 클릭하고 지정하려는 이름을 입력하기 만하면 각 진입 점의 이름을 쉽게 편집 할 수 있습니다. 각 항목을 두 번 클릭 한 다음 항목 편집 화면에서 새 활성 및 비활성 이미지를 선택하여 이미지를 편집 할 수도 있습니다.

원하는 경우 엔트리 포인트를 다른 스트립으로 이동할 수도 있습니다. 이것은 끌어서 놓기 동작이며 매우 간단합니다. 지금까지 발견 한 유일한주의 사항은 네이티브 Media Center 진입 점을 사용자 지정 메뉴 스트립으로 이동할 수 없다는 것입니다.

원하는 모든 변경을 완료 한 후에는 종료하기 전에 새 메뉴를 저장해야합니다. 그렇게하려면 응용 프로그램의 왼쪽 상단 모서리에있는 저장 버튼을 누르십시오. 변경 사항을 저장하려면 Media Center를 닫아야하지만 응용 프로그램에서 경고하므로 걱정할 필요가 없습니다. 그러나 누군가가 Extender에서 Media Center를 사용하는 경우 해당 세션이 종료되므로 변경하기 전에 아무도 TV를 보지 않을 때까지 기다릴 수 있습니다.

모든 것을 너의 것으로 만들기

Media Center에서 시작 메뉴를 편집하는 것은 MCE7 Reset Toolbox의 가장 좋은 기능 중 하나입니다. 그것은 당신이 원하는 메뉴와 당신과 당신의 가족을 위해 완벽하게 기능 할 수있는 메뉴를 만들 수 있습니다.

마지막으로 염두에 두어야 할 점 : 이전에 사용한 다른 Media Center 편집 소프트웨어와 달리 MCE7 Reset Toolbox를 사용하면 언제든지 기본 설정을 복원 할 수 있습니다. 작은 일처럼 보이지만, 실수가 일어나고 기본 설정으로 돌아갈 수 있다는 것이 큰 도움이됩니다.

위치로 진입 점

프로세스 : 실행중인 프로그램

프로그램 : 실행 시에 프로세스를 어떻게 만들지에 대한 광범위한 정보를 담고 있는 파일

1. 바이너리 포맷 식별자 : ELF(Executable and Linking Format) 를 채택

5. 심볼 테이블과 재배치 테이블

6. 공유 라이브러리와 동적 링크 정보

pid_t getpid(void) : 언제나 성공적으로 호출자의 프로세스 ID 를 리턴

pid_t getppid(void) : 언제나 성공적으로 호출자의 부모의 프로세스 ID 를 리턴

세그먼트 : 각 프로세스에 할당된 메모리는 흔히 세그먼트라고 부르는 여러 영역으로 나뉜다.

2. 초기화된 데이터 세그먼트

3. 초기화되지 않은 데이터 세그먼트

4. 스택 : 동적으로 자라고 줄어드는 세그먼트로, 스택 프레임을 담고 있다. 스택 프레임에는 위치로 진입 점 함수의 지역변수, 인자, 리턴 값이 저장된다.

5. 힙 : 실행 시에 동적으로 메모리를 할당하는 영역. 힙의 꼭대기를 프로그램 브레이크라고 한다.

1. 공간적 지역성 : 프로그램이 최근에 접근한 메모리 주소 근처에 접근하는 경향이다.(순차적 처리때문)

2. 시간적 지역성 : 프로그램이 최근에 접근한 메모리 주소에 가까운 미래에 다시 접근하는 경향이다.(루프때문)

argc : 명령행 인자 개수

argv[] : 명령행 인자를 가리키는 포인터의 배열

/proc/PID/cmdline : 프로세스의 명령행 인자 확인

- 대부분의 쉘에서 export 명령을 통해 환경 변수에 값 추가 가능

1. extern char **environ (전역변수로 접근)

2. char *getenv(const char *name) : (값) 문자열을 가리키는 포인터를 리턴하거나, 해당 변수가 없으면 NULL 리턴

3. int putenv(char *string) : 성공하면 0 리턴, 에러가 발생하면 0이 아닌 값을 리턴

- string 인자는 이름=값 형태의 문자열을 가리키는 포인터

4. int setenv(const char *name, const char *value, int overwite) : 성공하면 0을 리턴하고 에러가 발생하면 -1 리턴

- name과 value 가 가리키는 문자열을 그 버퍼에 name=value 형태로 복사

5. int unsetenv(const char *name) : 성공하면 0을 리턴하고 에러가 발생하면 -1 리턴

- 해당하는 변수를 환경 변수 목록에서 제거

6. int clearenv(void) : 성고하면 0을 리턴하고 에러가 발생하면 0이 아닌 값을 리턴

- 환경 변수 목록 전체를 삭제

- 함수간의 비지역 goto가 가능하다. 컴파일러 최적화 관련 문제를 피하려면, 이 함수들을 쓸 때 변수를 volatile 로 선언해야 한다.

위치로 진입 점

잠깐! 현재 Internet Explorer 8이하 버전을 이용중이십니다. 최신 브라우저(Browser) 사용을 권장드립니다!

  • 데이터넷
  • 승인 2021.08.14 11:00
  • 댓글 0

[데이터넷] 전 세계적으로 분산된 서비스 형태로 제공되는 클라우드 기반 SaaS 애플리케이션 도입 위치로 진입 점 기업들이 증가함에 따라 네트워크를 통해 제공되는 모든 서비스와 마찬가지로 클라우드 기반 애플리케이션에도 빠르고 효율적인 핵심 네트워크 서비스인 DDI(DNS, DHCP, IPAM)가 필수다. 사용자를 클라우드에서 가장 가까운 서비스 진입점으로 라우팅할 수 있어야 위치로 진입 점 지연 시간이나 안정성 측면에서 최상의 사용자 경험을 제공할 수 있기 때문이다. 이에 DDI 선도기업인 인포블록스는 중요한 네트워크 서비스를 위한 클라우드 관리 솔루션인 ‘블록스원(BloxOne) DDI’가 주목된다.

비즈니스 및 업무 공간 트랜스포메이션은 전 세계 조직으로 확대되고 있다. 이는 모빌리티, 사물인터넷(IoT), 클라우드의 급격한 확산에 의해 주도되며 비즈니스 수행 방식을 변화시키고 있다.

특히 모바일 장치는 일상의 중요한 부분으로, 언제 어디서나 인터넷 접속이 가능해야 한다. 보안 감시, 제조, 의료 및 스마트 오피스의 IoT는 지속 성장하고 있으며, 비즈니스 크리티컬 애플리케이션과 서비스는 세일즈포스, 마이크로소프트 365, 드롭박스 등과 같은 클라우드 기반으로 빠르게 전환되고 있다.

그 결과 네트워크는 주로 분산된 위치와 해당 위치 내의 장치가 기하급수적으로 증가하는 엣지에서 확장되고 있다. 사용자는 중요한 비즈니스 애플리케이션 및 서비스에 대한 접속 속도 향상, 응답 시간 단축, 안정적인 연결 등을 요구하고 있다.

DDI 프로비저닝·관리 중앙 집중화
그러나 이러한 개선 사항을 평가하고 구현할 시간이나 리소스가 부족한 경우가 많다. 따라서 배포가 용이하고 분산 환경에서 접속, 가용성 및 성능을 개선하도록 최적화된 포괄적인 솔루션이 반드시 포함돼야 한다.

DDI 선도기업인 인포블록스는 이러한 중요한 네트워크 서비스를 위한 클라우드 관리 솔루션을 최초로 선보였다. ‘블록스원(BloxOne) DDI’는 분산된 업무 환경을 갖춘 기업을 위해 DDI의 프로비저닝 및 관리를 중앙 집중화한다.

특히 모바일, IoT, 클라우드 솔루션은 지연 시간에 민감하며 안정적인 DDI 인프라에 크게 의존한다. 블록스원 DDI는 분산 위치의 가시성, 관리 및 제어를 단일 인터페이스로 통합하고, 트래픽을 가장 가까운 SaaS 진입점으로 전달해 애플리케이션 성능을 향상시킨다. 또한 데이터센터와의 연결이 끊어질 경우 로컬 위치의 생존성을 보장한다.

뿐만 아니라 블록스원 DDI는 DNS 서버 그룹 및 액세스 제어 목록(ACL) 템플릿을 활용하고 확장 가능한 마이크로서비스 및 컨테이너 기반 플랫폼을 활용해 구축을 단순화하고 운영을 간소화하며 총소유비용을 최소화한다. 전체 API를 보완해 솔루션 전체에서 지원되는 기능에 안전하게 프로그래밍 방식으로 접속할 수도 있다.

▲ 분산된 지점을 위한 DDI 구성

유연한 API·고가용성·자동화 지원
블록스원 DDI의 모든 UI 기능은 고객이 접근하기 쉬운 API를 통해 지원된다. API 호출은 블록스원 DDI 장치가 아닌 클라우드로 이뤄지고, API를 사용하려면 사용자 자격 증명이 필요하며 해당 권한이 적용된다.

원격지에 있는 2개의 블록스원 DDI는 정보와 역할을 서로 공유하므로 어떤 이유로 다운된 경우 다른 하나의 블록스원 DDI가 해당 사이트의 DDI 서비스에 대한 역할을 위임받게 된다.

뿐만 아니라 ZTP(Zero-Touch Provisioning)는 블록스원 DDI 배포를 자동화하고 대폭 간소화하고, 블록스원 DDI 어플라이언스는 전 세계 모든 원격 사이트에 구성을 인증하고, 다운로드 및 배포한다. 더불어 확장 가능하고, 자동화된 DNS/DHCP 설정을 통해 여러 위치를 효율적으로 처리할 위치로 진입 점 수 있다.

인포블록스 ‘블록스원 DDI’ 핵심 기능
■ 중앙 집중식 운영: 클라우드 관리 인터페이스를 통해 여러 위치에서 자동화된 DNS, DHCP 및 IP 주소 관리, 정책 제어 수행
■ 유연한 패킹: 구독 기반 가격으로 물리적 및 가상 구축 옵션 제공
■ 향상된 최종 사용자 경험: 모든 트래픽이 가장 가까운 애플리케이션 엔드포인트로 전송되도록 로컬 DNS가 확인
■ 로컬 운영 생존성: DNS 및 DHCP 서비스를 통해 재해가 발생하고 WAN 서비스가 중단되더라도 비즈니스 운영을 최소화하고 다운타임 없이 운영 지속
■ 향상된 안정성: 원활하고 중단 없는 작업을 위해 각 사이트에 사용할 수 있는 자동 장애 조치와 DHCP 인스턴스 페어링 구성 가능

인포블록스 ‘블록스원 DDI’ 특징
■ 가상 어플라이언스: VM웨어에서는 가상머신(VM)으로, 도커에서는 컨테이너로 사용 가능
■ 하드웨어 어플라이언스: 인포블록스에서 구매할 수 있는 하드웨어 어플라이언스 정격 용량 최대 5000QPS 및 50LPS
■ 스케일: 하드웨어 어플라이언스, VM, 컨테이너로 수평 확장 가능
■ DNS: DNS 서버는 호스트명을 IP주소로 확인하고 초당 500개의 쿼리와 재귀, 포워딩, 세컨더리 인증 DNS 및 DNS 서버 그룹과 ACL 템플릿 지원
■ DHCP: DHCP 서버는 IP 주소를 할당하고 초당 5개의 할당과 효율적인 IP 사용을 위한 할당 관리 지원
■ IP 주소 관리: IP 주소 관리는 프라이빗/퍼블릭 네트워크 IP 공간, 기기와 관련 데이터에 대한 계획, 추적, 관리 자동화

[연재] 코틀린 프로그래밍 - IntelliJ IDEA 프로젝트 구성하기

Note:이 연재는 'Do it! Kotlin Programming'에서 일부의 내용을 연재하고 있습니다. 완전한 내용은 책을 참고해 주세요!

코틀린 프로젝트 시작하기

Hello Kotlin! 프로젝트 만들기

설정을 마치면 다음과 같은 화면이 나타납니다. 이제 프로젝트를 만들 준비가 된 것이죠. 그러면 본격적으로 첫 번째 프로젝트를 만들어 볼까요? 앞으로 실습을 진행하면서 여러 번 프로젝트를 생성하기 때문에 이 내용을 잘 익혀둡니다.

Tip:[Import Project]는 다른 개발 도구의 프로젝트를 IntelliJ IDEA용으로 가져오는데 사용하고, [Open]은 현재 작업공간의 프로젝트를 여는 데 사용합니다. [Check out from Version Control]은 버전 관리 저장소로부터 소스를 가져올 수 있습니다. IntelliJ IDEA는 자주 업데이트 되므로 [Configure]를 통해 업데이트 내용을 반영하거나 기타 설정을 할 수 있습니다.


코틀린 프로젝트 만들기

1. Welcome to IntelliJ IDEA 화면에서 [Create New Project]를 눌러 새 프로젝트를 만들겠습니다. [Create New Project]를 누르면 다시 새로운 프로젝트 설정 화면이 나타납니다. 가장 먼저 해야 할 일은 왼쪽의 [Kotlin]를 선택하고 오른쪽의 [Kotlin/JVM]을 선택한 다음 [Next] 버튼을 누릅니다.

Note: 쾌적한 코딩을 위해 글꼴 설정은 기본!

본격적인 코딩을 시작하기 전에 가독성이 높은 코드의 글꼴과 크기를 변경해 보겠습니다. 프로그래밍을 할때는 한 글자만 틀려도 작동하지 않기 때문에 숫자 0과 영문 O를 구분하거나 1과 소문자 l을 구분하는 것이 중요합니다. 이것을 명확히 구분해주는 글꼴을 사용해 봅시다.
설정을 위해 [Ctrl + Alt + S]를 누르거나 [File → Settings]를 눌러 설정 화면을 열어볼까요? 설정 화면에서 왼쪽 상단의 검색 상자에서 font를 입력하면 왼쪽 메뉴에 [Editor > Font] 메뉴로 이동합니다.

최근 언어의 소스 코드에서 사용하는 여러가지 심볼인 powerline 심볼을 추가했으며 ligature 문자를 지원하여 특수 문자의 구분도 명확하게 할 수 있어 매우 편리합니다. 예를 들어 람다의 화살표식(->)이 심볼로 들어 있습니다. 마우스 휠로 글꼴 크기를 조정하면 매우 편리하겠죠. [General]을 누른 다음 위치로 진입 점 Change font size (Zoom) with Ctrl + Mouse Wheel 체크 박스를 선택합니다. 그러면 [Ctrl] 키와 마우스 휠로 글자 크기를 마음대로 확대, 축소할 수 있습니다.

첫 프로그램의 코딩

편집기 화면에 main을 입력하고 [Tab] 키를 위치로 진입 점 누르면 자동으로 메인 함수가 만들어집니다. 이를 자동 템플릿 완성 기능이라고 부릅니다. 앞으로 자주 사용하게 될 기능이니 꼭 익숙해 지길 바랍니다.

혹은 다음과 같이 main() 함수의 매개변수를 사용하지 않는 경우 생략할 수도 있습니다.

다음과 같이 메인 함수에 출력문을 작성해 봅시다.

안녕 코틀린! HelloKotlin.kt

코드를 입력했으니 이제 실행을 해야겠죠? 상단의 메뉴 [Run → Run…]을 찾아 눌러 실행합니다. 윈도우에서 Ctrl + Shift + F10 키를 눌러 프로그램을 실행할 수도 있습니다. 이후Debug 선택 화면에 실행 설정이 나타나면서 녹색 삼각형 버튼을 누르고 실행할 수도 있습니다.
▶ 더 간편한 방법으로 화면 상단에 보이는 [▶] 버튼을 눌러도 됩니다.

Tip:각 실행창의 단축키 이용

편집 화면의 각 창은 단축키를 가지고 있습니다. 왼쪽 제일 하단부의 아이콘을 클릭하면 각 창의 단축키를 볼 수 있습니다. 예를 들어 프로젝트(Project) 창은 윈도우에서는 Alt + 1, 맥에서는 Cmd + 1로 이동할 수 있습니다. 각 도구 창의 단축키는 다음과 같습니다.

  • Messages Alt + 0 (Cmd + 0)
  • Project Alt + 1 (Cmd + 1)
  • Favorites Alt + 2 (Cmd + 2)
  • Run Alt + 4 (Cmd + 4)
  • Debug Alt + 5 (Cmd + 5)
  • TODO Alt + 6 (Cmd + 6)
  • Structure Alt + 7 (Cmd + 7)
  • Terminal Alt + F12 (Option + F12)

단축키를 잘 활용해 손쉽게 각 편잡 창을 이동할 수 있도록 합니다. 특히, 자주 실행하여 결과를 볼 것이기 때문에 실행 창인 Alt+4 단축키는 외워 두는게 좋을 것 같습니다. 이 책에서는 주로 윈도우 운영체제의 단축키를 기준으로 설명합니다.

Hello Kotlin의 분석

Hello Kotlin 코드는 간단하면서도 많은 내용을 가지고 있습니다. 앞으로 많은 장을 걸쳐 공부하게 될 내용도 가지고 있죠. 하지만 '먼저 맞는 매가 덜 아프다'는 속담이 있듯이 개념을 잘 몰라도 먼저 간단히 읽어봅니다. 이번 장에서는 전부 이해하려고 노력하지 않아도 됩니다. 추후에 다시 나오게 된다면 아하! 하며 좀 더 쉽게 이해하게 될 것입니다.

코틀린의 main()은 최상위 함수로 실행 진입점이다

코틀린에서 main() 함수는 실행 진입점입니다. 자바와 같은 객체 지향 언어에서는 프로그램을 실행하려면 최소한 하나의 클래스와 그 안에 실행할 수 있는 main() 함수가 있어야 합니다. 하지만 코틀린은 선언된 클래스가 없는데도 불구하고 main() 메서드 하나로 println() 함수를 통해 콘솔에 문자열 "Hello Kotlin"을 출력 하고 있습니다. 어떻게 이런 일이 가능할까요?

main()은 함수의 구조를 하고 있습니다. 보통 함수라고 불리는 용어는 클래스의 멤버가 되는 경우 메서드(Method) 혹은 특정 클래스의 멤버 메서드라고 부를 수 있습니다.

실제로 코틀린 코드는 JVM상에서 실행하기 위해서main 메서드는 파일명을 기준으로 자동으로 클래스가 생성됩니다. 만들어진 파일은 IntelliJ IDEA의 메뉴에 [Tools → Kotlin → Show Kotlin Bytecode]를 누른 후 생성된 화면에서 [Decompile]을 사용해서 어떤 형태로 소스가 해석 되었는지를 확인해 볼 수 있습니다.

생성된 소스에서 main() 메서드를 보면 HelloKotlinKt 클래스 안에 속한 멤버 메서드로 선언되어 있는 것을 알 수 있습니다. 이것은 자바 가상 머신인 JVM에 실행되기 위해, 문자열은 String var1 으로 선언되어 System.out.println() 에 의해 콘솔 장치에 출력 되는 것이죠.

변환된 자바의 main()메서드의 의미

main 메서드는 많은 개념을 내포하고 있는데요. 코드를 정의된 main()함수를 다시 한번 살펴 봅시다.

public 은 가시성 지시자로 이 메서드의 접근 방법을 가리키고 있습니다. public 은 클래스인 HelloKotlinKt 외부 어디서는 접근 할 수 있다는 의미를 가지고 있습니다. 두번째 키워드로 static 은 이 메서드가 정적 메서드임을 나타내고 있습니다. static 으로 선언하면 프로그램의 정적 메모리 영역에 객체가 만들어지기 때문에 객체의 생성 없이 호출해 위치로 진입 점 사용할 수 있게 됩니다. final 은 최종 메서드임을 나타내고 void 는 반환 할 것이 없는 경우 지정합니다.

Note:동적 메모리 영역

프로그램이 사용하는 메모리 영역에는 여러가지가 있습니다. 명령어가 들어가 있는 코드 영역과 프로그램이 컴파일 되면 문자열이나 정적 변수나 문자열 등이 들어간 정적 메모리 영역인 데이터(Data)가 있습니다. JVM에서는 이 영역을 메서드 정적 영역(Method Static Area)으로도 부르고 있습니다. 또 실행 중 생성되는 객체의 경우에는 동적 메모리 영역인 힙(Heap)이라고 불리는 곳에 만들어 집니다.
추가적으로 코드 블록인 중괄호(<>) 안에 사용된 변수나 함수 호출 블록들은 임시로 쓰이는 메모리 영역인 스택(Stack)에 들어가며, 중괄호 블록이 끝나면 임시로 사용된 변수는 스택에서 제거가 됩니다.

먼저 실행을 위해 [Shift + Alt + F10]을 누르면 main을 가진 실행 클래스들이 다음과 같이 나열 됩니다.

여기서 ArrayIndexOutOfBoundsException 예외가 발생했습니다. 명령행으로부터 아무런 인자가 설정되어 있지 않기 때문이죠. 그러면 인자를 설정해 봅시다.
IntelliJ IDEA에서 직접 인자를 전달해 실행하고자 한다면 [Run] 메뉴에 [Edit Configurations]를 사용해 Program arguments에 필요한 명령행 인자를 나열할 수 있습니다.

명령행으로부터 받은 인자는 각각 args[0], args[1], args[2] 에 문자열 형태로 저장됩니다.
여기서 프로그램의 진입점 역할을 하는 main() 함수를 HelloKotlin.kt와 MainArgs.kt 파일을 통해 살펴봤습니다. 짧은 코드지만 많은 개념과 원리가 숨어 있다는 것을 알게 되었을 텐데요. 이렇게 쉬운 코드에 위치로 진입 점 어려운 개념이 잔뜩 숨겨져 있었다니! 놀랐을 수도 있습니다. 하지만 항상 모든 것의 기본이 가장 어려운 것입니다. 이런 개념과 원리를 하나씩 밟아 가면서 기본에 충실하면 아무리 복잡한 코드가 나와도 손쉽게 이해할 수 있게 될 것입니다. 이제 코틀린과 함께하는 여행을 떠나 봅시다!

Blog Content

분석하고자 하는 대상의 바이너리(파일)이 몇 비트 대상으로 컴파일 되었는지에 따라 결정되는 겁니다.

예를들면, 컴파일 시 위 처럼 x86 버전으로 빌드하였을 경우 ida 32비트 바로가기를 사용해 주시면 됩니다. (반대인 경우 x64)

대상 파일의 아키텍쳐를 모르신다면 그냥 x64로 열어보면 됩니다. (드래그앤드롭으로 바로가기 아이콘에 바이너리를 넣으시면 편합니다)

x86 아키텍쳐인 경우 "Portable executable for 80386 (PE)"라고 나옵니다.

x64 아키텍쳐인 경우입니다.

Ok 버튼을 누르고 대상 바이너리를 IDA로 열었을 때 왼쪽 "Function window" 창이 있습니다. "Function Window"에서 sub_XXXXXXXX으로 네이밍된 함수들은 IDA에서 자동으로 바이너리를 파싱해서 만들어준 겁니다.

대상 바이너리의 심볼이 살아있을 경우 함수 이름이 제작자가 네이밍한 이름으로 설정되지만 웬만해서는 심볼이 다 죽어있습니다. Win API들은 패턴기반으로 IDA에서 심볼을 살려줍니다! 그나마 다행이죠.

대상 바이너리 크기가 클 경우 파싱하는데 시간이 좀 걸릴 수 있습니다. 왼쪽 하단에 숫자 같은게 올라가거나 하면 파싱 중이니 잠시 기다려주세요.

IDA의 hex-ray가 임의 코드(Pseudocode)를 지원해주지만 분석하고자 하는 함수를 찾지 못하면 쓸모가 없죠.

지금 Function Window 창의 "start"가 프로그램이 시작될 때, 메모리에 올라올 때 제일 처음 실행되는 진입점이라고 보시면 됩니다. 하지만 보통 여기를 분석하실 필요는 없으십니다.

해당 start 부분은 프로그램이 메모리에 올라와서 정상적으로 실행이 되도록 이니셜라이징 하는 부분이기 때문입니다. 즉, 개발자가 직접 건드리는 부분이 아니게 때문에 굳이 볼 필요는 없다 이 말이죠.

그렇다면 이제 Main 함수는 어디서 실행되는가 궁금하실 겁니다. 이 부분은 start를 잘 살펴보면 알아낼 수 있습니다.

start 를 잘 살피어 보면 보시는 바와 같이 call, call, call, call, 을 연속으로 하며 인자를 레지스터에 담아(x64 기준 기본 인자 전달방법 __fastcall ) 메인 함수를 호출하는 부분이 보입니다.

사실 지금 심볼이 살아있어서 __p__argc, __p__argv라는 함수명이 제대로 보이는거라 실전은 더 어려울 수 있으며, x86 architecture일 경우 push로 인자를 전달하기 때문에 위 사진과 다소 차이가 있을 수 있습니다.

음.. 사실 컴파일러 및 버전, 사용한 언어 등에 따라 start 부분에서 main 함수로 까지 등 다소 많이 차이가 나서 원하는 핵심 루틴은 찾기 매우 어려울 겁니다. 경험이 필요한거죠.

그래서 야매[?]가 조금 필요합니다. IDA에서 Ctrl + 1 을 누르시면 Quick View 창이 뜰겁니다.

여기서 Strings를 눌러주십시오. 바이너리 내의 문자열을 탐색해 주는 기능입니다.

여기서 Setup. 을 눌러주신 후 탐색할 스트링 타입에 전부 v 해주면 됩니다. 그 후 다시 재탐색 될 때 까지 기다리시면 됩니다.

느낌있게 생긴 원하는 문자열이 보이면 더블 클릭을 해줍니다. 더블 클릭시 IDA View 창으로 넘어갈 수도, Hex View 창으로 넘어갈 수도 있습니다. 이전에 어떤 창에 있었느냐에 따라 다르지만 Default로 IDA View 창으로 넘어가집니다.

IDA View 창으로 넘어가졌을 경우 IDA가 미리 문자열을 네이밍 시켜놨습니다. "aKey0x08x"

저 네이밍된 변수?를 클릭 후 x를 누르시면 External Reference 기능을 이용할 수 있습니다. w000w

IDA의 강력한 기능 중 하나인 외부참조 기능입니다. 어디서 이 문자열을 사용하는지 알 수 있는거죠.

문자열 외의 전역변수들도, 지역변수들도 (함수내에서만) 가능한 기능입니다.

자 이제 OK 버튼을 누를경우 사용되는 곳으로 이동이 됩니다.

이제 나왔습니다. 제일 필요하고 원하는 기능 Hex-ray . tab 키나 f5를 눌러주시면 됩니다.

짠, IDA Hex-ray에서 임의코드를 주었습니다. 실망하실 수 있지만 사람이 어느정도 분석할 정도는 됩니다.

현존하는 C/CPP 디컴파일러 중 가장 강력한 툴이 hex-ray라서 다른 툴을 찾으셔도 더 안좋거나 만족스럽지 못하실겁니다.

또한, Hex-ray는 함수만을 디컴파일 할 수 있습니다. 즉, 함수 영역이 존재하는, 함수만의 Stack Frame이 할당되는 곳만 가능합니다.

함수 프롤로그 / 에필로그 부분을 예를들어 보겠습니다.

push ebp // 이전 함수의 stack base pointer backup

mov ebp, esp // 스택 최상단(esp)을 새로운 stack base pointer로 할당. (새로운 함수영역을 할당하겠다는 의미)

sub esp, 0x40 // 이 함수에서는 0x40만큼의 스택 공간이 필요함. (함수 공간 확장)

leave // 호출되기전의 base pointer로 복귀.

ret // 호출되기전 다음 주소로 이동 (계속하여 진행)

에필로그는 언어, 함수, 컴파일러 최적화 옵션 등 마다 달라지긴 하지만 이렇게 함수가 시작되어서 정상적으로 끝 마쳐 져야지 hex-ray가 디컴파일을 할 수 있게됩니다.

이것또한 hex-ray의 한계라고 볼 수 있죠..

물론 여러가지 방법?을 통해서 분석을 할 수 있긴합니다만. 역시 상황에 따라 다르기 때문에 그 상황에 놓여 봐야지만 알 수 있을것 같네요.


0 개 댓글

답장을 남겨주세요