[1주] 01장 - 개발환경 구축
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 |