위치로 진입 점

마지막 업데이트: 2022년 5월 18일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
jsdoc template 은 jsdoc 에서 주석을 파싱한 결과물을 기반으로 UI 를 구성하는 모듈을 의미한다. 원하는 UI 를 적용하고 싶은 경우 템플릿 구현이 필요하다. publish.js 에서 exports 된 publish 함수가 template 진입점이며, jsdoc 에서 파싱된 데이터(TAFFY type)를 파라미터로 전달 받는다.

명령어로 끝나는 모든 글자 의 단어 : 179개

: (1)디스크 저장 공간에 저장되어 있는 명령어. 명령 호출 시에 주기억 장치로 옮겨져서 실행된다. (2)마이크로소프트 디스크 운영 체제의 커맨드컴(COMMAND.COM)에서 직접 실행할 수 없고 파일에 저장되어 있는 별도의 프로그램을 통해 실행되는 명령어. 파일 뒤에 시오엠(COM), 이엑스이, 비에이티(BAT) 등 파일의 성질을 나타내는 확장자가 있으며, 이 명령어의 프로그램이 현재 구동 장치, 디렉터리, 경로에 존재해야 명령을 실행할 수 있다. FORMAT, DISKCOPY, DISKCOMP 따위가 있다.

: (1)스택 컴퓨터에서 사용하는, 명령어에 나타난 연산자의 수행에서 입력 자료의 출처와 연산 결과를 기억시킬 장소가 고정되어 있거나 특수한 구조상의 기능에 의하여 주소를 알 수 있어 명령어 내에 자료의 주소를 지정할 필요가 없는 형식의 명령어.

: (1)명령어의 형식을 갖추고 프로그램에 삽입되지만 실행하려는 의도는 없는 명령어. 단순히 시간을 지연하기 위하여 사용하는 엔오피 따위가 있다. (2)명령을 실행하여도 데이터가 변경되거나 컴퓨터의 상태가 바뀌지 않는 명령어. 주로 프로그램 실행 중에 외부에서 발생하는 특수 조건을 대기시키기 위하여 프로그램에 삽입한다.

: (1)주소를 하나만 포함하고 있는 있는 명령. 기본적인 명령 형식은 하나의 연산 부호와 하나의 주소로 구성된다. 일반적으로 레지스터와 레지스터 간 또는 기억 장치와 연산 레지스터 간에 연산이 이루어진다.

: (1)레지스터 내의 데이터를 왼쪽 또는 오른쪽으로 한 자리나 그 이상의 자리를 이동시키는 특수 연산을 지시하는 명령어. 산술적 자리 옮김 연산자는 이동 방향에 따라 밑수를 곱하거나 나누는 것과 같은 효과를 낼 수 있다. 예를 들어, 이진수로 나타낸 수의 경우 오른쪽으로 한 자리를 옮기는 것은 2로 나누는 것과 같고, 왼쪽으로 한 자리를 옮기는 것은 2를 곱하는 것과 같다.

: (1)프로그램을 번역하는 과정에서 컴파일러와 어셈블러에게 정보를 제공하기 위하여 사용되는 명령어. (2)컴퓨터 프로그램에서 작업에 필요한 연산 따위를 표현하기 위하여 소프트웨어 개발 과정에서 사용되는 명령어.

위치로 진입 점

- 리눅스는 실행파일의 형식으로 ELF(Executable and Linkable Format)를 규정하고 있다.

- readelf -h [파일명]으로 확인할 수 있다.

- ELF 헤더 중 진입점(Entry Point, EP) 필드를 통해 시작 주소를 확인할 수 있다. 아래 예시에서는 0X400400임을 알 수 있다.

- start 명령어로 프로그램 진입점의 주소를 확인해볼 수 있다.

2. GDB 분석

(1) 시작과 종료

• 시작 : gdb [프로그램명][core 파일명][PID]

• 종료 : q or ctrl + d


