반응형

사용 계기 

 - 필요한 *.ini 파일 존재 하는지 확인이 필요해서


Syntax 

BOOL PathFileExists(
  _In_ LPCTSTR pszPath
);

pszPath : 확인하고자 하는 파일 경로



return 

TRUE : 파일 존재

FALSE : 그 외


Requirements

Minimum supported client

Windows 2000 Professional, Windows XP [desktop apps only]

Minimum supported server

Windows 2000 Server [desktop apps only]

Header

Shlwapi.h

Library

Shlwapi.lib

DLL

Shlwapi.dll (version 4.71 or later)

Unicode and ANSI names

PathFileExistsW (Unicode) and PathFileExistsA (ANSI)

 - 사용하려면 헤더와 라이브러리 추가.


ex)

#include<Shlwapi.h>

#pragma comment(lib, "Shlwapi.lib")


출처 : https://msdn.microsoft.com/en-us/library/bb773584(v=VS.85).aspx

반응형
반응형

사용 계기 

 - Login 시 서버에 접속 전에 PC에서 사용자 인증을 1차적으로 거치기 위해서 ini파일에 ID, Password를 저장 후 인증하도록 함.

  - 개인 PC의 보안 접속을 위해 PC에서 미리 인증된 ID로만 접속 하도록 하기 위함.

 


1.ini 파일

우선 ini 파일이 무엇인지 알아야 한다.


- 정의

INI(Initialization) 파일 포맷은 설정 파일에 대한 de facto 표준이다. INI 파일은 단순 구조의 텍스트 파일로 이루어져 있다. 보통 마이크로소프트 윈도와 연결되어 있지만 다른 운영 체제에서도 사용할 수 있다. "INI 파일"이라는 이름은 ".INI"라는 파일 확장자가 따라오지만, ".CFG", ".conf", ".TXT" 등의 다른 확장자를 사용하기도 한다.


- 형식

매개 변수

INI 파일에 포함된 기본 요소는 매개 변수이다. 각 변수는 이름과 값을 가지고 있으며 등호로 이를 구분한다. "이름"은 등호 왼쪽에 적는다.

이름(키) =

섹션

매개 변수는 임의의 이름으로 지정된 여러 개의 섹션으로 구분할 수 있다. 이 섹션 이름은 괄호 ([, ])로 구분한다.

[섹션]
주석

세미콜론 (;)은 주석의 시작을 가리킨다. 줄이 끝날 때까지 주석을 계속 적을 수 있다. 세미콜론 사이의 모든 항목과 줄의 끝 부분까지의 내용은 프로그램의 설정값에서 무시한다.

; 주석


가상의 프로그램(실제로 존재하지는 않음)을 위한 INI 파일의 예는 다음과 같다. 두 개의 섹션을 가지고 있으며, 그 가운데 한 섹션은 소프트웨어의 소유자에 대한 것이며, 나머지 하나는 종업원 명부 데이터베이스 연결에 대한 것이다. 또, 파일을 마지막으로 수정한 날짜,도메인 이름 대신 IP 주소가 쓰인 까닭에 대해 주석을 적고 있다.

; 홍길동이 2001년 4월 1일에 마지막으로 수정하였음
[owner]
name=홍길동
organization=최고의 제품

[database]
server=192.0.2.62     ; 네트워크 이름 변환이 동작하지 않는 경우 IP 주소를 사용한다
port=143
file="payroll.dat"


출처 위키백과 : https://ko.wikipedia.org/wiki/INI_%ED%8C%8C%EC%9D%BC





1-1. WritePrivateProfileString()

BOOL WINAPI WritePrivateProfileString(

  __in  LPCTSTR lpAppName,

  __in  LPCTSTR lpKeyName,

  __in  LPCTSTR lpString,

  __in  LPCTSTR lpFileName

);


ini파일에 data를 쓰기 위한 함수


[Parameter]

lpAppName [in]

어떤 섹션에 기록될것인지 입력합니다.

lpKeyName [in]

어떤 키에 기록될것인지 입력합니다. 만약 NULL일때는 섹션 내의 모든 정보를 삭제합니다.

lpString [in]

