[1주] 01장 - 개발환경 구축

Posted by dw0rdptr
2015. 1. 12. 16:15 Study/파이썬 해킹 프로그래밍

ctypes?

복잡한 C 데이터 타입을 사용할수 있게하며 로우레벨 함수를 제공하는 강력한 라이브러리 중 하나.


ctypes 라이브러리에서는 cdll(), windll(),oledll() 세 가지 방법으로 동적 라이브러리를 로드할 수 있다. 


* 동적라이브러리 : 다수의 응용 프로그램들이 공유할 수 있는 기능을 별도의 바이너리 파일로 분리해

   프로세스가 실행될 때 해당 프로세스에 동적으로 링크되는 것이다. 윈도우에서는 dll,        

   리눅스에서는 so라 불리고 이들은 모두 외부에 export 함수를 제공한다.


* export : dll이 변수나 함수를 외부로 제공하는 것


cdll() 방식은 표준 cdecl 호출규약을 이용하는 함수를 익스포트하는 라이브러리를 로드하는데 쓰이고

windll()방식은 win32api가 사용하는 stdcall 호출규약을 이용하는 함수를 익스포트하는 라이브러리를 로드


ctypes 라이브러리를 import 한다음, c 런타임함수인 printf()를 이용해보자(c 런타임 라이브러리는 msvcrt.dll)



>>>form ctypes import *

>>>msvcrt = cdll.msvcrt

>>>string = "Hello World!"

>>>msvcrt.printf("%s",string)

Hello World!



함수호출규약 : 함수를 어떻게 호출하는지 방법을정의한것


cdecl 호출규약 : 파라미터(매개변수)를 오른쪽에서 왼쪽방향으로 스택에 push한다.

그리고 함수 호출자가 스택에 push된 파라미터를 정리한다. 대부분의 C 시스템에서

      사용되므로 꼭 알아두자


ex) int c_fun(a,b,c);             *C언어

   

      push c                         *어셈블리 언어

push b

push a

call c_fun

add esp,12            //int형 파라미터가 세개이므로 스택포인터레지스터(esp) 를 12바이트증가



stdcall 호출규약 : cdecl과 마찬가지로 파라미터를 오른쪽에서 왼쪽방향으로 스택에 push

 호출된 함수(예시에선 c_fun 함수)가 리턴하기 전에 스택을 정리한다.


두 호출규약 모두 EAX 레지스터를 이용해 리턴값을 전달한다.


C 데이터 타입


파이썬의 C 데이터 타입 지원으로 C나 C++로 작성된 컴포넌트와의 통합이 가능






'Study > 파이썬 해킹 프로그래밍' 카테고리의 다른 글

[2주] 03장 - 윈도우 디버거 개발 (2)  (0) 2015.01.18
[2주] 03장 - 윈도우 디버거 개발 (1)  (0) 2015.01.17
api 기초  (0) 2015.01.12
[1주] 02장-디버거  (0) 2015.01.12
점프투파이썬 정리  (0) 2015.01.12

점프투파이썬 정리

Posted by dw0rdptr
2015. 1. 12. 13:45 Study/파이썬 해킹 프로그래밍

* 글은 개인 공부정리로 쓰였기 때문에 c언어 지식을 전제로 정리했습니다

* python 3.4 기준


Python?

- 1990년 암스테르담의 귀도 반 로섬(Guido Van Rossum)에 의해 만들어짐

- 인터프리터 언어

- 인간다운 언어

- 문법이 쉬워 빠르게 학습가능

- 간결하고 강력하다


자료형

1.숫자형 

-  정수, 실수, 8진수, 16진수가 있고 파이썬에서는 복소수를 내부적으로 지원

-  복소수 관련함수


>>>a = 1+2j     #허수부분은 j로 표현
>>>a.real       #실수값 리턴
1.0
>>>a.imag      #허수값 리턴
2.0
>>>a.conjugate()    #켤레복소수 리턴
(1-2j)

*파이선에서 주석은 # 이다.

 2.숫자연산

- 다른 프로그래밍 언어와 마찬가지로 (+,-,*,/)로 사칙연산 수행

- x**y : x의 y제곱의 값을 리턴

- x%y : x를 y로 나눈 나머지값을 리턴



3.문자열


- 파이썬에서 문자열을 만드는 방법은 네가지로 구분

-"Hello World!"

-'Hello World!'

-"""Hello World!"""

-'''Hello World!'''



- 문자로써 " 나 ' 를 문자열에 포함시킬수 있는 방법은 "의 경우엔 '로 문자열을 감싸고

   ' 의 경우엔 "로 문자열을 감싼다. 다른방법으로는 \(역슬래시)를 이용한다