(2) 소스보기 ( list or l )

• list : main 함수 기점으로 소스 출력

• list 10 : 10행을 기준으로 출력

• list func : func함수의 소스를 출력 (c++ 의 클래스 멤버의 경우 클래스 이름도 입력 해야 함)

• list - : 출력된 행의 이전행을 출력

• list file.c:func : file의 func 함수 부분을 출력

• file.c:10 : file의 10행을 기준으로 출력

(3) 브레이크 포인트 ( break or b )

• break func : func 함수의 시작부분에 브레이크 포인트 설정

• break 10 : 10행에 브레이크포인트 설정

• break file.c:func : file.c 파일에 func함수에 브레이크 포인트 설정

• break file.c:10 : file.c 파일에 10행에 브레이크 포인트 설정

• break +2 : 현재 행에서 2개 행 이후 브레이크 포인트 설정

• break -2 : 현재 행에서 2개 행 이전 지점에 브레이크 포인트 설정

• break *0x8049000 : 특정 주소에 브레이크 포인트 설정

• break 10 if var ==0 : 10행에 브레이크포인트를 설정하는데 var 값이 0일 때 작동

• tb : break 와 같으나 1회용 브레이크 포인트임. 문법은 b 와 같음

• info break : 현재 브레이크 포인트 보기

• cl : 브레이크 포인트 지우기 ( 옵션은 b와 유사하다 )

• d : 모든 브레이크 포인트 지우기

• run (r) : 프로그램 수행 ( ndk 환경에서는 지원되지 않는다. )

- run 명령어 사용 위치로 진입 점 시 인자값을 주려면 $()와 함께 파이썬 코드를 입력하면 전달 가능

- 다음과 같은 코드를 컴파일 했다고 가정.

- 첫번째 인자값 설정 후 입력값도 설정

• kill (k) : 프로그램 수행 종료

• step (s): 현재 행 수행 후 정지, 함수 호출시 함수 안으로 들어감

• s 5 : step 다섯번 수행과 동일

• next (n) : 현재 행 수행 후 정지, 함수 호출시 함수 수행 다음 행으로 감

• n 5 : next 다섯번 수행과 동일

• continue (c) : 다음 브레이크 포인트까지 진행

• finish : 현재 함수를 수행하고 빠져 나감

• return : 현재 함수를 수행하지 않고 빠져 나감

• return 123 : 위와 같으나 리턴값을 지정함

• si : 어셈블리 명령어 단위의 수행 ( 진행은 step 과 같음 )

• ni : 어셈블리 명령어 단위의 수행 ( 진행은 next 와 같음 )

(4) 와치 포인트 ( 위치로 진입 점 watch )

• watch 변수명 : 특정변수에 와치 포인트를 설정하고, 특정변수가 바뀔 때마다 브레이크가 걸리면서 이전/현재값을 출력한다.


(5) 변수출력 관련

• info locals : 현재 스택의 로컬변수모두 출력

• info variables : 전역변수 모두 출력 ( 스크롤 압박주의! )

• p [변수명] : 해당변수 value 출력 ( 포인터변수 입력시 주소값출력, *포인터변수명시 실제 value출력 )

• p $[레지스터명] : 레지스터 값출력 ( p $eax )

• p *[포인터]@[숫자] : struct/class 의 배열일 때 배열의 크기를 알림 ( p *[email protected] )

• p ‘[파일명]’::[변수명] : 위치로 진입 점 변수명 중복시 특정 파일의 전역변수 출력

• p [함수명]::[변수명] : 변수명 중복 시 특정 함수의 static 변수명 출력 ( 변수명이 중복될 때 기본으로 local 변수가 출력 )

• p /[출력형식][변수명] : 출력형식에 맞추어 변수값 출력
- t : 2진수
- o : 8진수
- d : 부호없는 10진수
- u : 부호없는 10진수
- x : 위치로 진입 점 16진수
- c : 최초 1바이트 값을 문자형으로 출력
- f : 부동소수점
- a : 가장가까운 심볼의 오프셋을 출력