키에 들어가는 값을 입력합니다. 꼭 NULL종료 문자열이여야 합니다. 정수, 실수등의 값은 문자열로 바꾸어서 넣어주어야 하고, 만약 NULL일때는 키를 삭제합니다.

lpFileName [in]

어떤 파일에 기록할지 입력합니다. 경로를 지정하지 않으면, 윈도우즈 디렉토리 (보통 C:\Windows\)에 생성됨.


2-2.GetPrivateProfileString()

DWORD WINAPI GetPrivateProfileString(

  __in   LPCTSTR lpAppName,

  __in   LPCTSTR lpKeyName,

  __in   LPCTSTR lpDefault,

  __out  LPTSTR lpReturnedString,

  __in   DWORD nSize,

  __in   LPCTSTR lpFileName

);


[Parameter]


lpAppName [in]

어떤 섹션을 읽을지 지정합니다. .

lpKeyName [in]

어떤 키를 읽을지 지정합니다.

lpDefault [in]

읽을수 없을때 어떤 값이 디폴트로 될지 지정합니다.

lpReturnedString [out]

문자열 버퍼의 주소를 줍니다.

nSize [in]

lpReturnedString의 사이즈를 줍니다.

lpFileName [in]

어떤 ini에서 읽을지 지정합니다.




적용


BOOL CALLBACK InfoDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

char str[100] = "test1234";

SYSTEMTIME st;


switch(uMsg){

case WM_INITDIALOG:

WritePrivateProfileString("LOGIN", "ID","test", "c:\\login.ini");

WritePrivateProfileString("LOGIN", "PASSWORD","1234","c:\\login.ini");

return TRUE;

case WM_CLOSE:

EndDialog(hDlg, NULL);

}

return FALSE;

}


- Test 결과 파일이 없는 상태에서도 WritePrivateProfileString() 를 사용하면 파일 생성 및 data 입력이 가능 하다.

- 경로를 적지 않을 경우 "c:\windows" 폴더에 생성됨을 확인.










반응형
반응형

레지스터 내용부터 읽어보자

info reg | info registers

모든 레지스터 정보를 얻을 수 있다.


1개, 또는 여러개의 레지스터 정보를 얻길 원한다면

info reg 레지스터 이름1,이름2,이름3 ...

이런식으로 하면 된다

이제 레지스터의 정보를 확인 할수 있다.


그렇담.. 메모리 내용을 확인해 보자.

스택이라던지 데이터영역에 잇는 내용을 알고 싶을때 어떻게 할까 ?

x/nfu 주소   이 형식을 이용한 명령을 내리면 된다


n: 반복 갯수

f(format) 

i(명령코드) x(16진수) o(8진수) t(2진수)  d(부호 있는 10진수)   u(부호없는 10진수) s(문자열)

u(unit)

b(1바이트) h(2바이트) w(4바이트)

이렇게만 써놓으면 이해가 안가므로 실습을 해봐야겠지

비교해가면서 확인을 해보겠습니다

우선 반복갯수

4번 8번 5번의 반복

차이가 보이죠 ?


이제는 포맷

i(명령코드) 포맷은 u의 크기에 상관 없이 같은 결과가 나오며 생략해도 됩니다


확인 되시죠?

이제 다른 포맷을 확인해 봅시다.

같은 주소의 메모리를 읽어 오는데 포맷에 의해 다르게 내용이 표시되는 것을 볼 수 잇다

모두 같은 값을 읽어 온 것이지만 어떤 포맷을 스냐에 따라 보여지는게 달라 보일 수 있다


이제 마지막으로 unit ...


몇 바이트 단위로 읽어 낼 것인지에 대해 설정하는 것이다

휴... 기초 사용법 끝




반응형

'ETC > Linux' 카테고리의 다른 글

make 유틸리티  (0) 2016.09.30
vi 에디터  (0) 2016.09.30
gdb 기초 사용법2(stepi nexti 차이점)  (0) 2015.09.16
gdb 기초 사용법  (0) 2015.09.15
gcc 컴파일  (0) 2015.09.15
반응형

nexti 와 stepi 차이를 예문을 통해 알아보도록 하겠다

