[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