- p (캐스팅)[변수명] : 변수를 캐스팅하여 출력 ( p (char *)ptr )

- p [포인터변수or배열]+[숫자] : 특정 주소 + 숫자 위치 출력 ( p (array[1]+4) )
- p [변수명] = [value] : 특정 변수의 값을 설정

• info registers : 레지스터 전체 출력

• info all-registers : MMX 포함 레지스터 전체출력

• info registers : 레지스터 전체 출력

• info all-registers : MMX 포함 레지스터 전체출력


위치로 진입 점 display [변수명] : 매번 p 치기 귀찮으니 특정변수 진행 중 계속 출력 ( p 와 동일한 방식으로 출력형식 지정가능 )
- disable display [번호] : 일시적으로 디스플레이 중단
- enable display [번호] : 중단했던 번호 다시 출력
- undisplay [번호] : 출력하던 display 변수 제거

(6) 스택 상태 검사

• info f [프레임 번호] : 스택 프레임 내용 출력

• info args : 함수 호출시 인자를 출력

• info locals : 함수의 지역변수를 출력

• info catch : 함수의 예외 핸들러를 출력

• bt : 전체 스택 프레임 출력 ( 콜스택 )

• frame [스택번호] : 스택번호의 스택 프레임으로 이동

• up : 상위 스택프레임으로 이동

• up [숫자] : 숫자만큼 상위 스택프레임으로 이동

• down : 하위 스택프레임으로 이동

• down [숫자] : 숫자만큼 하위 스택프레임으로 이동

(7) 메모리상태 검사

• x/[범위][출력형식][범위의단위] [메모리주소나 함수명]
• 범위 : 기본 4byte 단위
• 출력 형식 위치로 진입 점
- t : 2진수
- o : 8진수
- d : 부호없는 10진수
- u : 부호없는 10진수
- x : 16진수
- c : 최초 1바이트 값을 문자형으로 출력
- f : 부동소수점
- a : 가장가까운 심볼의 오프셋을 출력
- s : 문자열로 출력
- i : 어셈블리 형식으로 출력

• 범위의 단위
- b : 1 byte 단위
- h : 2 byte 단위
- w : 4 byte 단위
- g : 8 byte 단위

• Example
- x/10i main : main 함수로 부터 40byte 를 어셈블리로 출력
- x/10 main : main 함수로 부터 40byte를 출력
- x/10b 0x8048200 : 주소로 부터 10byte를 출력

(8) 기타

• directory [경로] : 소스파일을 탐색하기 위해 경로에 directory 를 추가

• objectdir [경로] : 오브젝트 경로 등록

• disas [함수명] : 특정함수의 어셈블리 코드를 출력

• disas [주소] [주소] : 주소사이의 어셈블리 코드를 출력

• call [함수명(인자)] : 특정 함수를 인자값으로 호출함

• jump *[주소] : 주소로 강제적으로 분기

• jump [행번호] : 특정 행으로 강제 분기

• jump [ 함수명] : 특정 함수로 강제 분기

• info signals : signal 종류 출력

• signal [시그널명] : 디버깅중인 프로세스에 시그널 전달 ( signal SIGKILL )

• set [주소] = [값] : 특정 메모리에 값을 지정 ( set 0x8048300 = 100 )

• info 탭키 : info 로 확인 가능한 명령어 출력

• 환경 설정
- info set : 설정 가능한 내용 출력
- set prompt euclid : 프롬프트른 euclid 로 변경

www.devkuma.com

함수(function)란 "기능"을 뜻한다. 즉, 기능을 구현하는 부분을 따로 떼어 구현하는 것으로, 구조화 프로그램의 중요한 개념이라 하겠다. 여기서는 함수 작성법 및 호출 방법에 대해서 설명하겠다.