우선 call 을 하는 부분이 있어야 하므로 함수를 하나 정의 하고

그 부분에서 어떻게 디버깅이 진행되는지 살펴보자


이제 컴파일 후 gdb로 실행을 해보도록 하겠다

intel 로 어셈블리어를 바꾸고

main함수쪽을 확인해 보았다.

function으로 call 하는 부분이 보인다.

main+40 (0x08048403) 이부분이다

여기를 브레이크 포인트로 잡고 런을 한 후 nexti와 step의 차이를 보도록 하자

call 하는 부분에 멈췄다.

nexti 를 먼저 확인해 보자

nexti를 하자 call을 따라 가는 것이 아니라 다음 명령으로 넘어간 것을 볼 수 있다

nexti명령 하나로 call을 실행시키고 넘어간 것이다.

그럼 stepi를 확인해 보자


stepi 는 call 한 명령어를 따라가서 수행하는 것을 볼 수 있다.

이러한 차이점을 가지고잇다... 오호...


printf한 부분이 어떻게 나오는지도 한번 확인해 보자

printf 실행 부분에 breakpoint를 설정한 후

c명령어(continue)를 사용하여 진행한다

ni명령어를 쓰면 printf가 실행되고 30이 출력되는것을 볼 수 있다.

si명령어였다면 어떻게 될지 상상이 된다면 두 명령어의 차이점을 이해한 것이다.




반응형

'ETC > Linux' 카테고리의 다른 글

make 유틸리티  (0) 2016.09.30
vi 에디터  (0) 2016.09.30
gdb 기초 사용법 (메모리, 레지스터 내용 읽기)  (0) 2015.09.16
gdb 기초 사용법  (0) 2015.09.15
gcc 컴파일  (0) 2015.09.15
반응형

gdb를 사용해야 할 일이 많아서 내가 사용하기에 맞게끔 정리를 해야겠다

인터넷을 뒤지다 보면 컴파일할때부터 gcc -g 옵션을 가지고 컴파일한 파일 위주로 설명이 되어 있다

나는 그렇게 컴파일한 파일을 디버깅 하려고 쓰는게 아니기 때문에 내가 하나씩 해보면서

정리를 하겠다.

인터넷에는 의외로 쓸모 없는 정보들이 참 많다.. ㅠㅠㅠ ,, 참고로 이글은 초보만 보기를..


1. gdb 실행

gdb 명령을 통해 들어가고 quit 를 통해 나갈 수 있다.


원하는 프로그램을 gdb로 실행하려면

gdb [프로그램 명]   으로 하면 되는데 다른 옵션들도 있으나 내가 필요한건 일단 이 명령이므로

이거에 대해서만 다룰거다


이거 네모 어떻게 그리는거지....

아무튼 test 파일을 gdb로 실행했다.


-프로그램 시작

run 명령을 통해서 시작을 햇다가 끝이 난다.

break point가 없어서 그런것이므로... 일단은 이렇게 시작한다는 것을 알면 되겠다.



2. disassemble

윈도우에서 사용하는 디버거를 사용해봤다면 어셈블리어로 디버깅 하는 것을 원했을지도 모른다

내가 그랬으니까.

찾다 찾다 내가 쓰는거다.

어셈블리어로 보면서 디버깅을 해보자

disassemble 주소

disassemble main

메인 함수에 대해 어셈블리어로 표현해 준다.

뒤에 주소를 써도 된다.

disassemble 이라고 전부다 치기 어렵다면 disas 정도까지만 치고 TAB키를 누르면 자동 완성된다. 편하다


x/명령수i 주소

무슨 뜻인지 이해가 되겠나 ?

x/3i 3줄을 표시하라는 뜻이다. 이또한 main 말고 0x8048394 를 넣어도 같은 결과를 낼 수 있다.


어셈블리어 문법

AT&T VS Intel 문법

두 분법에 차이가 있다.

쉽게 정리해 놓은게 있어서 출처를 남기고 

출처 : http://huammmm1.tistory.com/492

1. 레지스터를 나타낼 때


intel : eax


AT&T : %eax



2. operand 순서


intel : destination, source