>>>string= "He\'s my brother"


- 여러 줄짜리 문자열 처리에는 \n(줄바꿈)을 삽입하거나 """을 이용한다




1)문자열 연산


-문자열 합치기 : +

-문자열 곱하기 : *


>>>string1 = "Hello"
>>>string2 = "Hi"
>>>print(string1 + string2*2)
HelloHiHi

2)인덱싱과 슬라이싱

- 문자열을 하나의 배열처럼 보고 인덱싱과 슬라이싱 가능

- a[0]일경우 문자열 a의 첫번째 문자를 가리킴 a[-1]은 뒤에서 첫번째 문자

- a[0:3] 은 문자열 a의 첫번째부터 3번째 문자까지 잘라냄 (0 <= a <3)

*뒤에 range 함수에서도 나오겠지만 범위를 나타내는 경우 ~이상 ~미만

- 문자열에서 문자 하나만을 바꿀경우 슬라이싱기법 이용


3)문자열 포매팅

>>>print("I am %d years old" % 18)
I am 18 years old

기본적으로 c언어의 문자열 포매팅과 같다

다른점은 %s의 경우 어떤 형태로든 에러가 나지 않고 변환이 가능하다.


4)문자열 관련 함수

변수명.upper() : 소문자->대문자 변경

변수명.lower() : 대문자->소문자 변경

변수명.count('x') : 문자 x의 개수를 셈

변수명.find('x') : 문자 x가 처음으로 나온 위치 반환 없을경우 -1 반환

변수명.index('x') : find함수와 같지만 찾는문자가 없을경우 에러발생

변수명.join('abc'): abc 각각의 문자 사이에 변수 a의 값 삽입

변수명.lstrip(), a.rstrip() : 각각 가장 왼쪽, 오른쪽의 연속된 공백을 지움

변수명.strip() : 양쪽의 연속된 공백을 모두 지움

변수명.replace(바뀔 문자열, 바꿀 문자열) : 문자열 내의 특정한 값을 다른값으로 치환

변수명.split('x') : x를 구분자로 문자열나눔. 아무런값x면 공백을 기준

변수명.swapcase : 대문자는 소문자로, 소문자는 대문자로 바꿈




3.리스트

- []로 감싸줌

- 리스트를 포함한 어떠한 자료형도 요소값으로 가질수 있다.

- 인덱싱와 슬라이싱 가능

- a = [1,2,3,[4,5,6]] 에서 5를 가리키려면 a[3][1] 또는 a[-1][-2] 로 가리킬 수 있다.

- 더하기, 곱하기(+,*) 도 가능. 문자열과 동일함

- 리스트는 요소 하나씩 수정, 삭제가 가능


리스트 관련 함수

변수명.append(x) :  마지막에 요소 x추가

변수명.sort() : 순서대로 정렬

변수명.reverse() : 순서를 역순으로 뒤집는다.

변수명.index(x) : x가 있으면 그 위치 반환

변수명.insert(x,y) :x 위치에 y 삽입

변수명.remove(x) :첫번째로 나오는 x 삭제

변수명.pop() : 맨 마지막 요소를 반환하고 그 요소 삭제

변수명.count(x) : x의 개수 반환

변수명.extend(x) :리스트 x를 더하여 확장


4.터플

- 기본적으로는 리스트와 완전히 동일

- [] 대신 ()로 둘러싸임

- 터플은 요소값을 변화시킬 수 없다.


5.딕셔너리

- {}로 둘러싸임

- 각각의 요소는 Key:Value 와 같이 쌍을 이루고있고, 쉼표로 구분됨

ex) dic = { key1:value1 , key2:value2, key3:value3}

- 리스트는 Key로 사용할 수 없음

- 중복되는 Key는 사용하지 않는게 좋다.


제어문

제어문으로는 if, while, for 가있는데, 기본문법은 여타 다른언어와 동일하다.


if문의 기본 구조


if <조건문>:

<수행할 문장1>

<수행할 문장2>

...

else:

<수행할 문장A>

<수행할 문장B>

...

*파이썬은 들여쓰기를 생략하면 문장이 실행이안되므로 유의하자


elif (C언어의 switch문)


if <조건문>:

<수행할 문장1>

<수행할 문장2>

...

elif <조건문>:

<수행할 문장A>

<수행할 문장B>

...

elif <조건문>:

<수행할 문장a>

<수행할 문장b>

...

...

else:

<수행할 문장 c>

<수행할 문장 d>

...


for문의 기본구조


for 변수 in 리스트(또는 터플, 문자열):

<수행할 문장1>

<수행할 문장2>

...


range 함수


a = range(10)   #0부터 9까지의 숫자 range 객체를 만든다 (시작번호를 지정하지 않으면 0)

a = range(2,11) # 2부터 10까지의 range 객체





입출력


함수


def 함수명(입력 인수):

<수행할 문장1>

<수행할 문장2>

...


-입력값이 몇개가 될지 모를때에는 *args를 사용한다


def 함수이름(*args):

<수행할 문장1>

...


args라는 변수가 입력값들을 모아 터플로 만들어 주기 때문에 입력값이 몇개든지 상관이 없다.


- return값은 언제나 하나이며, 함수를 종료하고 싶을 때에도 사용한다


-입력인수의 초기치를 설정할 수 있다.

def info(name,old=18)

print("나의 이름은 %s입니다." %name)

print("나이는 %d살 입니다." %old)


자주 변하지 않는 값일때는 함수선언을 할 때 초기치를 미리 설정할 수 있다.



입력과 출력


입력은 input을 사용


ex) number = input("숫자를 입력 : ")


출력은 print 사용

>>> print("Hello" "World")        #따옴표로 둘러싸인 문자열은 +연산과 동일
HelloWorld       
>>> print("Hello","World")        #문자열 사이에 콤마는 띄어쓰기
Hello World

-한 줄에 출력하려면 end 파라미터를 이용해 끝문자를 지정


파일 입력과 출력

-파일 생성하기

파일객체 = open(파일이름, 파일열기모드)


-파일 열기모드

r : 읽기모드

w : 쓰기모드

a : 추가모드

-파일 읽기


readline() : 파일의 내용을 한줄씩 읽어들임

readlines() : 파일의 모든 라인을 한꺼번에 읽어서 리스트로 반환

read() : 파일을 전부 읽어 문자열로 반환


-sys모듈 입력


도스창에서 프로그램을 실행할때 인자를 같이 주는 방식이다.


ex) #입력받은 인자를 그대로 출력

import sys


args = sys.argv[1:]

for i in args :

print(i)


클래스


클래스 : 함수나 변수들을 모아놓은 집합체

- 클래스의 구조

class 클래스이름[(상속할 클래스명)]

<클래스 변수 1>

...

def 클래스함수1(self,인수1,인수2...)

<수행할 문장1>

...

def 클래스함수2(self,인수1,인수2...)

<수행할 문장A>

...

...


- 인스턴스 : 클래스에 의해 생성된 객체

ex) cat = Animal()

cat은 객체=cat은 클래스 Animal의 객체 = cat은 클래스 Animal의 인스턴스



self 사용하기


>>>class service:
    def setname(self,name):
        self.name=name
    def sum(self,a,b):
        print("%s, %d+%d=%d" %(name,a,b,a+b))

>>>p = service
>>>p.setname("Lake")
>>>p.sum(3.6)
Lake, 3+6=9


setname은 __init__ 메소드(생성자)로 생략가능


>>>class service:
    def __init__(self,name):
        self.name=name
    def sum(self,a,b):
        print("%s, %d+%d=%d" %(name,a,b,a+b))

>>>p = service
>>>p.sum(3.6)
Lake, 3+6=9


__del__ 메서드(소멸자)는 인스턴스가 삭제되거나 종료될 때 호출된다

>>>class service:
    def __init__(self,name):
        self.name=name
    def sum(self,a,b):
        print("%s, %d+%d=%d" %(name,a,b,a+b))
    def __del__(self)
        print("bye,%s" %self.name)

>>>p = service
>>>del p
bye,Lake


모듈

모듈 :함수나 변수들, 또는 클래스들을 모아놓은 파일.다른 파이썬 프로그램에서 불러쓸 수 있음(c의 헤더파일)


# module.py
def sum(a,b):
    print("module 불러옴")
    return a+b

모듈을 추가할때는 import를 사용


>>>import module
>>>print(module.sum(2,6))
module불러옴
8


예외처리

유연한 프로그래밍을 위해선 에러처리가 필요하다

 에러처리에는 다음과 같은 방법들이 있다

# try,except만 씀
try:
    ...
except:
    ...

#발생에러만 포함한 except문
try:
    ...
except 발생에러:
    ...
 
#발생에러와 에러메시지변수까지 포함한 except문
try:
    ...
except 발생에러 as 에러메시지 변수:
    ...


'Study > 파이썬 해킹 프로그래밍' 카테고리의 다른 글

[2주] 03장 - 윈도우 디버거 개발 (2)  (0) 2015.01.18
[2주] 03장 - 윈도우 디버거 개발 (1)  (0) 2015.01.17
api 기초  (0) 2015.01.12
[1주] 02장-디버거  (0) 2015.01.12
[1주] 01장 - 개발환경 구축  (0) 2015.01.12