반복되는 처리는 함수로서 부품화할 수 있다.

특정 처리를 함수에 정리한다

지금까지 프로그램은 main() 함수에 작성해 왔다. 처음에 설명했듯이 main() 함수는 프로그램이 실행될 때에 최초에 호출되는 애플리케이션 진입점을 나타내는 특수한 함수이다. 우리는 필요한 경우 main() 이외의 함수를 만들 수 있다. 지금까지는 표준 함수로 정해져 있는 printf()와 scanf() 등의 함수를 사용하여 왔는데, 이러한 일부 기능을 정리한 함수를 직접 만들 수 있는 것이다.

프로그램에서 여러번 사용되는 처리 함수로 정리하여, 동일한 코드를 여러번 작성하는 번거로움에서 해방되어 프로그램 전체에 정합성을 갖게 할 수 있다. 이는 응용 프로그램의 설계에 있어서 매우 중요한 것이다. 처음에 약간 설명했지만, 함수를 정의하려면 다음과 같이 설명한다.

함수의 정의

기본적인 작성법은 main() 함수와 동일하다. 함수명은 변수와 동일하게 C 언어의 명명 규칙을 따르고 있으면 자유롭게 지정할 수 있다. 함수의 기능을 나타내어 알기 쉽게 의미있는 이름으로하는 것이 바람직하다. 반환 값과 매개 변수 목록은 "파라미터와 반환 값"에서 자세히 설명하겠지만, 이것들을 이용하면 함수간에 데이터를 교환할 수 있다. 이 장에서는 우선 함수는 다음과 같이 정의한다.

이 함수는 값을 받지 않고 값을 돌려주지 않는 것을 나타낸다. 반환 값의 자료형으로 지정하는 void는 함수가 값을 반환하지 않는 위치로 진입 점 것을 의미한다. 값을 반환하지 않는 함수는 return 키워드 값을 반환할 수 없다. 함수를 호출할 때는 printf()와 같은 표준 함수처럼 호출할 수 있다.

한번 만든 함수는 여러번 호출할 수 있기 때문에, 프로그램의 재사용이 가능하다. 다음의 프로그램은 새로운 함수 Function()를 정의하고 main() 함수에서 이것을 호출하여 사용하고 있다.

Function() 함수는 printf() 함수를 호출하여 화면에 문자를 표시하는 간단한 처리를 수행한다. main() 함수에서 Function() 함수를 두번 호출한다. 그 결과, 화면에는 "Kitty on your lap"이라는 문자가 두 줄에 걸쳐 표시된다. 그러나 함수는 사용되는 함수보다 먼저 기술해야 합니다. 코드1을 보고 알 수 있듯이, Function() 함수는 이를 호출하는 main() 함수보다 이전에 정의되어 있다.

왜 함수가 사용되기 이전의 위치로 지정해야 하냐면, 함수를 발견하기 전에 함수를 호출하면 컴파일러는 기본적으로 int 형의 반환 값을 가진 인수를 받지 않는 함수로 인식한다. 따라서 기본 형식이 아닌 함수를 정의보다 이전에 호출하고, 형의 불일치로 컴파일 에러가 되어 발생한다.

예를 들어, 다음 프로그램은 Function1()는 문제없이 호출할 수 있지만 Function2()는 오류이다.

Function1()는 반환 값이 int 형으로 매개 변수가 없는 함수이므로 정의가 호출보다 뒤에 있어도 호출과 같은 형태이므로 문제없이 호출할 수 있지만, Function2()는 반환 값이 void 형이므로 그 이전 호출과 형태가 다르다. 컴파일러는 함수를 다시 선언으로 간주하고, 형태가 다르기 때문에 오류를 발생시키는 것이다.