AT&T : source, destination



3. 상수


intel : 5로 표기


AT&T : $5로 표기



4. 메모리 주소 참조


intel : [eax]


AT&T : (%eax)



5. 레지스터 + offset 위치의 메모리 주소를 참조할 때


intel : [eax + 4]


AT&T : 4(%eax)


이러한 차이점이 있는데... 나는 intel로 된게 좋다.... 그래서 바꿔 보겠다

set disassembly-flavor intel 
이렇게 쓰면 된다.

기호에 맞게 취향에 맞게 사용하면 된다. 난 이게 편하다...


3. breakpoint

처음에 run을 했을때 시작했다가 그냥 끝나는 것을 보았다.

이제는 breakpoint를 설정해서 그 부분에서 정지 하도록 해보자

break *main+3 

이런 식으로 브레이크 포인트를 지정하면 된다.

어디가 지정되어 있나 확인할때는

info break 명령을 하면 된다


슬슬 길어 진다... 이런식으로 하면 된다...

4. netxi stepi

이제 명령을 한줄씩 실행하는것을 알아보도록 할 거다...

이거까지만 쓰고 다음 글에 이어서 쓰도록 해야 겠다.

break point를 지정하고 run을 하면 거기서 멈춘다

그런데 나는 한줄 씩 보기를 원한다면...

계속 break point를 지정해주면서 확인할 것인가?

그래서 있는 명령어가 nexti 와 stepi 이다.

nexti는 단축으로 ni 

stepi 는 si 이다. 간편하다

브레이크 포인트 적용한 곳으로부터 한 명령씩 진행하는 것을 볼 수 있다.

stepi와 nexti의 차이점이라면...

stepi는 하위 함수를 따라간다. call이 있으면 그 주소로 따라가서 진행한다

그러나 nexti는 따라가지 않고 call이 진행되고 다음줄로 넘어간다.

이거는 다음에 해보면서 정리하도록 하자.





반응형

'ETC > Linux' 카테고리의 다른 글

make 유틸리티  (0) 2016.09.30
vi 에디터  (0) 2016.09.30
gdb 기초 사용법 (메모리, 레지스터 내용 읽기)  (0) 2015.09.16
gdb 기초 사용법2(stepi nexti 차이점)  (0) 2015.09.16
gcc 컴파일  (0) 2015.09.15
반응형

gcc 컴파일에 대해 간략히 알아봐야겠다.

gcc는 c프로그래밍을 컴파일 해주는 녀석이다.

자주쓰지 않아서 헷갈렸는데 이제는 쓸일이 좀 생겨서

정리를 하면서 공부를 해야겠다


우선 gcc --help 로 어떻게 사용하는지 볼까나


옵션을 써도되고 안써도 되네요

옵션 없이 사용해 보도록 하겠습니다.

우선 test.c로 간단한 c프로그래밍을 해보죠

디렉토리에는 test.c 밖에 없고 위에 보이는것처럼 코딩을 했습니다.

이제 옵션없이 gcc를 사용해 보겠습니다.

gcc test.c 명령어를 치자 a.out 이라는 파일이 생성되었습니다.

옵션 없이 사용하면 a.out 으로 자동으로 컴파일을 해줍니다.

실행을 해보죠

test.c 로 프로그래밍한 결과입니다. 


그럼 자주 쓰는 몇개의 옵션을 볼까요

버전을 확인하는 gcc --version, -v 로 해도 버전을 알아볼 수 잇습니다.


컴파일할 파일명을 지정 해주는 gcc -o [파일명] 

test라는 파일이 생긴것을 확인 할수 잇죠




일단은 기본 사용법은 이정도니까... 다른 옵션은 사용하게 될때마다 업뎃 하는걸로다가...




반응형

'ETC > Linux' 카테고리의 다른 글

make 유틸리티  (0) 2016.09.30
vi 에디터  (0) 2016.09.30
gdb 기초 사용법 (메모리, 레지스터 내용 읽기)  (0) 2015.09.16
gdb 기초 사용법2(stepi nexti 차이점)  (0) 2015.09.16
gdb 기초 사용법  (0) 2015.09.15

+ Recent posts