코드1의 흐름을 따르면, 먼저 main() 함수가 실행되고 Function() 함수가 호출된다. 함수가 호출되면 프로그램은 그 함수에 제어를 이동시킨다. 코드1의 경우 Function() 함수의 본체에 제어가 이동하게 된다. Function() 함수의 처리가 완료되면, 프로그램은 함수를 호출한 원래 위치에 제어를 리턴한다. 이 경우는 main() 함수로 돌아 오게 된다.

그림1 - 함수의 호출과 복귀

함수를 호출하면 함수의 처리가 완료되면 제어가 함수를 호출한 원래의 위치로 돌아오기 때문에 프로그램의 흐름은 결국 main() 함수로 돌아간다.

void 형의 반환 값을 갖는 함수는 값을 돌려 줄 필요가 없기 때문에 return 문을 생략할 수 있다. main() 함수는 int 형의 종료 코드를 시스템에 반환해야 하므로 return 문을 사용하여 값을 반환하지만 Function() 함수는 return 문을 사용하지 않는다. 그러나 다음과 같이 명시적으로 return 문을 사용하여 함수를 종료 할 수 있다. 그러나 값은 반환시키지 않기 때문에 식을 지정할 수는 없다.

특정 위치에서 함수를 끝내고 싶다면, return 문을 사용하여 제어를 반환할 수 있다.

함수는 몇겹씩 호출할 수 있습니다.main()함수가 Function1()함수를 호출하는, Function1()함수가 Function2()함수를 호출하는……라는 듯 함수에서 다른 함수를 몇겹으로 불러냈다고 해도 함수는 자신을 불러낸 장소에 제어를 되돌리는 성질이 있으므로 반드시 최고 수준의 제어, 즉 main()함수로 돌아갑니다.

함수는 몇번이나 겹쳐서 호출할 수 있다. main() 함수가 Function1() 함수를 호출하고, Function1() 함수가 Function2() 함수를 호출 . 등등 함수에서 다른 함수를 여러번 호출해도 함수는 자신을 호출한 곳으로 제어를 되돌리는 성질이 있으므로 반드시 최상위 제어, 즉 main() 함수로 복귀한다.

코드2는 Function1() 함수에서 Function2() 함수를 호출한다. 이 프로그램은 제어의 흐름을 시각적으로 확인할 수 있도록 하기 위해, 각 함수는 자신의 함수명과 처리를 화면에 표시한다.

프로그램은 먼저 main() 함수에서 Function1() 함수를 호출하여 Function1() 함수는 Function2() 함수를 호출한다. Function2() 함수는 즉시 제어를 반환하기 때문에 Function1() 함수에 제어가 돌아간다. 그리고 Function1() 함수를 종료하고, 마지막으로 main() 함수에 복귀하고 있는 것을 확인할 수 있다. 표시된 결과를 보면 프로그램이 어떤 순서로 실행되고 있는지 이해할 수 있다.

위치로 진입 점

03 디버거 사용법(x64 dbg)

1. 프로그램 디버깅

1.1 프로그래밍 오류

  • 문법 오류
  • 심벌 오류
  • 메모리 위치로 진입 점 접근 오류
  • 잘못된 결과 출력 오류
  • 장기 작업 오류

1.2 프로그래밍 오류가 자주 발생하는 지점

  • 프로그램 비교 조건문의 작성 실수
  • 프로그램에서 반환 값과 포인터의 오류 검사 - 값의 범위 문제
  • 프로그램 내 값의 잘못된 적용

1.3 프로그래밍 오류 찾는 법

  • 직접 일일이 한 줄씩 찾아보기
  • printf()를 중간에 넣어 오류 발생 예상
  • 디버거 사용

2. 디버거 종류

  • OllyDBG - http://www.ollydbg.de에서 다운

무료 공개용 도구로 GUI 기반이며 디버깅 용도로 사용

  • IDA Pro - https://www.hex-rays.com/products/ida/support/download_freeware.html

사용 도구로 C언어 구조로 보여줄 수 있고 전문가용

  • x64 dbg - https://sourceforge.net/projects/x64dbg/

3. 디버거 사용법(x64 dbg)

3.1 x64 dbg 설치

release 폴더의 x 96 dbg.exe 프로그램을 실행하고 설치하면 된다.

-> 작업 창으로 CPU 탭에 해당한다.

(1) - 어셈블리어 코드와 명령 어코드를 나타내고 있는 목적 코드 부부

(2) - CPU의 레지스터의 값을 보여주는 창이며, 실행 단계에서 값의 변화를 볼 수 있음

(3) - 메모리 공간의 값을 HEX코드(16진수)와 아스키코드로 보여주며, 관심 있는 주소를 설정해 데이터의 값의 변화를 확인할 수 있음

(4) - 함수에서 사용하는 스택 내용을 보여주며, 원하는 주소의 스탯 영역의 값들을 확인할 수 있음

(5) - 프로그램 코드 부분에서 실행되고 있는 각 해당 위치의 오프셋 값과 변경된 메모리 주소, 레지스터의 내용 등의 힌트 정보를 나타내 줌

(6) - 프로그램 코드에서 사용되는 매개변수와 지역변수의 위치를 레지스터 변위 값으로 표현함

3.2 x64 dbg 주요 기능

시스템 중단점 - 프로세스가 초기화되어 사용자 코드를 아직 실행하지 않았을 때 발생하며, 사용자 코드를 실행하기 위한 준비 코드를 볼 수 있음

TLS 콜백 - TLS 콜백에서 일시 중지하며, main 함수가 실행되기 전에 파라미터를 설정할 수 있고 anti-debug 기술을 시행하기 위한 보호 기능들을 불러옴

egjs-jsdoc-template

jsdoc3 기반의 템플릿 중 jaguar-jsdoc 템플릿의 기능을 기반으로 한 jsdoc template 개발 프로젝트이다.

jsdoc template 은 jsdoc 에서 주석을 파싱한 결과물을 기반으로 UI 를 구성하는 모듈을 의미한다. 원하는 UI 를 적용하고 싶은 경우 템플릿 구현이 필요하다.

publish.js 에서 exports 된 publish 함수가 template 진입점이며, jsdoc 에서 파싱된 데이터(TAFFY type)를 파라미터로 전달 받는다.

적용 사례

  1. 기능 및 UI 를 egjs API 문서를 표현하는데 보다 최적화된 형태로 변경한다.
  2. jsdoc3 기반으로 문서 API 를 작성하고자 하는 사내 모든 분들 중 egjs 와 동일하거나 유사한 기능이 필요한 분들을 위한 레퍼런스가 된다.

주요 특징

jaguar-jsdoc 과 구분되는 egjs-jsdoc-template 의 기능은 다음과 같다.

  1. 네비게이션 메뉴 Grouping 기능 : 동일한 범주끼리 묶어서 보여준다.
  1. Parameter Style : 테이블 --> 리스트 형태(기존 Jindo API 문서나 jQuery 문서 형태)
  2. 네비게이션 메뉴 API 위치 고정 : 현재 클릭 시 해당 API 가 메뉴 최상단으로 이동(jaguar-jsdoc)하지 않고, 지정된 위치에 고정된다.
  3. 한국어 처리 : 주석의 기본은 영문으로 하며 태그를 이용하여 한글 주석을 표기한다.

Project Setting

grunt-cli 를 각자 global로 설치 후, 다음 명령어를 이용하여 프로젝트를 설정한다.

문서 생성하기

grunt의 build 를 실행하여, 문서를 생성한다.

  • 실행이 정상적으로 완료되면 demo/dist 디렉토리에 샘플 문서가 생성된다.

Gruntfile.js 의 작업원본 JS 파일 경로(SRC_PATH), 와 결과물 경로 (DEST_PATH)를 지정할 수 있다.

var DIST_PATH = 'demo/dist'; var SRC_PATH = 'demo/sample';


0 개 댓글

답장을 남겨주세요